blob: 40a706707bc3f3567b2f32408dc6fea801afee8d [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"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000027#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000028#include "libGLESv2/Renderbuffer.h"
29#include "libGLESv2/Shader.h"
30#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000031#include "libGLESv2/Query.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000033bool validImageSize(GLint level, GLsizei width, GLsizei height)
34{
35 if (level < 0 || width < 0 || height < 0)
36 {
37 return false;
38 }
39
40 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
41 {
42 return true;
43 }
44
45 if (level == 0)
46 {
47 return true;
48 }
49
50 if (gl::isPow2(width) && gl::isPow2(height))
51 {
52 return true;
53 }
54
55 return false;
56}
57
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000058// Verify that format/type are one of the combinations from table 3.4.
59bool checkTextureFormatType(GLenum format, GLenum type)
60{
61 // validate <format> by itself (used as secondary key below)
62 switch (format)
63 {
64 case GL_RGBA:
65 case GL_BGRA_EXT:
66 case GL_RGB:
67 case GL_ALPHA:
68 case GL_LUMINANCE:
69 case GL_LUMINANCE_ALPHA:
70 case GL_DEPTH_COMPONENT:
71 case GL_DEPTH_STENCIL_OES:
72 break;
73 default:
74 return error(GL_INVALID_ENUM, false);
75 }
76
77 // invalid <type> -> sets INVALID_ENUM
78 // invalid <format>+<type> combination -> sets INVALID_OPERATION
79 switch (type)
80 {
81 case GL_UNSIGNED_BYTE:
82 switch (format)
83 {
84 case GL_RGBA:
85 case GL_BGRA_EXT:
86 case GL_RGB:
87 case GL_ALPHA:
88 case GL_LUMINANCE:
89 case GL_LUMINANCE_ALPHA:
90 return true;
91 default:
92 return error(GL_INVALID_OPERATION, false);
93 }
94
95 case GL_FLOAT:
96 case GL_HALF_FLOAT_OES:
97 switch (format)
98 {
99 case GL_RGBA:
100 case GL_RGB:
101 case GL_ALPHA:
102 case GL_LUMINANCE:
103 case GL_LUMINANCE_ALPHA:
104 return true;
105 default:
106 return error(GL_INVALID_OPERATION, false);
107 }
108
109 case GL_UNSIGNED_SHORT_4_4_4_4:
110 case GL_UNSIGNED_SHORT_5_5_5_1:
111 switch (format)
112 {
113 case GL_RGBA:
114 return true;
115 default:
116 return error(GL_INVALID_OPERATION, false);
117 }
118
119 case GL_UNSIGNED_SHORT_5_6_5:
120 switch (format)
121 {
122 case GL_RGB:
123 return true;
124 default:
125 return error(GL_INVALID_OPERATION, false);
126 }
127
128 case GL_UNSIGNED_SHORT:
129 case GL_UNSIGNED_INT:
130 switch (format)
131 {
132 case GL_DEPTH_COMPONENT:
133 return true;
134 default:
135 return error(GL_INVALID_OPERATION, false);
136 }
137
138 case GL_UNSIGNED_INT_24_8_OES:
139 switch (format)
140 {
141 case GL_DEPTH_STENCIL_OES:
142 return true;
143 default:
144 return error(GL_INVALID_OPERATION, false);
145 }
146
147 default:
148 return error(GL_INVALID_ENUM, false);
149 }
150}
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000151bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
152 GLint xoffset, GLint yoffset, GLint level, GLenum format,
153 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000154{
155 if (!texture)
156 {
157 return error(GL_INVALID_OPERATION, false);
158 }
159
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000160 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000161 {
162 return error(GL_INVALID_OPERATION, false);
163 }
164
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000165 if (format != GL_NONE && format != texture->getInternalFormat(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000166 {
167 return error(GL_INVALID_OPERATION, false);
168 }
169
170 if (compressed)
171 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
173 (height % 4 != 0 && height != texture->getHeight(0)))
174 {
175 return error(GL_INVALID_OPERATION, false);
176 }
177 }
178
179 if (xoffset + width > texture->getWidth(level) ||
180 yoffset + height > texture->getHeight(level))
181 {
182 return error(GL_INVALID_VALUE, false);
183 }
184
185 return true;
186}
187
188bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000189 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000190 gl::TextureCubeMap *texture)
191{
192 if (!texture)
193 {
194 return error(GL_INVALID_OPERATION, false);
195 }
196
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000197 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000198 {
199 return error(GL_INVALID_OPERATION, false);
200 }
201
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000202 if (format != GL_NONE && format != texture->getInternalFormat(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000203 {
204 return error(GL_INVALID_OPERATION, false);
205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
212 return error(GL_INVALID_OPERATION, false);
213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
219 return error(GL_INVALID_VALUE, false);
220 }
221
222 return true;
223}
224
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000225// check for combinations of format and type that are valid for ReadPixels
226bool validReadFormatType(GLenum format, GLenum type)
227{
228 switch (format)
229 {
230 case GL_RGBA:
231 switch (type)
232 {
233 case GL_UNSIGNED_BYTE:
234 break;
235 default:
236 return false;
237 }
238 break;
239 case GL_BGRA_EXT:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
244 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
245 break;
246 default:
247 return false;
248 }
249 break;
250 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
251 switch (type)
252 {
253 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
254 break;
255 default:
256 return false;
257 }
258 break;
259 default:
260 return false;
261 }
262 return true;
263}
264
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265extern "C"
266{
267
268void __stdcall glActiveTexture(GLenum texture)
269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000270 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271
272 try
273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275
276 if (context)
277 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000278 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
279 {
280 return error(GL_INVALID_ENUM);
281 }
282
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000283 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000284 }
285 }
286 catch(std::bad_alloc&)
287 {
288 return error(GL_OUT_OF_MEMORY);
289 }
290}
291
292void __stdcall glAttachShader(GLuint program, GLuint shader)
293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000294 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000295
296 try
297 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000298 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299
300 if (context)
301 {
302 gl::Program *programObject = context->getProgram(program);
303 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000304
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000305 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 if (context->getShader(program))
308 {
309 return error(GL_INVALID_OPERATION);
310 }
311 else
312 {
313 return error(GL_INVALID_VALUE);
314 }
315 }
316
317 if (!shaderObject)
318 {
319 if (context->getProgram(shader))
320 {
321 return error(GL_INVALID_OPERATION);
322 }
323 else
324 {
325 return error(GL_INVALID_VALUE);
326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327 }
328
329 if (!programObject->attachShader(shaderObject))
330 {
331 return error(GL_INVALID_OPERATION);
332 }
333 }
334 }
335 catch(std::bad_alloc&)
336 {
337 return error(GL_OUT_OF_MEMORY);
338 }
339}
340
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000341void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
342{
343 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
344
345 try
346 {
347 switch (target)
348 {
349 case GL_ANY_SAMPLES_PASSED_EXT:
350 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
351 break;
352 default:
353 return error(GL_INVALID_ENUM);
354 }
355
356 if (id == 0)
357 {
358 return error(GL_INVALID_OPERATION);
359 }
360
361 gl::Context *context = gl::getNonLostContext();
362
363 if (context)
364 {
365 context->beginQuery(target, id);
366 }
367 }
368 catch(std::bad_alloc&)
369 {
370 return error(GL_OUT_OF_MEMORY);
371 }
372}
373
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000374void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000376 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377
378 try
379 {
380 if (index >= gl::MAX_VERTEX_ATTRIBS)
381 {
382 return error(GL_INVALID_VALUE);
383 }
384
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000385 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386
387 if (context)
388 {
389 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391 if (!programObject)
392 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 if (context->getShader(program))
394 {
395 return error(GL_INVALID_OPERATION);
396 }
397 else
398 {
399 return error(GL_INVALID_VALUE);
400 }
401 }
402
403 if (strncmp(name, "gl_", 3) == 0)
404 {
405 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000406 }
407
408 programObject->bindAttributeLocation(index, name);
409 }
410 }
411 catch(std::bad_alloc&)
412 {
413 return error(GL_OUT_OF_MEMORY);
414 }
415}
416
417void __stdcall glBindBuffer(GLenum target, GLuint buffer)
418{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000419 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420
421 try
422 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000423 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424
425 if (context)
426 {
427 switch (target)
428 {
429 case GL_ARRAY_BUFFER:
430 context->bindArrayBuffer(buffer);
431 return;
432 case GL_ELEMENT_ARRAY_BUFFER:
433 context->bindElementArrayBuffer(buffer);
434 return;
435 default:
436 return error(GL_INVALID_ENUM);
437 }
438 }
439 }
440 catch(std::bad_alloc&)
441 {
442 return error(GL_OUT_OF_MEMORY);
443 }
444}
445
446void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
447{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000448 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449
450 try
451 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000452 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453 {
454 return error(GL_INVALID_ENUM);
455 }
456
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000457 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000458
459 if (context)
460 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000461 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
462 {
463 context->bindReadFramebuffer(framebuffer);
464 }
465
466 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
467 {
468 context->bindDrawFramebuffer(framebuffer);
469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470 }
471 }
472 catch(std::bad_alloc&)
473 {
474 return error(GL_OUT_OF_MEMORY);
475 }
476}
477
478void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000480 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481
482 try
483 {
484 if (target != GL_RENDERBUFFER)
485 {
486 return error(GL_INVALID_ENUM);
487 }
488
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490
491 if (context)
492 {
493 context->bindRenderbuffer(renderbuffer);
494 }
495 }
496 catch(std::bad_alloc&)
497 {
498 return error(GL_OUT_OF_MEMORY);
499 }
500}
501
502void __stdcall glBindTexture(GLenum target, GLuint texture)
503{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000504 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000505
506 try
507 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000508 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509
510 if (context)
511 {
512 gl::Texture *textureObject = context->getTexture(texture);
513
514 if (textureObject && textureObject->getTarget() != target && texture != 0)
515 {
516 return error(GL_INVALID_OPERATION);
517 }
518
519 switch (target)
520 {
521 case GL_TEXTURE_2D:
522 context->bindTexture2D(texture);
523 return;
524 case GL_TEXTURE_CUBE_MAP:
525 context->bindTextureCubeMap(texture);
526 return;
527 default:
528 return error(GL_INVALID_ENUM);
529 }
530 }
531 }
532 catch(std::bad_alloc&)
533 {
534 return error(GL_OUT_OF_MEMORY);
535 }
536}
537
538void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000540 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000541 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000542
543 try
544 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000545 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546
547 if (context)
548 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000549 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550 }
551 }
552 catch(std::bad_alloc&)
553 {
554 return error(GL_OUT_OF_MEMORY);
555 }
556}
557
558void __stdcall glBlendEquation(GLenum mode)
559{
560 glBlendEquationSeparate(mode, mode);
561}
562
563void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
564{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000565 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000566
567 try
568 {
569 switch (modeRGB)
570 {
571 case GL_FUNC_ADD:
572 case GL_FUNC_SUBTRACT:
573 case GL_FUNC_REVERSE_SUBTRACT:
574 break;
575 default:
576 return error(GL_INVALID_ENUM);
577 }
578
579 switch (modeAlpha)
580 {
581 case GL_FUNC_ADD:
582 case GL_FUNC_SUBTRACT:
583 case GL_FUNC_REVERSE_SUBTRACT:
584 break;
585 default:
586 return error(GL_INVALID_ENUM);
587 }
588
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000590
591 if (context)
592 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000593 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000594 }
595 }
596 catch(std::bad_alloc&)
597 {
598 return error(GL_OUT_OF_MEMORY);
599 }
600}
601
602void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
603{
604 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
605}
606
607void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
608{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000609 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 +0000610 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000611
612 try
613 {
614 switch (srcRGB)
615 {
616 case GL_ZERO:
617 case GL_ONE:
618 case GL_SRC_COLOR:
619 case GL_ONE_MINUS_SRC_COLOR:
620 case GL_DST_COLOR:
621 case GL_ONE_MINUS_DST_COLOR:
622 case GL_SRC_ALPHA:
623 case GL_ONE_MINUS_SRC_ALPHA:
624 case GL_DST_ALPHA:
625 case GL_ONE_MINUS_DST_ALPHA:
626 case GL_CONSTANT_COLOR:
627 case GL_ONE_MINUS_CONSTANT_COLOR:
628 case GL_CONSTANT_ALPHA:
629 case GL_ONE_MINUS_CONSTANT_ALPHA:
630 case GL_SRC_ALPHA_SATURATE:
631 break;
632 default:
633 return error(GL_INVALID_ENUM);
634 }
635
636 switch (dstRGB)
637 {
638 case GL_ZERO:
639 case GL_ONE:
640 case GL_SRC_COLOR:
641 case GL_ONE_MINUS_SRC_COLOR:
642 case GL_DST_COLOR:
643 case GL_ONE_MINUS_DST_COLOR:
644 case GL_SRC_ALPHA:
645 case GL_ONE_MINUS_SRC_ALPHA:
646 case GL_DST_ALPHA:
647 case GL_ONE_MINUS_DST_ALPHA:
648 case GL_CONSTANT_COLOR:
649 case GL_ONE_MINUS_CONSTANT_COLOR:
650 case GL_CONSTANT_ALPHA:
651 case GL_ONE_MINUS_CONSTANT_ALPHA:
652 break;
653 default:
654 return error(GL_INVALID_ENUM);
655 }
656
657 switch (srcAlpha)
658 {
659 case GL_ZERO:
660 case GL_ONE:
661 case GL_SRC_COLOR:
662 case GL_ONE_MINUS_SRC_COLOR:
663 case GL_DST_COLOR:
664 case GL_ONE_MINUS_DST_COLOR:
665 case GL_SRC_ALPHA:
666 case GL_ONE_MINUS_SRC_ALPHA:
667 case GL_DST_ALPHA:
668 case GL_ONE_MINUS_DST_ALPHA:
669 case GL_CONSTANT_COLOR:
670 case GL_ONE_MINUS_CONSTANT_COLOR:
671 case GL_CONSTANT_ALPHA:
672 case GL_ONE_MINUS_CONSTANT_ALPHA:
673 case GL_SRC_ALPHA_SATURATE:
674 break;
675 default:
676 return error(GL_INVALID_ENUM);
677 }
678
679 switch (dstAlpha)
680 {
681 case GL_ZERO:
682 case GL_ONE:
683 case GL_SRC_COLOR:
684 case GL_ONE_MINUS_SRC_COLOR:
685 case GL_DST_COLOR:
686 case GL_ONE_MINUS_DST_COLOR:
687 case GL_SRC_ALPHA:
688 case GL_ONE_MINUS_SRC_ALPHA:
689 case GL_DST_ALPHA:
690 case GL_ONE_MINUS_DST_ALPHA:
691 case GL_CONSTANT_COLOR:
692 case GL_ONE_MINUS_CONSTANT_COLOR:
693 case GL_CONSTANT_ALPHA:
694 case GL_ONE_MINUS_CONSTANT_ALPHA:
695 break;
696 default:
697 return error(GL_INVALID_ENUM);
698 }
699
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000700 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
701 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
702
703 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
704 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
705
706 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000707 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000708 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
709 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000710 }
711
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000712 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000713
714 if (context)
715 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000716 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 }
718 }
719 catch(std::bad_alloc&)
720 {
721 return error(GL_OUT_OF_MEMORY);
722 }
723}
724
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000725void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000727 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 +0000728 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729
730 try
731 {
732 if (size < 0)
733 {
734 return error(GL_INVALID_VALUE);
735 }
736
737 switch (usage)
738 {
739 case GL_STREAM_DRAW:
740 case GL_STATIC_DRAW:
741 case GL_DYNAMIC_DRAW:
742 break;
743 default:
744 return error(GL_INVALID_ENUM);
745 }
746
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748
749 if (context)
750 {
751 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000752
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 switch (target)
754 {
755 case GL_ARRAY_BUFFER:
756 buffer = context->getArrayBuffer();
757 break;
758 case GL_ELEMENT_ARRAY_BUFFER:
759 buffer = context->getElementArrayBuffer();
760 break;
761 default:
762 return error(GL_INVALID_ENUM);
763 }
764
765 if (!buffer)
766 {
767 return error(GL_INVALID_OPERATION);
768 }
769
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000770 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771 }
772 }
773 catch(std::bad_alloc&)
774 {
775 return error(GL_OUT_OF_MEMORY);
776 }
777}
778
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000779void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000781 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 +0000782 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783
784 try
785 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000786 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 {
788 return error(GL_INVALID_VALUE);
789 }
790
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000791 if (data == NULL)
792 {
793 return;
794 }
795
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000796 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000797
798 if (context)
799 {
800 gl::Buffer *buffer;
801
802 switch (target)
803 {
804 case GL_ARRAY_BUFFER:
805 buffer = context->getArrayBuffer();
806 break;
807 case GL_ELEMENT_ARRAY_BUFFER:
808 buffer = context->getElementArrayBuffer();
809 break;
810 default:
811 return error(GL_INVALID_ENUM);
812 }
813
814 if (!buffer)
815 {
816 return error(GL_INVALID_OPERATION);
817 }
818
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000819 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000820 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000821 return error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000822 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000823
824 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000826 }
827 catch(std::bad_alloc&)
828 {
829 return error(GL_OUT_OF_MEMORY);
830 }
831}
832
833GLenum __stdcall glCheckFramebufferStatus(GLenum target)
834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836
837 try
838 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000839 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000840 {
841 return error(GL_INVALID_ENUM, 0);
842 }
843
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845
846 if (context)
847 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000848 gl::Framebuffer *framebuffer = NULL;
849 if (target == GL_READ_FRAMEBUFFER_ANGLE)
850 {
851 framebuffer = context->getReadFramebuffer();
852 }
853 else
854 {
855 framebuffer = context->getDrawFramebuffer();
856 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000857
858 return framebuffer->completeness();
859 }
860 }
861 catch(std::bad_alloc&)
862 {
863 return error(GL_OUT_OF_MEMORY, 0);
864 }
865
866 return 0;
867}
868
869void __stdcall glClear(GLbitfield mask)
870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000871 EVENT("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872
873 try
874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876
877 if (context)
878 {
879 context->clear(mask);
880 }
881 }
882 catch(std::bad_alloc&)
883 {
884 return error(GL_OUT_OF_MEMORY);
885 }
886}
887
888void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000890 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000891 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892
893 try
894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000896
897 if (context)
898 {
899 context->setClearColor(red, green, blue, alpha);
900 }
901 }
902 catch(std::bad_alloc&)
903 {
904 return error(GL_OUT_OF_MEMORY);
905 }
906}
907
908void __stdcall glClearDepthf(GLclampf depth)
909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000910 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911
912 try
913 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915
916 if (context)
917 {
918 context->setClearDepth(depth);
919 }
920 }
921 catch(std::bad_alloc&)
922 {
923 return error(GL_OUT_OF_MEMORY);
924 }
925}
926
927void __stdcall glClearStencil(GLint s)
928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000929 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930
931 try
932 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934
935 if (context)
936 {
937 context->setClearStencil(s);
938 }
939 }
940 catch(std::bad_alloc&)
941 {
942 return error(GL_OUT_OF_MEMORY);
943 }
944}
945
946void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000948 EVENT("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000949 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000950
951 try
952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954
955 if (context)
956 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000957 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 }
959 }
960 catch(std::bad_alloc&)
961 {
962 return error(GL_OUT_OF_MEMORY);
963 }
964}
965
966void __stdcall glCompileShader(GLuint shader)
967{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000968 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000969
970 try
971 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000972 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000973
974 if (context)
975 {
976 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000977
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000978 if (!shaderObject)
979 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000980 if (context->getProgram(shader))
981 {
982 return error(GL_INVALID_OPERATION);
983 }
984 else
985 {
986 return error(GL_INVALID_VALUE);
987 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000988 }
989
990 shaderObject->compile();
991 }
992 }
993 catch(std::bad_alloc&)
994 {
995 return error(GL_OUT_OF_MEMORY);
996 }
997}
998
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000999void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1000 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001002 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001003 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001004 target, level, internalformat, width, height, border, imageSize, data);
1005
1006 try
1007 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001008 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001009 {
1010 return error(GL_INVALID_VALUE);
1011 }
1012
daniel@transgaming.com01868132010-08-24 19:21:17 +00001013 switch (internalformat)
1014 {
1015 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1016 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001017 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1018 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001019 break;
1020 default:
1021 return error(GL_INVALID_ENUM);
1022 }
1023
1024 if (border != 0)
1025 {
1026 return error(GL_INVALID_VALUE);
1027 }
1028
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001030
1031 if (context)
1032 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001033 if (level > context->getMaximumTextureLevel())
1034 {
1035 return error(GL_INVALID_VALUE);
1036 }
1037
1038 switch (target)
1039 {
1040 case GL_TEXTURE_2D:
1041 if (width > (context->getMaximumTextureDimension() >> level) ||
1042 height > (context->getMaximumTextureDimension() >> level))
1043 {
1044 return error(GL_INVALID_VALUE);
1045 }
1046 break;
1047 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1048 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1049 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1050 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1051 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1052 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1053 if (width != height)
1054 {
1055 return error(GL_INVALID_VALUE);
1056 }
1057
1058 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1059 height > (context->getMaximumCubeTextureDimension() >> level))
1060 {
1061 return error(GL_INVALID_VALUE);
1062 }
1063 break;
1064 default:
1065 return error(GL_INVALID_ENUM);
1066 }
1067
gman@chromium.org50c526d2011-08-10 05:19:44 +00001068 switch (internalformat) {
1069 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1070 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1071 if (!context->supportsDXT1Textures())
1072 {
1073 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1074 }
1075 break;
1076 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1077 if (!context->supportsDXT3Textures())
1078 {
1079 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1080 }
1081 break;
1082 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1083 if (!context->supportsDXT5Textures())
1084 {
1085 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1086 }
1087 break;
1088 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001089 }
1090
1091 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1092 {
1093 return error(GL_INVALID_VALUE);
1094 }
1095
1096 if (target == GL_TEXTURE_2D)
1097 {
1098 gl::Texture2D *texture = context->getTexture2D();
1099
1100 if (!texture)
1101 {
1102 return error(GL_INVALID_OPERATION);
1103 }
1104
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001105 if (texture->isImmutable())
1106 {
1107 return error(GL_INVALID_OPERATION);
1108 }
1109
daniel@transgaming.com01868132010-08-24 19:21:17 +00001110 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1111 }
1112 else
1113 {
1114 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1115
1116 if (!texture)
1117 {
1118 return error(GL_INVALID_OPERATION);
1119 }
1120
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001121 if (texture->isImmutable())
1122 {
1123 return error(GL_INVALID_OPERATION);
1124 }
1125
daniel@transgaming.com01868132010-08-24 19:21:17 +00001126 switch (target)
1127 {
1128 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1129 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1130 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1131 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1132 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1133 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1134 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1135 break;
1136 default: UNREACHABLE();
1137 }
1138 }
1139 }
1140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 }
1142 catch(std::bad_alloc&)
1143 {
1144 return error(GL_OUT_OF_MEMORY);
1145 }
1146}
1147
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001148void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1149 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001151 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001152 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001153 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001154 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1155
1156 try
1157 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001158 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001159 {
1160 return error(GL_INVALID_ENUM);
1161 }
1162
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001163 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001164 {
1165 return error(GL_INVALID_VALUE);
1166 }
1167
daniel@transgaming.com01868132010-08-24 19:21:17 +00001168 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001169 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001170 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1171 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001172 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1173 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001174 break;
1175 default:
1176 return error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001177 }
1178
daniel@transgaming.com01868132010-08-24 19:21:17 +00001179 if (width == 0 || height == 0 || data == NULL)
1180 {
1181 return;
1182 }
1183
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001185
1186 if (context)
1187 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001188 if (level > context->getMaximumTextureLevel())
1189 {
1190 return error(GL_INVALID_VALUE);
1191 }
1192
gman@chromium.org50c526d2011-08-10 05:19:44 +00001193 switch (format) {
1194 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1195 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1196 if (!context->supportsDXT1Textures())
1197 {
1198 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1199 }
1200 break;
1201 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1202 if (!context->supportsDXT3Textures())
1203 {
1204 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1205 }
1206 break;
1207 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1208 if (!context->supportsDXT5Textures())
1209 {
1210 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1211 }
1212 break;
1213 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001214 }
1215
1216 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1217 {
1218 return error(GL_INVALID_VALUE);
1219 }
1220
1221 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1222 {
1223 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 +00001224 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001225 }
1226
1227 if (target == GL_TEXTURE_2D)
1228 {
1229 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001230 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001231 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001232 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001233 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001234 }
1235 else if (gl::IsCubemapTextureTarget(target))
1236 {
1237 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001238 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001239 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001240 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001241 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001242 }
1243 else
1244 {
1245 UNREACHABLE();
1246 }
1247 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248 }
1249 catch(std::bad_alloc&)
1250 {
1251 return error(GL_OUT_OF_MEMORY);
1252 }
1253}
1254
1255void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001257 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001258 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001259 target, level, internalformat, x, y, width, height, border);
1260
1261 try
1262 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001263 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001264 {
1265 return error(GL_INVALID_VALUE);
1266 }
1267
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001268 if (border != 0)
1269 {
1270 return error(GL_INVALID_VALUE);
1271 }
1272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001274
1275 if (context)
1276 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001277 if (level > context->getMaximumTextureLevel())
1278 {
1279 return error(GL_INVALID_VALUE);
1280 }
1281
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001282 switch (target)
1283 {
1284 case GL_TEXTURE_2D:
1285 if (width > (context->getMaximumTextureDimension() >> level) ||
1286 height > (context->getMaximumTextureDimension() >> level))
1287 {
1288 return error(GL_INVALID_VALUE);
1289 }
1290 break;
1291 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1292 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1293 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1294 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1295 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1296 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1297 if (width != height)
1298 {
1299 return error(GL_INVALID_VALUE);
1300 }
1301
1302 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1303 height > (context->getMaximumCubeTextureDimension() >> level))
1304 {
1305 return error(GL_INVALID_VALUE);
1306 }
1307 break;
1308 default:
1309 return error(GL_INVALID_ENUM);
1310 }
1311
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001312 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001313
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001314 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1315 {
1316 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1317 }
1318
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001319 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1320 {
1321 return error(GL_INVALID_OPERATION);
1322 }
1323
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001324 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001325 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001326
1327 // [OpenGL ES 2.0.24] table 3.9
1328 switch (internalformat)
1329 {
1330 case GL_ALPHA:
1331 if (colorbufferFormat != GL_ALPHA &&
1332 colorbufferFormat != GL_RGBA &&
1333 colorbufferFormat != GL_RGBA4 &&
1334 colorbufferFormat != GL_RGB5_A1 &&
1335 colorbufferFormat != GL_RGBA8_OES)
1336 {
1337 return error(GL_INVALID_OPERATION);
1338 }
1339 break;
1340 case GL_LUMINANCE:
1341 case GL_RGB:
1342 if (colorbufferFormat != GL_RGB &&
1343 colorbufferFormat != GL_RGB565 &&
1344 colorbufferFormat != GL_RGB8_OES &&
1345 colorbufferFormat != GL_RGBA &&
1346 colorbufferFormat != GL_RGBA4 &&
1347 colorbufferFormat != GL_RGB5_A1 &&
1348 colorbufferFormat != GL_RGBA8_OES)
1349 {
1350 return error(GL_INVALID_OPERATION);
1351 }
1352 break;
1353 case GL_LUMINANCE_ALPHA:
1354 case GL_RGBA:
1355 if (colorbufferFormat != GL_RGBA &&
1356 colorbufferFormat != GL_RGBA4 &&
1357 colorbufferFormat != GL_RGB5_A1 &&
1358 colorbufferFormat != GL_RGBA8_OES)
1359 {
1360 return error(GL_INVALID_OPERATION);
1361 }
1362 break;
1363 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1364 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001365 if (context->supportsDXT1Textures())
1366 {
1367 return error(GL_INVALID_OPERATION);
1368 }
1369 else
1370 {
1371 return error(GL_INVALID_ENUM);
1372 }
1373 break;
1374 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1375 if (context->supportsDXT3Textures())
1376 {
1377 return error(GL_INVALID_OPERATION);
1378 }
1379 else
1380 {
1381 return error(GL_INVALID_ENUM);
1382 }
1383 break;
1384 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1385 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001386 {
1387 return error(GL_INVALID_OPERATION);
1388 }
1389 else
1390 {
1391 return error(GL_INVALID_ENUM);
1392 }
1393 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001394 case GL_DEPTH_COMPONENT:
1395 case GL_DEPTH_COMPONENT16:
1396 case GL_DEPTH_COMPONENT32_OES:
1397 case GL_DEPTH_STENCIL_OES:
1398 case GL_DEPTH24_STENCIL8_OES:
1399 if (context->supportsDepthTextures())
1400 {
1401 return error(GL_INVALID_OPERATION);
1402 }
1403 else
1404 {
1405 return error(GL_INVALID_ENUM);
1406 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001407 default:
1408 return error(GL_INVALID_ENUM);
1409 }
1410
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001411 if (target == GL_TEXTURE_2D)
1412 {
1413 gl::Texture2D *texture = context->getTexture2D();
1414
1415 if (!texture)
1416 {
1417 return error(GL_INVALID_OPERATION);
1418 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001419
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001420 if (texture->isImmutable())
1421 {
1422 return error(GL_INVALID_OPERATION);
1423 }
1424
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001425 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001426 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001427 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001428 {
1429 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1430
1431 if (!texture)
1432 {
1433 return error(GL_INVALID_OPERATION);
1434 }
1435
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001436 if (texture->isImmutable())
1437 {
1438 return error(GL_INVALID_OPERATION);
1439 }
1440
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001441 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001442 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001443 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001444 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446 catch(std::bad_alloc&)
1447 {
1448 return error(GL_OUT_OF_MEMORY);
1449 }
1450}
1451
1452void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001454 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001455 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 target, level, xoffset, yoffset, x, y, width, height);
1457
1458 try
1459 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001460 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001461 {
1462 return error(GL_INVALID_ENUM);
1463 }
1464
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001465 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466 {
1467 return error(GL_INVALID_VALUE);
1468 }
1469
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001470 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1471 {
1472 return error(GL_INVALID_VALUE);
1473 }
1474
1475 if (width == 0 || height == 0)
1476 {
1477 return;
1478 }
1479
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001481
1482 if (context)
1483 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001484 if (level > context->getMaximumTextureLevel())
1485 {
1486 return error(GL_INVALID_VALUE);
1487 }
1488
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001489 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001490
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001491 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1492 {
1493 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1494 }
1495
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001496 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1497 {
1498 return error(GL_INVALID_OPERATION);
1499 }
1500
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001501 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001502 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001503 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001504 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001505
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001506 if (target == GL_TEXTURE_2D)
1507 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001508 gl::Texture2D *tex2d = context->getTexture2D();
1509
1510 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, tex2d))
1511 {
1512 return; // error already registered by validateSubImageParams
1513 }
daniel@transgaming.com92f49922012-05-09 15:49:19 +00001514 textureFormat = tex2d->getInternalFormat(level);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001515 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001516 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001517 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001518 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001519 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1520
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001521 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001522 {
1523 return; // error already registered by validateSubImageParams
1524 }
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00001525 textureFormat = texcube->getInternalFormat(target, level);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001526 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001527 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001528 else UNREACHABLE();
1529
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001530 // [OpenGL ES 2.0.24] table 3.9
1531 switch (textureFormat)
1532 {
1533 case GL_ALPHA:
1534 if (colorbufferFormat != GL_ALPHA &&
1535 colorbufferFormat != GL_RGBA &&
1536 colorbufferFormat != GL_RGBA4 &&
1537 colorbufferFormat != GL_RGB5_A1 &&
1538 colorbufferFormat != GL_RGBA8_OES)
1539 {
1540 return error(GL_INVALID_OPERATION);
1541 }
1542 break;
1543 case GL_LUMINANCE:
1544 case GL_RGB:
1545 if (colorbufferFormat != GL_RGB &&
1546 colorbufferFormat != GL_RGB565 &&
1547 colorbufferFormat != GL_RGB8_OES &&
1548 colorbufferFormat != GL_RGBA &&
1549 colorbufferFormat != GL_RGBA4 &&
1550 colorbufferFormat != GL_RGB5_A1 &&
1551 colorbufferFormat != GL_RGBA8_OES)
1552 {
1553 return error(GL_INVALID_OPERATION);
1554 }
1555 break;
1556 case GL_LUMINANCE_ALPHA:
1557 case GL_RGBA:
1558 if (colorbufferFormat != GL_RGBA &&
1559 colorbufferFormat != GL_RGBA4 &&
1560 colorbufferFormat != GL_RGB5_A1 &&
1561 colorbufferFormat != GL_RGBA8_OES)
1562 {
1563 return error(GL_INVALID_OPERATION);
1564 }
1565 break;
1566 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1567 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001568 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1569 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001570 return error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001571 case GL_DEPTH_COMPONENT:
1572 case GL_DEPTH_STENCIL_OES:
1573 return error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001574 default:
1575 return error(GL_INVALID_OPERATION);
1576 }
1577
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001578 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001579 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001580 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001581
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001582 catch(std::bad_alloc&)
1583 {
1584 return error(GL_OUT_OF_MEMORY);
1585 }
1586}
1587
1588GLuint __stdcall glCreateProgram(void)
1589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001590 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591
1592 try
1593 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001595
1596 if (context)
1597 {
1598 return context->createProgram();
1599 }
1600 }
1601 catch(std::bad_alloc&)
1602 {
1603 return error(GL_OUT_OF_MEMORY, 0);
1604 }
1605
1606 return 0;
1607}
1608
1609GLuint __stdcall glCreateShader(GLenum type)
1610{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001611 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612
1613 try
1614 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001615 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001616
1617 if (context)
1618 {
1619 switch (type)
1620 {
1621 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001622 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001623 return context->createShader(type);
1624 default:
1625 return error(GL_INVALID_ENUM, 0);
1626 }
1627 }
1628 }
1629 catch(std::bad_alloc&)
1630 {
1631 return error(GL_OUT_OF_MEMORY, 0);
1632 }
1633
1634 return 0;
1635}
1636
1637void __stdcall glCullFace(GLenum mode)
1638{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001639 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001640
1641 try
1642 {
1643 switch (mode)
1644 {
1645 case GL_FRONT:
1646 case GL_BACK:
1647 case GL_FRONT_AND_BACK:
1648 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001649 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001650
1651 if (context)
1652 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001653 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001654 }
1655 }
1656 break;
1657 default:
1658 return error(GL_INVALID_ENUM);
1659 }
1660 }
1661 catch(std::bad_alloc&)
1662 {
1663 return error(GL_OUT_OF_MEMORY);
1664 }
1665}
1666
1667void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001669 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670
1671 try
1672 {
1673 if (n < 0)
1674 {
1675 return error(GL_INVALID_VALUE);
1676 }
1677
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679
1680 if (context)
1681 {
1682 for (int i = 0; i < n; i++)
1683 {
1684 context->deleteBuffer(buffers[i]);
1685 }
1686 }
1687 }
1688 catch(std::bad_alloc&)
1689 {
1690 return error(GL_OUT_OF_MEMORY);
1691 }
1692}
1693
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001694void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1695{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001696 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001697
1698 try
1699 {
1700 if (n < 0)
1701 {
1702 return error(GL_INVALID_VALUE);
1703 }
1704
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001705 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001706
1707 if (context)
1708 {
1709 for (int i = 0; i < n; i++)
1710 {
1711 context->deleteFence(fences[i]);
1712 }
1713 }
1714 }
1715 catch(std::bad_alloc&)
1716 {
1717 return error(GL_OUT_OF_MEMORY);
1718 }
1719}
1720
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001721void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001723 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724
1725 try
1726 {
1727 if (n < 0)
1728 {
1729 return error(GL_INVALID_VALUE);
1730 }
1731
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001733
1734 if (context)
1735 {
1736 for (int i = 0; i < n; i++)
1737 {
1738 if (framebuffers[i] != 0)
1739 {
1740 context->deleteFramebuffer(framebuffers[i]);
1741 }
1742 }
1743 }
1744 }
1745 catch(std::bad_alloc&)
1746 {
1747 return error(GL_OUT_OF_MEMORY);
1748 }
1749}
1750
1751void __stdcall glDeleteProgram(GLuint program)
1752{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001753 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001754
1755 try
1756 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001757 if (program == 0)
1758 {
1759 return;
1760 }
1761
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001762 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001763
1764 if (context)
1765 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001766 if (!context->getProgram(program))
1767 {
1768 if(context->getShader(program))
1769 {
1770 return error(GL_INVALID_OPERATION);
1771 }
1772 else
1773 {
1774 return error(GL_INVALID_VALUE);
1775 }
1776 }
1777
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001778 context->deleteProgram(program);
1779 }
1780 }
1781 catch(std::bad_alloc&)
1782 {
1783 return error(GL_OUT_OF_MEMORY);
1784 }
1785}
1786
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001787void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1788{
1789 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1790
1791 try
1792 {
1793 if (n < 0)
1794 {
1795 return error(GL_INVALID_VALUE);
1796 }
1797
1798 gl::Context *context = gl::getNonLostContext();
1799
1800 if (context)
1801 {
1802 for (int i = 0; i < n; i++)
1803 {
1804 context->deleteQuery(ids[i]);
1805 }
1806 }
1807 }
1808 catch(std::bad_alloc&)
1809 {
1810 return error(GL_OUT_OF_MEMORY);
1811 }
1812}
1813
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001814void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001816 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001817
1818 try
1819 {
1820 if (n < 0)
1821 {
1822 return error(GL_INVALID_VALUE);
1823 }
1824
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001826
1827 if (context)
1828 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001829 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001830 {
1831 context->deleteRenderbuffer(renderbuffers[i]);
1832 }
1833 }
1834 }
1835 catch(std::bad_alloc&)
1836 {
1837 return error(GL_OUT_OF_MEMORY);
1838 }
1839}
1840
1841void __stdcall glDeleteShader(GLuint shader)
1842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001843 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001844
1845 try
1846 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001847 if (shader == 0)
1848 {
1849 return;
1850 }
1851
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001853
1854 if (context)
1855 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001856 if (!context->getShader(shader))
1857 {
1858 if(context->getProgram(shader))
1859 {
1860 return error(GL_INVALID_OPERATION);
1861 }
1862 else
1863 {
1864 return error(GL_INVALID_VALUE);
1865 }
1866 }
1867
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001868 context->deleteShader(shader);
1869 }
1870 }
1871 catch(std::bad_alloc&)
1872 {
1873 return error(GL_OUT_OF_MEMORY);
1874 }
1875}
1876
1877void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001879 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001880
1881 try
1882 {
1883 if (n < 0)
1884 {
1885 return error(GL_INVALID_VALUE);
1886 }
1887
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001889
1890 if (context)
1891 {
1892 for (int i = 0; i < n; i++)
1893 {
1894 if (textures[i] != 0)
1895 {
1896 context->deleteTexture(textures[i]);
1897 }
1898 }
1899 }
1900 }
1901 catch(std::bad_alloc&)
1902 {
1903 return error(GL_OUT_OF_MEMORY);
1904 }
1905}
1906
1907void __stdcall glDepthFunc(GLenum func)
1908{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001909 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001910
1911 try
1912 {
1913 switch (func)
1914 {
1915 case GL_NEVER:
1916 case GL_ALWAYS:
1917 case GL_LESS:
1918 case GL_LEQUAL:
1919 case GL_EQUAL:
1920 case GL_GREATER:
1921 case GL_GEQUAL:
1922 case GL_NOTEQUAL:
1923 break;
1924 default:
1925 return error(GL_INVALID_ENUM);
1926 }
1927
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001929
1930 if (context)
1931 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001932 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 }
1934 }
1935 catch(std::bad_alloc&)
1936 {
1937 return error(GL_OUT_OF_MEMORY);
1938 }
1939}
1940
1941void __stdcall glDepthMask(GLboolean flag)
1942{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001943 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944
1945 try
1946 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001947 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001948
1949 if (context)
1950 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001951 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952 }
1953 }
1954 catch(std::bad_alloc&)
1955 {
1956 return error(GL_OUT_OF_MEMORY);
1957 }
1958}
1959
1960void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001962 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001963
1964 try
1965 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001966 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967
1968 if (context)
1969 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001970 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 }
1972 }
1973 catch(std::bad_alloc&)
1974 {
1975 return error(GL_OUT_OF_MEMORY);
1976 }
1977}
1978
1979void __stdcall glDetachShader(GLuint program, GLuint shader)
1980{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001981 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982
1983 try
1984 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001985 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986
1987 if (context)
1988 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001989
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990 gl::Program *programObject = context->getProgram(program);
1991 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001992
1993 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001995 gl::Shader *shaderByProgramHandle;
1996 shaderByProgramHandle = context->getShader(program);
1997 if (!shaderByProgramHandle)
1998 {
1999 return error(GL_INVALID_VALUE);
2000 }
2001 else
2002 {
2003 return error(GL_INVALID_OPERATION);
2004 }
2005 }
2006
2007 if (!shaderObject)
2008 {
2009 gl::Program *programByShaderHandle = context->getProgram(shader);
2010 if (!programByShaderHandle)
2011 {
2012 return error(GL_INVALID_VALUE);
2013 }
2014 else
2015 {
2016 return error(GL_INVALID_OPERATION);
2017 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018 }
2019
2020 if (!programObject->detachShader(shaderObject))
2021 {
2022 return error(GL_INVALID_OPERATION);
2023 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024 }
2025 }
2026 catch(std::bad_alloc&)
2027 {
2028 return error(GL_OUT_OF_MEMORY);
2029 }
2030}
2031
2032void __stdcall glDisable(GLenum cap)
2033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002034 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035
2036 try
2037 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002038 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039
2040 if (context)
2041 {
2042 switch (cap)
2043 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002044 case GL_CULL_FACE: context->setCullFace(false); break;
2045 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2046 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2047 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2048 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2049 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2050 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2051 case GL_BLEND: context->setBlend(false); break;
2052 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 default:
2054 return error(GL_INVALID_ENUM);
2055 }
2056 }
2057 }
2058 catch(std::bad_alloc&)
2059 {
2060 return error(GL_OUT_OF_MEMORY);
2061 }
2062}
2063
2064void __stdcall glDisableVertexAttribArray(GLuint index)
2065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002066 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067
2068 try
2069 {
2070 if (index >= gl::MAX_VERTEX_ATTRIBS)
2071 {
2072 return error(GL_INVALID_VALUE);
2073 }
2074
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002075 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002076
2077 if (context)
2078 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002079 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002080 }
2081 }
2082 catch(std::bad_alloc&)
2083 {
2084 return error(GL_OUT_OF_MEMORY);
2085 }
2086}
2087
2088void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2089{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002090 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091
2092 try
2093 {
2094 if (count < 0 || first < 0)
2095 {
2096 return error(GL_INVALID_VALUE);
2097 }
2098
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002099 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100
2101 if (context)
2102 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002103 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002104 }
2105 }
2106 catch(std::bad_alloc&)
2107 {
2108 return error(GL_OUT_OF_MEMORY);
2109 }
2110}
2111
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002112void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2113{
2114 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2115
2116 try
2117 {
2118 if (count < 0 || first < 0 || primcount < 0)
2119 {
2120 return error(GL_INVALID_VALUE);
2121 }
2122
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002123 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002124 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002125 gl::Context *context = gl::getNonLostContext();
2126
2127 if (context)
2128 {
2129 context->drawArrays(mode, first, count, primcount);
2130 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002131 }
2132 }
2133 catch(std::bad_alloc&)
2134 {
2135 return error(GL_OUT_OF_MEMORY);
2136 }
2137}
2138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002139void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002141 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 +00002142 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002143
2144 try
2145 {
2146 if (count < 0)
2147 {
2148 return error(GL_INVALID_VALUE);
2149 }
2150
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002151 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002152
2153 if (context)
2154 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002155 switch (type)
2156 {
2157 case GL_UNSIGNED_BYTE:
2158 case GL_UNSIGNED_SHORT:
2159 break;
2160 case GL_UNSIGNED_INT:
2161 if (!context->supports32bitIndices())
2162 {
2163 return error(GL_INVALID_ENUM);
2164 }
2165 break;
2166 default:
2167 return error(GL_INVALID_ENUM);
2168 }
2169
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002170 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172 }
2173 catch(std::bad_alloc&)
2174 {
2175 return error(GL_OUT_OF_MEMORY);
2176 }
2177}
2178
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002179void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2180{
2181 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2182 mode, count, type, indices, primcount);
2183
2184 try
2185 {
2186 if (count < 0 || primcount < 0)
2187 {
2188 return error(GL_INVALID_VALUE);
2189 }
2190
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002191 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002192 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002193 gl::Context *context = gl::getNonLostContext();
2194
2195 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002196 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002197 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002198 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002199 case GL_UNSIGNED_BYTE:
2200 case GL_UNSIGNED_SHORT:
2201 break;
2202 case GL_UNSIGNED_INT:
2203 if (!context->supports32bitIndices())
2204 {
2205 return error(GL_INVALID_ENUM);
2206 }
2207 break;
2208 default:
2209 return error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002210 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002211
2212 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002213 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002214 }
2215 }
2216 catch(std::bad_alloc&)
2217 {
2218 return error(GL_OUT_OF_MEMORY);
2219 }
2220}
2221
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002222void __stdcall glEnable(GLenum cap)
2223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002224 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225
2226 try
2227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229
2230 if (context)
2231 {
2232 switch (cap)
2233 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002234 case GL_CULL_FACE: context->setCullFace(true); break;
2235 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2236 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2237 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2238 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2239 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2240 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2241 case GL_BLEND: context->setBlend(true); break;
2242 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243 default:
2244 return error(GL_INVALID_ENUM);
2245 }
2246 }
2247 }
2248 catch(std::bad_alloc&)
2249 {
2250 return error(GL_OUT_OF_MEMORY);
2251 }
2252}
2253
2254void __stdcall glEnableVertexAttribArray(GLuint index)
2255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002256 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002257
2258 try
2259 {
2260 if (index >= gl::MAX_VERTEX_ATTRIBS)
2261 {
2262 return error(GL_INVALID_VALUE);
2263 }
2264
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266
2267 if (context)
2268 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002269 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270 }
2271 }
2272 catch(std::bad_alloc&)
2273 {
2274 return error(GL_OUT_OF_MEMORY);
2275 }
2276}
2277
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002278void __stdcall glEndQueryEXT(GLenum target)
2279{
2280 EVENT("GLenum target = 0x%X)", target);
2281
2282 try
2283 {
2284 switch (target)
2285 {
2286 case GL_ANY_SAMPLES_PASSED_EXT:
2287 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2288 break;
2289 default:
2290 return error(GL_INVALID_ENUM);
2291 }
2292
2293 gl::Context *context = gl::getNonLostContext();
2294
2295 if (context)
2296 {
2297 context->endQuery(target);
2298 }
2299 }
2300 catch(std::bad_alloc&)
2301 {
2302 return error(GL_OUT_OF_MEMORY);
2303 }
2304}
2305
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002306void __stdcall glFinishFenceNV(GLuint fence)
2307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002308 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002309
2310 try
2311 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002312 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002313
2314 if (context)
2315 {
2316 gl::Fence* fenceObject = context->getFence(fence);
2317
2318 if (fenceObject == NULL)
2319 {
2320 return error(GL_INVALID_OPERATION);
2321 }
2322
2323 fenceObject->finishFence();
2324 }
2325 }
2326 catch(std::bad_alloc&)
2327 {
2328 return error(GL_OUT_OF_MEMORY);
2329 }
2330}
2331
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002332void __stdcall glFinish(void)
2333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002334 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335
2336 try
2337 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002338 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002339
2340 if (context)
2341 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002342 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343 }
2344 }
2345 catch(std::bad_alloc&)
2346 {
2347 return error(GL_OUT_OF_MEMORY);
2348 }
2349}
2350
2351void __stdcall glFlush(void)
2352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002353 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354
2355 try
2356 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002358
2359 if (context)
2360 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002361 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362 }
2363 }
2364 catch(std::bad_alloc&)
2365 {
2366 return error(GL_OUT_OF_MEMORY);
2367 }
2368}
2369
2370void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002372 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002373 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374
2375 try
2376 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002377 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002378 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379 {
2380 return error(GL_INVALID_ENUM);
2381 }
2382
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002383 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384
2385 if (context)
2386 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002387 gl::Framebuffer *framebuffer = NULL;
2388 GLuint framebufferHandle = 0;
2389 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2390 {
2391 framebuffer = context->getReadFramebuffer();
2392 framebufferHandle = context->getReadFramebufferHandle();
2393 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002394 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002395 {
2396 framebuffer = context->getDrawFramebuffer();
2397 framebufferHandle = context->getDrawFramebufferHandle();
2398 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002400 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002401 {
2402 return error(GL_INVALID_OPERATION);
2403 }
2404
2405 switch (attachment)
2406 {
2407 case GL_COLOR_ATTACHMENT0:
2408 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2409 break;
2410 case GL_DEPTH_ATTACHMENT:
2411 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2412 break;
2413 case GL_STENCIL_ATTACHMENT:
2414 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2415 break;
2416 default:
2417 return error(GL_INVALID_ENUM);
2418 }
2419 }
2420 }
2421 catch(std::bad_alloc&)
2422 {
2423 return error(GL_OUT_OF_MEMORY);
2424 }
2425}
2426
2427void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002429 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002430 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431
2432 try
2433 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002434 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002435 {
2436 return error(GL_INVALID_ENUM);
2437 }
2438
2439 switch (attachment)
2440 {
2441 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002442 case GL_DEPTH_ATTACHMENT:
2443 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 break;
2445 default:
2446 return error(GL_INVALID_ENUM);
2447 }
2448
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002449 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002450
2451 if (context)
2452 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002453 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002454 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002455 textarget = GL_NONE;
2456 }
2457 else
2458 {
2459 gl::Texture *tex = context->getTexture(texture);
2460
2461 if (tex == NULL)
2462 {
2463 return error(GL_INVALID_OPERATION);
2464 }
2465
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466 switch (textarget)
2467 {
2468 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002470 if (tex->getTarget() != GL_TEXTURE_2D)
2471 {
2472 return error(GL_INVALID_OPERATION);
2473 }
2474 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002475 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002476 {
2477 return error(GL_INVALID_OPERATION);
2478 }
2479 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002481
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002484 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002485 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002486 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002488 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002489 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2490 {
2491 return error(GL_INVALID_OPERATION);
2492 }
2493 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002494 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002495 {
2496 return error(GL_INVALID_OPERATION);
2497 }
2498 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002499 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002500
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002501 default:
2502 return error(GL_INVALID_ENUM);
2503 }
2504
2505 if (level != 0)
2506 {
2507 return error(GL_INVALID_VALUE);
2508 }
2509 }
2510
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002511 gl::Framebuffer *framebuffer = NULL;
2512 GLuint framebufferHandle = 0;
2513 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2514 {
2515 framebuffer = context->getReadFramebuffer();
2516 framebufferHandle = context->getReadFramebufferHandle();
2517 }
2518 else
2519 {
2520 framebuffer = context->getDrawFramebuffer();
2521 framebufferHandle = context->getDrawFramebufferHandle();
2522 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002524 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002525 {
2526 return error(GL_INVALID_OPERATION);
2527 }
2528
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002529 switch (attachment)
2530 {
2531 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2532 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2533 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 }
2536 }
2537 catch(std::bad_alloc&)
2538 {
2539 return error(GL_OUT_OF_MEMORY);
2540 }
2541}
2542
2543void __stdcall glFrontFace(GLenum mode)
2544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002545 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002546
2547 try
2548 {
2549 switch (mode)
2550 {
2551 case GL_CW:
2552 case GL_CCW:
2553 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555
2556 if (context)
2557 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002558 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559 }
2560 }
2561 break;
2562 default:
2563 return error(GL_INVALID_ENUM);
2564 }
2565 }
2566 catch(std::bad_alloc&)
2567 {
2568 return error(GL_OUT_OF_MEMORY);
2569 }
2570}
2571
2572void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002574 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002575
2576 try
2577 {
2578 if (n < 0)
2579 {
2580 return error(GL_INVALID_VALUE);
2581 }
2582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002584
2585 if (context)
2586 {
2587 for (int i = 0; i < n; i++)
2588 {
2589 buffers[i] = context->createBuffer();
2590 }
2591 }
2592 }
2593 catch(std::bad_alloc&)
2594 {
2595 return error(GL_OUT_OF_MEMORY);
2596 }
2597}
2598
2599void __stdcall glGenerateMipmap(GLenum target)
2600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002601 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602
2603 try
2604 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002606
2607 if (context)
2608 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002609 switch (target)
2610 {
2611 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002612 {
2613 gl::Texture2D *tex2d = context->getTexture2D();
2614
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002615 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002616 {
2617 return error(GL_INVALID_OPERATION);
2618 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002619 if (tex2d->isDepth(0))
2620 {
2621 return error(GL_INVALID_OPERATION);
2622 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002623
2624 tex2d->generateMipmaps();
2625 break;
2626 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002627
2628 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002629 {
2630 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2631
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002632 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002633 {
2634 return error(GL_INVALID_OPERATION);
2635 }
2636
2637 texcube->generateMipmaps();
2638 break;
2639 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002640
2641 default:
2642 return error(GL_INVALID_ENUM);
2643 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002644 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002645 }
2646 catch(std::bad_alloc&)
2647 {
2648 return error(GL_OUT_OF_MEMORY);
2649 }
2650}
2651
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002652void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002654 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002655
2656 try
2657 {
2658 if (n < 0)
2659 {
2660 return error(GL_INVALID_VALUE);
2661 }
2662
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002663 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002664
2665 if (context)
2666 {
2667 for (int i = 0; i < n; i++)
2668 {
2669 fences[i] = context->createFence();
2670 }
2671 }
2672 }
2673 catch(std::bad_alloc&)
2674 {
2675 return error(GL_OUT_OF_MEMORY);
2676 }
2677}
2678
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002679void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002681 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682
2683 try
2684 {
2685 if (n < 0)
2686 {
2687 return error(GL_INVALID_VALUE);
2688 }
2689
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002690 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002691
2692 if (context)
2693 {
2694 for (int i = 0; i < n; i++)
2695 {
2696 framebuffers[i] = context->createFramebuffer();
2697 }
2698 }
2699 }
2700 catch(std::bad_alloc&)
2701 {
2702 return error(GL_OUT_OF_MEMORY);
2703 }
2704}
2705
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002706void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2707{
2708 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2709
2710 try
2711 {
2712 if (n < 0)
2713 {
2714 return error(GL_INVALID_VALUE);
2715 }
2716
2717 gl::Context *context = gl::getNonLostContext();
2718
2719 if (context)
2720 {
2721 for (int i = 0; i < n; i++)
2722 {
2723 ids[i] = context->createQuery();
2724 }
2725 }
2726 }
2727 catch(std::bad_alloc&)
2728 {
2729 return error(GL_OUT_OF_MEMORY);
2730 }
2731}
2732
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2734{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002735 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002736
2737 try
2738 {
2739 if (n < 0)
2740 {
2741 return error(GL_INVALID_VALUE);
2742 }
2743
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002744 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002745
2746 if (context)
2747 {
2748 for (int i = 0; i < n; i++)
2749 {
2750 renderbuffers[i] = context->createRenderbuffer();
2751 }
2752 }
2753 }
2754 catch(std::bad_alloc&)
2755 {
2756 return error(GL_OUT_OF_MEMORY);
2757 }
2758}
2759
2760void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2761{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002762 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002763
2764 try
2765 {
2766 if (n < 0)
2767 {
2768 return error(GL_INVALID_VALUE);
2769 }
2770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002772
2773 if (context)
2774 {
2775 for (int i = 0; i < n; i++)
2776 {
2777 textures[i] = context->createTexture();
2778 }
2779 }
2780 }
2781 catch(std::bad_alloc&)
2782 {
2783 return error(GL_OUT_OF_MEMORY);
2784 }
2785}
2786
daniel@transgaming.com85423182010-04-22 13:35:27 +00002787void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002788{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002789 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002790 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002791 program, index, bufsize, length, size, type, name);
2792
2793 try
2794 {
2795 if (bufsize < 0)
2796 {
2797 return error(GL_INVALID_VALUE);
2798 }
2799
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002801
2802 if (context)
2803 {
2804 gl::Program *programObject = context->getProgram(program);
2805
2806 if (!programObject)
2807 {
2808 if (context->getShader(program))
2809 {
2810 return error(GL_INVALID_OPERATION);
2811 }
2812 else
2813 {
2814 return error(GL_INVALID_VALUE);
2815 }
2816 }
2817
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002818 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002819 {
2820 return error(GL_INVALID_VALUE);
2821 }
2822
2823 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2824 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825 }
2826 catch(std::bad_alloc&)
2827 {
2828 return error(GL_OUT_OF_MEMORY);
2829 }
2830}
2831
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002832void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002834 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002835 "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 +00002836 program, index, bufsize, length, size, type, name);
2837
2838 try
2839 {
2840 if (bufsize < 0)
2841 {
2842 return error(GL_INVALID_VALUE);
2843 }
2844
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002845 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002846
2847 if (context)
2848 {
2849 gl::Program *programObject = context->getProgram(program);
2850
2851 if (!programObject)
2852 {
2853 if (context->getShader(program))
2854 {
2855 return error(GL_INVALID_OPERATION);
2856 }
2857 else
2858 {
2859 return error(GL_INVALID_VALUE);
2860 }
2861 }
2862
2863 if (index >= (GLuint)programObject->getActiveUniformCount())
2864 {
2865 return error(GL_INVALID_VALUE);
2866 }
2867
2868 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2869 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870 }
2871 catch(std::bad_alloc&)
2872 {
2873 return error(GL_OUT_OF_MEMORY);
2874 }
2875}
2876
2877void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002879 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 +00002880 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881
2882 try
2883 {
2884 if (maxcount < 0)
2885 {
2886 return error(GL_INVALID_VALUE);
2887 }
2888
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002890
2891 if (context)
2892 {
2893 gl::Program *programObject = context->getProgram(program);
2894
2895 if (!programObject)
2896 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002897 if (context->getShader(program))
2898 {
2899 return error(GL_INVALID_OPERATION);
2900 }
2901 else
2902 {
2903 return error(GL_INVALID_VALUE);
2904 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002905 }
2906
2907 return programObject->getAttachedShaders(maxcount, count, shaders);
2908 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002909 }
2910 catch(std::bad_alloc&)
2911 {
2912 return error(GL_OUT_OF_MEMORY);
2913 }
2914}
2915
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002916int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002917{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002918 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919
2920 try
2921 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002922 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002923
2924 if (context)
2925 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002926
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927 gl::Program *programObject = context->getProgram(program);
2928
2929 if (!programObject)
2930 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002931 if (context->getShader(program))
2932 {
2933 return error(GL_INVALID_OPERATION, -1);
2934 }
2935 else
2936 {
2937 return error(GL_INVALID_VALUE, -1);
2938 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939 }
2940
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002941 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002942 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002943 {
2944 return error(GL_INVALID_OPERATION, -1);
2945 }
2946
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002947 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948 }
2949 }
2950 catch(std::bad_alloc&)
2951 {
2952 return error(GL_OUT_OF_MEMORY, -1);
2953 }
2954
2955 return -1;
2956}
2957
2958void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2959{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002960 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961
2962 try
2963 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002964 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002965
2966 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002968 if (!(context->getBooleanv(pname, params)))
2969 {
2970 GLenum nativeType;
2971 unsigned int numParams = 0;
2972 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2973 return error(GL_INVALID_ENUM);
2974
2975 if (numParams == 0)
2976 return; // it is known that the pname is valid, but there are no parameters to return
2977
2978 if (nativeType == GL_FLOAT)
2979 {
2980 GLfloat *floatParams = NULL;
2981 floatParams = new GLfloat[numParams];
2982
2983 context->getFloatv(pname, floatParams);
2984
2985 for (unsigned int i = 0; i < numParams; ++i)
2986 {
2987 if (floatParams[i] == 0.0f)
2988 params[i] = GL_FALSE;
2989 else
2990 params[i] = GL_TRUE;
2991 }
2992
2993 delete [] floatParams;
2994 }
2995 else if (nativeType == GL_INT)
2996 {
2997 GLint *intParams = NULL;
2998 intParams = new GLint[numParams];
2999
3000 context->getIntegerv(pname, intParams);
3001
3002 for (unsigned int i = 0; i < numParams; ++i)
3003 {
3004 if (intParams[i] == 0)
3005 params[i] = GL_FALSE;
3006 else
3007 params[i] = GL_TRUE;
3008 }
3009
3010 delete [] intParams;
3011 }
3012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 }
3014 }
3015 catch(std::bad_alloc&)
3016 {
3017 return error(GL_OUT_OF_MEMORY);
3018 }
3019}
3020
3021void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003023 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 +00003024
3025 try
3026 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003027 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003028
3029 if (context)
3030 {
3031 gl::Buffer *buffer;
3032
3033 switch (target)
3034 {
3035 case GL_ARRAY_BUFFER:
3036 buffer = context->getArrayBuffer();
3037 break;
3038 case GL_ELEMENT_ARRAY_BUFFER:
3039 buffer = context->getElementArrayBuffer();
3040 break;
3041 default: return error(GL_INVALID_ENUM);
3042 }
3043
3044 if (!buffer)
3045 {
3046 // A null buffer means that "0" is bound to the requested buffer target
3047 return error(GL_INVALID_OPERATION);
3048 }
3049
3050 switch (pname)
3051 {
3052 case GL_BUFFER_USAGE:
3053 *params = buffer->usage();
3054 break;
3055 case GL_BUFFER_SIZE:
3056 *params = buffer->size();
3057 break;
3058 default: return error(GL_INVALID_ENUM);
3059 }
3060 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 }
3062 catch(std::bad_alloc&)
3063 {
3064 return error(GL_OUT_OF_MEMORY);
3065 }
3066}
3067
3068GLenum __stdcall glGetError(void)
3069{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003070 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003071
3072 gl::Context *context = gl::getContext();
3073
3074 if (context)
3075 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003076 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003077 }
3078
3079 return GL_NO_ERROR;
3080}
3081
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003082void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003084 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003085
3086 try
3087 {
3088
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003089 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003090
3091 if (context)
3092 {
3093 gl::Fence *fenceObject = context->getFence(fence);
3094
3095 if (fenceObject == NULL)
3096 {
3097 return error(GL_INVALID_OPERATION);
3098 }
3099
3100 fenceObject->getFenceiv(pname, params);
3101 }
3102 }
3103 catch(std::bad_alloc&)
3104 {
3105 return error(GL_OUT_OF_MEMORY);
3106 }
3107}
3108
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003109void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3110{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003111 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003112
3113 try
3114 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003115 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003116
3117 if (context)
3118 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003119 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003120 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003121 GLenum nativeType;
3122 unsigned int numParams = 0;
3123 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3124 return error(GL_INVALID_ENUM);
3125
3126 if (numParams == 0)
3127 return; // it is known that the pname is valid, but that there are no parameters to return.
3128
3129 if (nativeType == GL_BOOL)
3130 {
3131 GLboolean *boolParams = NULL;
3132 boolParams = new GLboolean[numParams];
3133
3134 context->getBooleanv(pname, boolParams);
3135
3136 for (unsigned int i = 0; i < numParams; ++i)
3137 {
3138 if (boolParams[i] == GL_FALSE)
3139 params[i] = 0.0f;
3140 else
3141 params[i] = 1.0f;
3142 }
3143
3144 delete [] boolParams;
3145 }
3146 else if (nativeType == GL_INT)
3147 {
3148 GLint *intParams = NULL;
3149 intParams = new GLint[numParams];
3150
3151 context->getIntegerv(pname, intParams);
3152
3153 for (unsigned int i = 0; i < numParams; ++i)
3154 {
3155 params[i] = (GLfloat)intParams[i];
3156 }
3157
3158 delete [] intParams;
3159 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003160 }
3161 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162 }
3163 catch(std::bad_alloc&)
3164 {
3165 return error(GL_OUT_OF_MEMORY);
3166 }
3167}
3168
3169void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3170{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003171 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 +00003172 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173
3174 try
3175 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003177
3178 if (context)
3179 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003180 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003181 {
3182 return error(GL_INVALID_ENUM);
3183 }
3184
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003185 gl::Framebuffer *framebuffer = NULL;
3186 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3187 {
3188 if(context->getReadFramebufferHandle() == 0)
3189 {
3190 return error(GL_INVALID_OPERATION);
3191 }
3192
3193 framebuffer = context->getReadFramebuffer();
3194 }
3195 else
3196 {
3197 if (context->getDrawFramebufferHandle() == 0)
3198 {
3199 return error(GL_INVALID_OPERATION);
3200 }
3201
3202 framebuffer = context->getDrawFramebuffer();
3203 }
3204
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003205 GLenum attachmentType;
3206 GLuint attachmentHandle;
3207 switch (attachment)
3208 {
3209 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003210 attachmentType = framebuffer->getColorbufferType();
3211 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003212 break;
3213 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003214 attachmentType = framebuffer->getDepthbufferType();
3215 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003216 break;
3217 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003218 attachmentType = framebuffer->getStencilbufferType();
3219 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003220 break;
3221 default: return error(GL_INVALID_ENUM);
3222 }
3223
3224 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003225 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003226 {
3227 attachmentObjectType = attachmentType;
3228 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003229 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003230 {
3231 attachmentObjectType = GL_TEXTURE;
3232 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003233 else
3234 {
3235 UNREACHABLE();
3236 return;
3237 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003238
3239 switch (pname)
3240 {
3241 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3242 *params = attachmentObjectType;
3243 break;
3244 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3245 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3246 {
3247 *params = attachmentHandle;
3248 }
3249 else
3250 {
3251 return error(GL_INVALID_ENUM);
3252 }
3253 break;
3254 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3255 if (attachmentObjectType == GL_TEXTURE)
3256 {
3257 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3258 }
3259 else
3260 {
3261 return error(GL_INVALID_ENUM);
3262 }
3263 break;
3264 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3265 if (attachmentObjectType == GL_TEXTURE)
3266 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003267 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003268 {
3269 *params = attachmentType;
3270 }
3271 else
3272 {
3273 *params = 0;
3274 }
3275 }
3276 else
3277 {
3278 return error(GL_INVALID_ENUM);
3279 }
3280 break;
3281 default:
3282 return error(GL_INVALID_ENUM);
3283 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284 }
3285 }
3286 catch(std::bad_alloc&)
3287 {
3288 return error(GL_OUT_OF_MEMORY);
3289 }
3290}
3291
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003292GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3293{
3294 EVENT("()");
3295
3296 try
3297 {
3298 gl::Context *context = gl::getContext();
3299
3300 if (context)
3301 {
3302 return context->getResetStatus();
3303 }
3304
3305 return GL_NO_ERROR;
3306 }
3307 catch(std::bad_alloc&)
3308 {
3309 return GL_OUT_OF_MEMORY;
3310 }
3311}
3312
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003315 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316
3317 try
3318 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003319 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003320
3321 if (context)
3322 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003323 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003324 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003325 GLenum nativeType;
3326 unsigned int numParams = 0;
3327 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3328 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003330 if (numParams == 0)
3331 return; // it is known that pname is valid, but there are no parameters to return
3332
3333 if (nativeType == GL_BOOL)
3334 {
3335 GLboolean *boolParams = NULL;
3336 boolParams = new GLboolean[numParams];
3337
3338 context->getBooleanv(pname, boolParams);
3339
3340 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003341 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003342 if (boolParams[i] == GL_FALSE)
3343 params[i] = 0;
3344 else
3345 params[i] = 1;
3346 }
3347
3348 delete [] boolParams;
3349 }
3350 else if (nativeType == GL_FLOAT)
3351 {
3352 GLfloat *floatParams = NULL;
3353 floatParams = new GLfloat[numParams];
3354
3355 context->getFloatv(pname, floatParams);
3356
3357 for (unsigned int i = 0; i < numParams; ++i)
3358 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003359 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 +00003360 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003361 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003362 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003363 else
3364 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 +00003365 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003366
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003367 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003368 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003369 }
3370 }
3371 }
3372 catch(std::bad_alloc&)
3373 {
3374 return error(GL_OUT_OF_MEMORY);
3375 }
3376}
3377
3378void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3379{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003380 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003381
3382 try
3383 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385
3386 if (context)
3387 {
3388 gl::Program *programObject = context->getProgram(program);
3389
3390 if (!programObject)
3391 {
3392 return error(GL_INVALID_VALUE);
3393 }
3394
3395 switch (pname)
3396 {
3397 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003398 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003399 return;
3400 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003401 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003402 return;
3403 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003404 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405 return;
3406 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003407 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003408 return;
3409 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003410 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411 return;
3412 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003413 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003414 return;
3415 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003416 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003417 return;
3418 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003419 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420 return;
3421 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003422 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003424 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003425 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003426 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427 default:
3428 return error(GL_INVALID_ENUM);
3429 }
3430 }
3431 }
3432 catch(std::bad_alloc&)
3433 {
3434 return error(GL_OUT_OF_MEMORY);
3435 }
3436}
3437
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003438void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003439{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003440 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 +00003441 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442
3443 try
3444 {
3445 if (bufsize < 0)
3446 {
3447 return error(GL_INVALID_VALUE);
3448 }
3449
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003451
3452 if (context)
3453 {
3454 gl::Program *programObject = context->getProgram(program);
3455
3456 if (!programObject)
3457 {
3458 return error(GL_INVALID_VALUE);
3459 }
3460
3461 programObject->getInfoLog(bufsize, length, infolog);
3462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003463 }
3464 catch(std::bad_alloc&)
3465 {
3466 return error(GL_OUT_OF_MEMORY);
3467 }
3468}
3469
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003470void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3471{
3472 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3473
3474 try
3475 {
3476 switch (pname)
3477 {
3478 case GL_CURRENT_QUERY_EXT:
3479 break;
3480 default:
3481 return error(GL_INVALID_ENUM);
3482 }
3483
3484 gl::Context *context = gl::getNonLostContext();
3485
3486 if (context)
3487 {
3488 params[0] = context->getActiveQuery(target);
3489 }
3490 }
3491 catch(std::bad_alloc&)
3492 {
3493 return error(GL_OUT_OF_MEMORY);
3494 }
3495}
3496
3497void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3498{
3499 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3500
3501 try
3502 {
3503 switch (pname)
3504 {
3505 case GL_QUERY_RESULT_EXT:
3506 case GL_QUERY_RESULT_AVAILABLE_EXT:
3507 break;
3508 default:
3509 return error(GL_INVALID_ENUM);
3510 }
3511 gl::Context *context = gl::getNonLostContext();
3512
3513 if (context)
3514 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003515 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3516
3517 if (!queryObject)
3518 {
3519 return error(GL_INVALID_OPERATION);
3520 }
3521
3522 if (context->getActiveQuery(queryObject->getType()) == id)
3523 {
3524 return error(GL_INVALID_OPERATION);
3525 }
3526
3527 switch(pname)
3528 {
3529 case GL_QUERY_RESULT_EXT:
3530 params[0] = queryObject->getResult();
3531 break;
3532 case GL_QUERY_RESULT_AVAILABLE_EXT:
3533 params[0] = queryObject->isResultAvailable();
3534 break;
3535 default:
3536 ASSERT(false);
3537 }
3538 }
3539 }
3540 catch(std::bad_alloc&)
3541 {
3542 return error(GL_OUT_OF_MEMORY);
3543 }
3544}
3545
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003546void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003548 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 +00003549
3550 try
3551 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003553
3554 if (context)
3555 {
3556 if (target != GL_RENDERBUFFER)
3557 {
3558 return error(GL_INVALID_ENUM);
3559 }
3560
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003561 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003562 {
3563 return error(GL_INVALID_OPERATION);
3564 }
3565
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003566 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003567
3568 switch (pname)
3569 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003570 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3571 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3572 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3573 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3574 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3575 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3576 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3577 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3578 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003579 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003580 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003581 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003582 *params = renderbuffer->getSamples();
3583 }
3584 else
3585 {
3586 return error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003587 }
3588 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003589 default:
3590 return error(GL_INVALID_ENUM);
3591 }
3592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593 }
3594 catch(std::bad_alloc&)
3595 {
3596 return error(GL_OUT_OF_MEMORY);
3597 }
3598}
3599
3600void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003602 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003603
3604 try
3605 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003607
3608 if (context)
3609 {
3610 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003611
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003612 if (!shaderObject)
3613 {
3614 return error(GL_INVALID_VALUE);
3615 }
3616
3617 switch (pname)
3618 {
3619 case GL_SHADER_TYPE:
3620 *params = shaderObject->getType();
3621 return;
3622 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003623 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003624 return;
3625 case GL_COMPILE_STATUS:
3626 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3627 return;
3628 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003629 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630 return;
3631 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003632 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003633 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003634 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3635 *params = shaderObject->getTranslatedSourceLength();
3636 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003637 default:
3638 return error(GL_INVALID_ENUM);
3639 }
3640 }
3641 }
3642 catch(std::bad_alloc&)
3643 {
3644 return error(GL_OUT_OF_MEMORY);
3645 }
3646}
3647
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003648void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003650 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 +00003651 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003652
3653 try
3654 {
3655 if (bufsize < 0)
3656 {
3657 return error(GL_INVALID_VALUE);
3658 }
3659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003661
3662 if (context)
3663 {
3664 gl::Shader *shaderObject = context->getShader(shader);
3665
3666 if (!shaderObject)
3667 {
3668 return error(GL_INVALID_VALUE);
3669 }
3670
3671 shaderObject->getInfoLog(bufsize, length, infolog);
3672 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 }
3674 catch(std::bad_alloc&)
3675 {
3676 return error(GL_OUT_OF_MEMORY);
3677 }
3678}
3679
3680void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3681{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003682 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 +00003683 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003684
3685 try
3686 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003687 switch (shadertype)
3688 {
3689 case GL_VERTEX_SHADER:
3690 case GL_FRAGMENT_SHADER:
3691 break;
3692 default:
3693 return error(GL_INVALID_ENUM);
3694 }
3695
3696 switch (precisiontype)
3697 {
3698 case GL_LOW_FLOAT:
3699 case GL_MEDIUM_FLOAT:
3700 case GL_HIGH_FLOAT:
3701 // Assume IEEE 754 precision
3702 range[0] = 127;
3703 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003704 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003705 break;
3706 case GL_LOW_INT:
3707 case GL_MEDIUM_INT:
3708 case GL_HIGH_INT:
3709 // Some (most) hardware only supports single-precision floating-point numbers,
3710 // which can accurately represent integers up to +/-16777216
3711 range[0] = 24;
3712 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003713 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003714 break;
3715 default:
3716 return error(GL_INVALID_ENUM);
3717 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003718 }
3719 catch(std::bad_alloc&)
3720 {
3721 return error(GL_OUT_OF_MEMORY);
3722 }
3723}
3724
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003725void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003727 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 +00003728 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003729
3730 try
3731 {
3732 if (bufsize < 0)
3733 {
3734 return error(GL_INVALID_VALUE);
3735 }
3736
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003737 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003738
3739 if (context)
3740 {
3741 gl::Shader *shaderObject = context->getShader(shader);
3742
3743 if (!shaderObject)
3744 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00003745 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003746 }
3747
3748 shaderObject->getSource(bufsize, length, source);
3749 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003750 }
3751 catch(std::bad_alloc&)
3752 {
3753 return error(GL_OUT_OF_MEMORY);
3754 }
3755}
3756
zmo@google.coma574f782011-10-03 21:45:23 +00003757void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3758{
3759 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3760 shader, bufsize, length, source);
3761
3762 try
3763 {
3764 if (bufsize < 0)
3765 {
3766 return error(GL_INVALID_VALUE);
3767 }
3768
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003769 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003770
3771 if (context)
3772 {
3773 gl::Shader *shaderObject = context->getShader(shader);
3774
3775 if (!shaderObject)
3776 {
3777 return error(GL_INVALID_OPERATION);
3778 }
3779
3780 shaderObject->getTranslatedSource(bufsize, length, source);
3781 }
3782 }
3783 catch(std::bad_alloc&)
3784 {
3785 return error(GL_OUT_OF_MEMORY);
3786 }
3787}
3788
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789const GLubyte* __stdcall glGetString(GLenum name)
3790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003791 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003792
3793 try
3794 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003796
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 switch (name)
3798 {
3799 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003800 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003802 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003804 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003806 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003807 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003808 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003809 default:
3810 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
3811 }
3812 }
3813 catch(std::bad_alloc&)
3814 {
3815 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3816 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003817}
3818
3819void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003821 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 +00003822
3823 try
3824 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003826
3827 if (context)
3828 {
3829 gl::Texture *texture;
3830
3831 switch (target)
3832 {
3833 case GL_TEXTURE_2D:
3834 texture = context->getTexture2D();
3835 break;
3836 case GL_TEXTURE_CUBE_MAP:
3837 texture = context->getTextureCubeMap();
3838 break;
3839 default:
3840 return error(GL_INVALID_ENUM);
3841 }
3842
3843 switch (pname)
3844 {
3845 case GL_TEXTURE_MAG_FILTER:
3846 *params = (GLfloat)texture->getMagFilter();
3847 break;
3848 case GL_TEXTURE_MIN_FILTER:
3849 *params = (GLfloat)texture->getMinFilter();
3850 break;
3851 case GL_TEXTURE_WRAP_S:
3852 *params = (GLfloat)texture->getWrapS();
3853 break;
3854 case GL_TEXTURE_WRAP_T:
3855 *params = (GLfloat)texture->getWrapT();
3856 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003857 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3858 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3859 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003860 case GL_TEXTURE_USAGE_ANGLE:
3861 *params = (GLfloat)texture->getUsage();
3862 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003863 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3864 if (!context->supportsTextureFilterAnisotropy())
3865 {
3866 return error(GL_INVALID_ENUM);
3867 }
3868 *params = (GLfloat)texture->getMaxAnisotropy();
3869 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003870 default:
3871 return error(GL_INVALID_ENUM);
3872 }
3873 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 }
3875 catch(std::bad_alloc&)
3876 {
3877 return error(GL_OUT_OF_MEMORY);
3878 }
3879}
3880
3881void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3882{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003883 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 +00003884
3885 try
3886 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003887 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003888
3889 if (context)
3890 {
3891 gl::Texture *texture;
3892
3893 switch (target)
3894 {
3895 case GL_TEXTURE_2D:
3896 texture = context->getTexture2D();
3897 break;
3898 case GL_TEXTURE_CUBE_MAP:
3899 texture = context->getTextureCubeMap();
3900 break;
3901 default:
3902 return error(GL_INVALID_ENUM);
3903 }
3904
3905 switch (pname)
3906 {
3907 case GL_TEXTURE_MAG_FILTER:
3908 *params = texture->getMagFilter();
3909 break;
3910 case GL_TEXTURE_MIN_FILTER:
3911 *params = texture->getMinFilter();
3912 break;
3913 case GL_TEXTURE_WRAP_S:
3914 *params = texture->getWrapS();
3915 break;
3916 case GL_TEXTURE_WRAP_T:
3917 *params = texture->getWrapT();
3918 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003919 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3920 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3921 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003922 case GL_TEXTURE_USAGE_ANGLE:
3923 *params = texture->getUsage();
3924 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003925 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3926 if (!context->supportsTextureFilterAnisotropy())
3927 {
3928 return error(GL_INVALID_ENUM);
3929 }
3930 *params = (GLint)texture->getMaxAnisotropy();
3931 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003932 default:
3933 return error(GL_INVALID_ENUM);
3934 }
3935 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
3937 catch(std::bad_alloc&)
3938 {
3939 return error(GL_OUT_OF_MEMORY);
3940 }
3941}
3942
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003943void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3944{
3945 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3946 program, location, bufSize, params);
3947
3948 try
3949 {
3950 if (bufSize < 0)
3951 {
3952 return error(GL_INVALID_VALUE);
3953 }
3954
3955 gl::Context *context = gl::getNonLostContext();
3956
3957 if (context)
3958 {
3959 if (program == 0)
3960 {
3961 return error(GL_INVALID_VALUE);
3962 }
3963
3964 gl::Program *programObject = context->getProgram(program);
3965
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003966 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003967 {
3968 return error(GL_INVALID_OPERATION);
3969 }
3970
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003971 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3972 if (!programBinary)
3973 {
3974 return error(GL_INVALID_OPERATION);
3975 }
3976
3977 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003978 {
3979 return error(GL_INVALID_OPERATION);
3980 }
3981 }
3982 }
3983 catch(std::bad_alloc&)
3984 {
3985 return error(GL_OUT_OF_MEMORY);
3986 }
3987}
3988
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003989void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003991 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
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.combb3d9d02010-04-13 03:26:06 +00003996
3997 if (context)
3998 {
3999 if (program == 0)
4000 {
4001 return error(GL_INVALID_VALUE);
4002 }
4003
4004 gl::Program *programObject = context->getProgram(program);
4005
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004006 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004007 {
4008 return error(GL_INVALID_OPERATION);
4009 }
4010
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004011 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4012 if (!programBinary)
4013 {
4014 return error(GL_INVALID_OPERATION);
4015 }
4016
4017 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004018 {
4019 return error(GL_INVALID_OPERATION);
4020 }
4021 }
4022 }
4023 catch(std::bad_alloc&)
4024 {
4025 return error(GL_OUT_OF_MEMORY);
4026 }
4027}
4028
4029void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4030{
4031 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4032 program, location, bufSize, params);
4033
4034 try
4035 {
4036 if (bufSize < 0)
4037 {
4038 return error(GL_INVALID_VALUE);
4039 }
4040
4041 gl::Context *context = gl::getNonLostContext();
4042
4043 if (context)
4044 {
4045 if (program == 0)
4046 {
4047 return error(GL_INVALID_VALUE);
4048 }
4049
4050 gl::Program *programObject = context->getProgram(program);
4051
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004052 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004053 {
4054 return error(GL_INVALID_OPERATION);
4055 }
4056
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004057 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4058 if (!programBinary)
4059 {
4060 return error(GL_INVALID_OPERATION);
4061 }
4062
4063 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004064 {
4065 return error(GL_INVALID_OPERATION);
4066 }
4067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068 }
4069 catch(std::bad_alloc&)
4070 {
4071 return error(GL_OUT_OF_MEMORY);
4072 }
4073}
4074
4075void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004077 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004078
4079 try
4080 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004082
4083 if (context)
4084 {
4085 if (program == 0)
4086 {
4087 return error(GL_INVALID_VALUE);
4088 }
4089
4090 gl::Program *programObject = context->getProgram(program);
4091
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004092 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004093 {
4094 return error(GL_INVALID_OPERATION);
4095 }
4096
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004097 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4098 if (!programBinary)
4099 {
4100 return error(GL_INVALID_OPERATION);
4101 }
4102
4103 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004104 {
4105 return error(GL_INVALID_OPERATION);
4106 }
4107 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108 }
4109 catch(std::bad_alloc&)
4110 {
4111 return error(GL_OUT_OF_MEMORY);
4112 }
4113}
4114
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004115int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004116{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004117 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004118
4119 try
4120 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004121 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004122
4123 if (strstr(name, "gl_") == name)
4124 {
4125 return -1;
4126 }
4127
4128 if (context)
4129 {
4130 gl::Program *programObject = context->getProgram(program);
4131
4132 if (!programObject)
4133 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004134 if (context->getShader(program))
4135 {
4136 return error(GL_INVALID_OPERATION, -1);
4137 }
4138 else
4139 {
4140 return error(GL_INVALID_VALUE, -1);
4141 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004142 }
4143
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004144 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004145 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004146 {
4147 return error(GL_INVALID_OPERATION, -1);
4148 }
4149
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004150 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004151 }
4152 }
4153 catch(std::bad_alloc&)
4154 {
4155 return error(GL_OUT_OF_MEMORY, -1);
4156 }
4157
4158 return -1;
4159}
4160
4161void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004163 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164
4165 try
4166 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004167 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004168
daniel@transgaming.come0078962010-04-15 20:45:08 +00004169 if (context)
4170 {
4171 if (index >= gl::MAX_VERTEX_ATTRIBS)
4172 {
4173 return error(GL_INVALID_VALUE);
4174 }
4175
daniel@transgaming.com83921382011-01-08 05:46:00 +00004176 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004177
daniel@transgaming.come0078962010-04-15 20:45:08 +00004178 switch (pname)
4179 {
4180 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004181 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004182 break;
4183 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004184 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004185 break;
4186 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004187 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004188 break;
4189 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004190 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004191 break;
4192 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004193 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004194 break;
4195 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004196 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004197 break;
4198 case GL_CURRENT_VERTEX_ATTRIB:
4199 for (int i = 0; i < 4; ++i)
4200 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004201 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004202 }
4203 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004204 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4205 *params = (GLfloat)attribState.mDivisor;
4206 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004207 default: return error(GL_INVALID_ENUM);
4208 }
4209 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210 }
4211 catch(std::bad_alloc&)
4212 {
4213 return error(GL_OUT_OF_MEMORY);
4214 }
4215}
4216
4217void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004219 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220
4221 try
4222 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004224
daniel@transgaming.come0078962010-04-15 20:45:08 +00004225 if (context)
4226 {
4227 if (index >= gl::MAX_VERTEX_ATTRIBS)
4228 {
4229 return error(GL_INVALID_VALUE);
4230 }
4231
daniel@transgaming.com83921382011-01-08 05:46:00 +00004232 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004233
daniel@transgaming.come0078962010-04-15 20:45:08 +00004234 switch (pname)
4235 {
4236 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004237 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004238 break;
4239 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004240 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004241 break;
4242 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004243 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004244 break;
4245 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004246 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004247 break;
4248 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004249 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004250 break;
4251 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004252 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004253 break;
4254 case GL_CURRENT_VERTEX_ATTRIB:
4255 for (int i = 0; i < 4; ++i)
4256 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004257 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004258 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4259 }
4260 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004261 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4262 *params = (GLint)attribState.mDivisor;
4263 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004264 default: return error(GL_INVALID_ENUM);
4265 }
4266 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267 }
4268 catch(std::bad_alloc&)
4269 {
4270 return error(GL_OUT_OF_MEMORY);
4271 }
4272}
4273
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004274void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004276 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277
4278 try
4279 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004281
daniel@transgaming.come0078962010-04-15 20:45:08 +00004282 if (context)
4283 {
4284 if (index >= gl::MAX_VERTEX_ATTRIBS)
4285 {
4286 return error(GL_INVALID_VALUE);
4287 }
4288
4289 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4290 {
4291 return error(GL_INVALID_ENUM);
4292 }
4293
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004294 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004295 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004296 }
4297 catch(std::bad_alloc&)
4298 {
4299 return error(GL_OUT_OF_MEMORY);
4300 }
4301}
4302
4303void __stdcall glHint(GLenum target, GLenum mode)
4304{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004305 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306
4307 try
4308 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004309 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004310 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004311 case GL_FASTEST:
4312 case GL_NICEST:
4313 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004314 break;
4315 default:
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004316 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004317 }
4318
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004319 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004320 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004321 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004322 case GL_GENERATE_MIPMAP_HINT:
4323 if (context) context->setGenerateMipmapHint(mode);
4324 break;
4325 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4326 if (context) context->setFragmentShaderDerivativeHint(mode);
4327 break;
4328 default:
4329 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004330 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331 }
4332 catch(std::bad_alloc&)
4333 {
4334 return error(GL_OUT_OF_MEMORY);
4335 }
4336}
4337
4338GLboolean __stdcall glIsBuffer(GLuint buffer)
4339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004340 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004341
4342 try
4343 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004344 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345
4346 if (context && buffer)
4347 {
4348 gl::Buffer *bufferObject = context->getBuffer(buffer);
4349
4350 if (bufferObject)
4351 {
4352 return GL_TRUE;
4353 }
4354 }
4355 }
4356 catch(std::bad_alloc&)
4357 {
4358 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4359 }
4360
4361 return GL_FALSE;
4362}
4363
4364GLboolean __stdcall glIsEnabled(GLenum cap)
4365{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004366 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004367
4368 try
4369 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004370 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371
4372 if (context)
4373 {
4374 switch (cap)
4375 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004376 case GL_CULL_FACE: return context->isCullFaceEnabled();
4377 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4378 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4379 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4380 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4381 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4382 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4383 case GL_BLEND: return context->isBlendEnabled();
4384 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385 default:
4386 return error(GL_INVALID_ENUM, false);
4387 }
4388 }
4389 }
4390 catch(std::bad_alloc&)
4391 {
4392 return error(GL_OUT_OF_MEMORY, false);
4393 }
4394
4395 return false;
4396}
4397
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004398GLboolean __stdcall glIsFenceNV(GLuint fence)
4399{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004400 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004401
4402 try
4403 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004404 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004405
4406 if (context)
4407 {
4408 gl::Fence *fenceObject = context->getFence(fence);
4409
4410 if (fenceObject == NULL)
4411 {
4412 return GL_FALSE;
4413 }
4414
4415 return fenceObject->isFence();
4416 }
4417 }
4418 catch(std::bad_alloc&)
4419 {
4420 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4421 }
4422
4423 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004424}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004425
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004428 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429
4430 try
4431 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433
4434 if (context && framebuffer)
4435 {
4436 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4437
4438 if (framebufferObject)
4439 {
4440 return GL_TRUE;
4441 }
4442 }
4443 }
4444 catch(std::bad_alloc&)
4445 {
4446 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4447 }
4448
4449 return GL_FALSE;
4450}
4451
4452GLboolean __stdcall glIsProgram(GLuint program)
4453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004454 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004455
4456 try
4457 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004458 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004459
4460 if (context && program)
4461 {
4462 gl::Program *programObject = context->getProgram(program);
4463
4464 if (programObject)
4465 {
4466 return GL_TRUE;
4467 }
4468 }
4469 }
4470 catch(std::bad_alloc&)
4471 {
4472 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4473 }
4474
4475 return GL_FALSE;
4476}
4477
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004478GLboolean __stdcall glIsQueryEXT(GLuint id)
4479{
4480 EVENT("(GLuint id = %d)", id);
4481
4482 try
4483 {
4484 if (id == 0)
4485 {
4486 return GL_FALSE;
4487 }
4488
4489 gl::Context *context = gl::getNonLostContext();
4490
4491 if (context)
4492 {
4493 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4494
4495 if (queryObject)
4496 {
4497 return GL_TRUE;
4498 }
4499 }
4500 }
4501 catch(std::bad_alloc&)
4502 {
4503 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4504 }
4505
4506 return GL_FALSE;
4507}
4508
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004509GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004511 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512
4513 try
4514 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004515 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516
4517 if (context && renderbuffer)
4518 {
4519 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4520
4521 if (renderbufferObject)
4522 {
4523 return GL_TRUE;
4524 }
4525 }
4526 }
4527 catch(std::bad_alloc&)
4528 {
4529 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4530 }
4531
4532 return GL_FALSE;
4533}
4534
4535GLboolean __stdcall glIsShader(GLuint shader)
4536{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004537 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538
4539 try
4540 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004541 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542
4543 if (context && shader)
4544 {
4545 gl::Shader *shaderObject = context->getShader(shader);
4546
4547 if (shaderObject)
4548 {
4549 return GL_TRUE;
4550 }
4551 }
4552 }
4553 catch(std::bad_alloc&)
4554 {
4555 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4556 }
4557
4558 return GL_FALSE;
4559}
4560
4561GLboolean __stdcall glIsTexture(GLuint texture)
4562{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004563 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564
4565 try
4566 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004567 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568
4569 if (context && texture)
4570 {
4571 gl::Texture *textureObject = context->getTexture(texture);
4572
4573 if (textureObject)
4574 {
4575 return GL_TRUE;
4576 }
4577 }
4578 }
4579 catch(std::bad_alloc&)
4580 {
4581 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4582 }
4583
4584 return GL_FALSE;
4585}
4586
4587void __stdcall glLineWidth(GLfloat width)
4588{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004589 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590
4591 try
4592 {
4593 if (width <= 0.0f)
4594 {
4595 return error(GL_INVALID_VALUE);
4596 }
4597
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004598 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004599
4600 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004601 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004602 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603 }
4604 }
4605 catch(std::bad_alloc&)
4606 {
4607 return error(GL_OUT_OF_MEMORY);
4608 }
4609}
4610
4611void __stdcall glLinkProgram(GLuint program)
4612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004613 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614
4615 try
4616 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004618
4619 if (context)
4620 {
4621 gl::Program *programObject = context->getProgram(program);
4622
4623 if (!programObject)
4624 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004625 if (context->getShader(program))
4626 {
4627 return error(GL_INVALID_OPERATION);
4628 }
4629 else
4630 {
4631 return error(GL_INVALID_VALUE);
4632 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633 }
4634
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004635 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636 }
4637 }
4638 catch(std::bad_alloc&)
4639 {
4640 return error(GL_OUT_OF_MEMORY);
4641 }
4642}
4643
4644void __stdcall glPixelStorei(GLenum pname, GLint param)
4645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004646 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004647
4648 try
4649 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004650 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004651
4652 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004653 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004654 switch (pname)
4655 {
4656 case GL_UNPACK_ALIGNMENT:
4657 if (param != 1 && param != 2 && param != 4 && param != 8)
4658 {
4659 return error(GL_INVALID_VALUE);
4660 }
4661
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004662 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004663 break;
4664
4665 case GL_PACK_ALIGNMENT:
4666 if (param != 1 && param != 2 && param != 4 && param != 8)
4667 {
4668 return error(GL_INVALID_VALUE);
4669 }
4670
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004671 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004672 break;
4673
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004674 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4675 context->setPackReverseRowOrder(param != 0);
4676 break;
4677
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004678 default:
4679 return error(GL_INVALID_ENUM);
4680 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681 }
4682 }
4683 catch(std::bad_alloc&)
4684 {
4685 return error(GL_OUT_OF_MEMORY);
4686 }
4687}
4688
4689void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004691 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004692
4693 try
4694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004696
4697 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004698 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004699 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700 }
4701 }
4702 catch(std::bad_alloc&)
4703 {
4704 return error(GL_OUT_OF_MEMORY);
4705 }
4706}
4707
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004708void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4709 GLenum format, GLenum type, GLsizei bufSize,
4710 GLvoid *data)
4711{
4712 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4713 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4714 x, y, width, height, format, type, bufSize, data);
4715
4716 try
4717 {
4718 if (width < 0 || height < 0 || bufSize < 0)
4719 {
4720 return error(GL_INVALID_VALUE);
4721 }
4722
4723 if (!validReadFormatType(format, type))
4724 {
4725 return error(GL_INVALID_OPERATION);
4726 }
4727
4728 gl::Context *context = gl::getNonLostContext();
4729
4730 if (context)
4731 {
4732 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4733 }
4734 }
4735 catch(std::bad_alloc&)
4736 {
4737 return error(GL_OUT_OF_MEMORY);
4738 }
4739}
4740
4741void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4742 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004744 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004745 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004746 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747
4748 try
4749 {
4750 if (width < 0 || height < 0)
4751 {
4752 return error(GL_INVALID_VALUE);
4753 }
4754
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004755 if (!validReadFormatType(format, type))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757 return error(GL_INVALID_OPERATION);
4758 }
4759
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004760 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004761
4762 if (context)
4763 {
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004764 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765 }
4766 }
4767 catch(std::bad_alloc&)
4768 {
4769 return error(GL_OUT_OF_MEMORY);
4770 }
4771}
4772
4773void __stdcall glReleaseShaderCompiler(void)
4774{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004775 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776
4777 try
4778 {
4779 gl::Shader::releaseCompiler();
4780 }
4781 catch(std::bad_alloc&)
4782 {
4783 return error(GL_OUT_OF_MEMORY);
4784 }
4785}
4786
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004787void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004788{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004789 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 +00004790 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004791
4792 try
4793 {
4794 switch (target)
4795 {
4796 case GL_RENDERBUFFER:
4797 break;
4798 default:
4799 return error(GL_INVALID_ENUM);
4800 }
4801
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004802 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004803 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804 return error(GL_INVALID_ENUM);
4805 }
4806
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004807 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 {
4809 return error(GL_INVALID_VALUE);
4810 }
4811
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004812 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813
4814 if (context)
4815 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004816 if (width > context->getMaximumRenderbufferDimension() ||
4817 height > context->getMaximumRenderbufferDimension() ||
4818 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004819 {
4820 return error(GL_INVALID_VALUE);
4821 }
4822
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004823 GLuint handle = context->getRenderbufferHandle();
4824 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825 {
4826 return error(GL_INVALID_OPERATION);
4827 }
4828
4829 switch (internalformat)
4830 {
4831 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004832 context->setRenderbufferStorage(new gl::Depthbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004833 break;
4834 case GL_RGBA4:
4835 case GL_RGB5_A1:
4836 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004837 case GL_RGB8_OES:
4838 case GL_RGBA8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004839 context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004840 break;
4841 case GL_STENCIL_INDEX8:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004842 context->setRenderbufferStorage(new gl::Stencilbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004843 break;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004844 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004845 context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height, samples));
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004846 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 default:
4848 return error(GL_INVALID_ENUM);
4849 }
4850 }
4851 }
4852 catch(std::bad_alloc&)
4853 {
4854 return error(GL_OUT_OF_MEMORY);
4855 }
4856}
4857
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004858void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4859{
4860 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4861}
4862
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004863void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004865 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004866
4867 try
4868 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004869 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004870
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871 if (context)
4872 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004873 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004874 }
4875 }
4876 catch(std::bad_alloc&)
4877 {
4878 return error(GL_OUT_OF_MEMORY);
4879 }
4880}
4881
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004882void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004884 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004885
4886 try
4887 {
4888 if (condition != GL_ALL_COMPLETED_NV)
4889 {
4890 return error(GL_INVALID_ENUM);
4891 }
4892
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004893 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004894
4895 if (context)
4896 {
4897 gl::Fence *fenceObject = context->getFence(fence);
4898
4899 if (fenceObject == NULL)
4900 {
4901 return error(GL_INVALID_OPERATION);
4902 }
4903
4904 fenceObject->setFence(condition);
4905 }
4906 }
4907 catch(std::bad_alloc&)
4908 {
4909 return error(GL_OUT_OF_MEMORY);
4910 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004911}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004912
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004913void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4914{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004915 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 +00004916
4917 try
4918 {
4919 if (width < 0 || height < 0)
4920 {
4921 return error(GL_INVALID_VALUE);
4922 }
4923
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004924 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004925
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004926 if (context)
4927 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004928 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004929 }
4930 }
4931 catch(std::bad_alloc&)
4932 {
4933 return error(GL_OUT_OF_MEMORY);
4934 }
4935}
4936
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004937void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004938{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004939 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004940 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004941 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004942
4943 try
4944 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004945 // No binary shader formats are supported.
4946 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947 }
4948 catch(std::bad_alloc&)
4949 {
4950 return error(GL_OUT_OF_MEMORY);
4951 }
4952}
4953
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004954void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004956 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 +00004957 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004958
4959 try
4960 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004961 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 {
4963 return error(GL_INVALID_VALUE);
4964 }
4965
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004966 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004967
4968 if (context)
4969 {
4970 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004971
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004972 if (!shaderObject)
4973 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004974 if (context->getProgram(shader))
4975 {
4976 return error(GL_INVALID_OPERATION);
4977 }
4978 else
4979 {
4980 return error(GL_INVALID_VALUE);
4981 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982 }
4983
4984 shaderObject->setSource(count, string, length);
4985 }
4986 }
4987 catch(std::bad_alloc&)
4988 {
4989 return error(GL_OUT_OF_MEMORY);
4990 }
4991}
4992
4993void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4994{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004995 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004996}
4997
4998void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4999{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005000 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 +00005001
5002 try
5003 {
5004 switch (face)
5005 {
5006 case GL_FRONT:
5007 case GL_BACK:
5008 case GL_FRONT_AND_BACK:
5009 break;
5010 default:
5011 return error(GL_INVALID_ENUM);
5012 }
5013
5014 switch (func)
5015 {
5016 case GL_NEVER:
5017 case GL_ALWAYS:
5018 case GL_LESS:
5019 case GL_LEQUAL:
5020 case GL_EQUAL:
5021 case GL_GEQUAL:
5022 case GL_GREATER:
5023 case GL_NOTEQUAL:
5024 break;
5025 default:
5026 return error(GL_INVALID_ENUM);
5027 }
5028
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005030
5031 if (context)
5032 {
5033 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5034 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005035 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036 }
5037
5038 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5039 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005040 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041 }
5042 }
5043 }
5044 catch(std::bad_alloc&)
5045 {
5046 return error(GL_OUT_OF_MEMORY);
5047 }
5048}
5049
5050void __stdcall glStencilMask(GLuint mask)
5051{
5052 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5053}
5054
5055void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5056{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005057 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058
5059 try
5060 {
5061 switch (face)
5062 {
5063 case GL_FRONT:
5064 case GL_BACK:
5065 case GL_FRONT_AND_BACK:
5066 break;
5067 default:
5068 return error(GL_INVALID_ENUM);
5069 }
5070
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005072
5073 if (context)
5074 {
5075 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5076 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005077 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005078 }
5079
5080 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5081 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005082 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005083 }
5084 }
5085 }
5086 catch(std::bad_alloc&)
5087 {
5088 return error(GL_OUT_OF_MEMORY);
5089 }
5090}
5091
5092void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5093{
5094 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5095}
5096
5097void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005099 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 +00005100 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005101
5102 try
5103 {
5104 switch (face)
5105 {
5106 case GL_FRONT:
5107 case GL_BACK:
5108 case GL_FRONT_AND_BACK:
5109 break;
5110 default:
5111 return error(GL_INVALID_ENUM);
5112 }
5113
5114 switch (fail)
5115 {
5116 case GL_ZERO:
5117 case GL_KEEP:
5118 case GL_REPLACE:
5119 case GL_INCR:
5120 case GL_DECR:
5121 case GL_INVERT:
5122 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005123 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005124 break;
5125 default:
5126 return error(GL_INVALID_ENUM);
5127 }
5128
5129 switch (zfail)
5130 {
5131 case GL_ZERO:
5132 case GL_KEEP:
5133 case GL_REPLACE:
5134 case GL_INCR:
5135 case GL_DECR:
5136 case GL_INVERT:
5137 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005138 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005139 break;
5140 default:
5141 return error(GL_INVALID_ENUM);
5142 }
5143
5144 switch (zpass)
5145 {
5146 case GL_ZERO:
5147 case GL_KEEP:
5148 case GL_REPLACE:
5149 case GL_INCR:
5150 case GL_DECR:
5151 case GL_INVERT:
5152 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005153 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154 break;
5155 default:
5156 return error(GL_INVALID_ENUM);
5157 }
5158
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160
5161 if (context)
5162 {
5163 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5164 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005165 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005166 }
5167
5168 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5169 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005170 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005171 }
5172 }
5173 }
5174 catch(std::bad_alloc&)
5175 {
5176 return error(GL_OUT_OF_MEMORY);
5177 }
5178}
5179
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005180GLboolean __stdcall glTestFenceNV(GLuint fence)
5181{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005182 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005183
5184 try
5185 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005186 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005187
5188 if (context)
5189 {
5190 gl::Fence *fenceObject = context->getFence(fence);
5191
5192 if (fenceObject == NULL)
5193 {
5194 return error(GL_INVALID_OPERATION, GL_TRUE);
5195 }
5196
5197 return fenceObject->testFence();
5198 }
5199 }
5200 catch(std::bad_alloc&)
5201 {
5202 error(GL_OUT_OF_MEMORY);
5203 }
5204
5205 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005206}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005207
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005208void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5209 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005211 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 +00005212 "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 +00005213 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214
5215 try
5216 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005217 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218 {
5219 return error(GL_INVALID_VALUE);
5220 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005221
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005222 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223 {
5224 return error(GL_INVALID_OPERATION);
5225 }
5226
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005227 // validate <type> by itself (used as secondary key below)
5228 switch (type)
5229 {
5230 case GL_UNSIGNED_BYTE:
5231 case GL_UNSIGNED_SHORT_5_6_5:
5232 case GL_UNSIGNED_SHORT_4_4_4_4:
5233 case GL_UNSIGNED_SHORT_5_5_5_1:
5234 case GL_UNSIGNED_SHORT:
5235 case GL_UNSIGNED_INT:
5236 case GL_UNSIGNED_INT_24_8_OES:
5237 case GL_HALF_FLOAT_OES:
5238 case GL_FLOAT:
5239 break;
5240 default:
5241 return error(GL_INVALID_ENUM);
5242 }
5243
5244 // validate <format> + <type> combinations
5245 // - invalid <format> -> sets INVALID_ENUM
5246 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005247 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 {
5249 case GL_ALPHA:
5250 case GL_LUMINANCE:
5251 case GL_LUMINANCE_ALPHA:
5252 switch (type)
5253 {
5254 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005255 case GL_FLOAT:
5256 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257 break;
5258 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005259 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260 }
5261 break;
5262 case GL_RGB:
5263 switch (type)
5264 {
5265 case GL_UNSIGNED_BYTE:
5266 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005267 case GL_FLOAT:
5268 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005269 break;
5270 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005271 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273 break;
5274 case GL_RGBA:
5275 switch (type)
5276 {
5277 case GL_UNSIGNED_BYTE:
5278 case GL_UNSIGNED_SHORT_4_4_4_4:
5279 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005280 case GL_FLOAT:
5281 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282 break;
5283 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005284 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005285 }
5286 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005287 case GL_BGRA_EXT:
5288 switch (type)
5289 {
5290 case GL_UNSIGNED_BYTE:
5291 break;
5292 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005293 return error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005294 }
5295 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005296 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5297 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005298 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5299 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005300 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005301 case GL_DEPTH_COMPONENT:
5302 switch (type)
5303 {
5304 case GL_UNSIGNED_SHORT:
5305 case GL_UNSIGNED_INT:
5306 break;
5307 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005308 return error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005309 }
5310 break;
5311 case GL_DEPTH_STENCIL_OES:
5312 switch (type)
5313 {
5314 case GL_UNSIGNED_INT_24_8_OES:
5315 break;
5316 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005317 return error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005318 }
5319 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005320 default:
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005321 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322 }
5323
5324 if (border != 0)
5325 {
5326 return error(GL_INVALID_VALUE);
5327 }
5328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330
5331 if (context)
5332 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005333 if (level > context->getMaximumTextureLevel())
5334 {
5335 return error(GL_INVALID_VALUE);
5336 }
5337
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005338 switch (target)
5339 {
5340 case GL_TEXTURE_2D:
5341 if (width > (context->getMaximumTextureDimension() >> level) ||
5342 height > (context->getMaximumTextureDimension() >> level))
5343 {
5344 return error(GL_INVALID_VALUE);
5345 }
5346 break;
5347 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5348 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5349 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5350 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5351 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5352 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5353 if (width != height)
5354 {
5355 return error(GL_INVALID_VALUE);
5356 }
5357
5358 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5359 height > (context->getMaximumCubeTextureDimension() >> level))
5360 {
5361 return error(GL_INVALID_VALUE);
5362 }
5363 break;
5364 default:
5365 return error(GL_INVALID_ENUM);
5366 }
5367
gman@chromium.org50c526d2011-08-10 05:19:44 +00005368 switch (format) {
5369 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5370 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5371 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005372 {
5373 return error(GL_INVALID_OPERATION);
5374 }
5375 else
5376 {
5377 return error(GL_INVALID_ENUM);
5378 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005379 break;
5380 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5381 if (context->supportsDXT3Textures())
5382 {
5383 return error(GL_INVALID_OPERATION);
5384 }
5385 else
5386 {
5387 return error(GL_INVALID_ENUM);
5388 }
5389 break;
5390 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5391 if (context->supportsDXT5Textures())
5392 {
5393 return error(GL_INVALID_OPERATION);
5394 }
5395 else
5396 {
5397 return error(GL_INVALID_ENUM);
5398 }
5399 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005400 case GL_DEPTH_COMPONENT:
5401 case GL_DEPTH_STENCIL_OES:
5402 if (!context->supportsDepthTextures())
5403 {
5404 return error(GL_INVALID_VALUE);
5405 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005406 if (target != GL_TEXTURE_2D)
5407 {
5408 return error(GL_INVALID_OPERATION);
5409 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005410 // OES_depth_texture supports loading depth data and multiple levels,
5411 // but ANGLE_depth_texture does not
5412 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005413 {
5414 return error(GL_INVALID_OPERATION);
5415 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005416 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005417 default:
5418 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005419 }
5420
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005421 if (type == GL_FLOAT)
5422 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005423 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005424 {
5425 return error(GL_INVALID_ENUM);
5426 }
5427 }
5428 else if (type == GL_HALF_FLOAT_OES)
5429 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005430 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005431 {
5432 return error(GL_INVALID_ENUM);
5433 }
5434 }
5435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436 if (target == GL_TEXTURE_2D)
5437 {
5438 gl::Texture2D *texture = context->getTexture2D();
5439
5440 if (!texture)
5441 {
5442 return error(GL_INVALID_OPERATION);
5443 }
5444
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005445 if (texture->isImmutable())
5446 {
5447 return error(GL_INVALID_OPERATION);
5448 }
5449
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005450 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005451 }
5452 else
5453 {
5454 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5455
5456 if (!texture)
5457 {
5458 return error(GL_INVALID_OPERATION);
5459 }
5460
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005461 if (texture->isImmutable())
5462 {
5463 return error(GL_INVALID_OPERATION);
5464 }
5465
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 switch (target)
5467 {
5468 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005469 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 break;
5471 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005472 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005473 break;
5474 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005475 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476 break;
5477 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005478 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479 break;
5480 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005481 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005482 break;
5483 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005484 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005485 break;
5486 default: UNREACHABLE();
5487 }
5488 }
5489 }
5490 }
5491 catch(std::bad_alloc&)
5492 {
5493 return error(GL_OUT_OF_MEMORY);
5494 }
5495}
5496
5497void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5498{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005499 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5500
5501 try
5502 {
5503 gl::Context *context = gl::getNonLostContext();
5504
5505 if (context)
5506 {
5507 gl::Texture *texture;
5508
5509 switch (target)
5510 {
5511 case GL_TEXTURE_2D:
5512 texture = context->getTexture2D();
5513 break;
5514 case GL_TEXTURE_CUBE_MAP:
5515 texture = context->getTextureCubeMap();
5516 break;
5517 default:
5518 return error(GL_INVALID_ENUM);
5519 }
5520
5521 switch (pname)
5522 {
5523 case GL_TEXTURE_WRAP_S:
5524 if (!texture->setWrapS((GLenum)param))
5525 {
5526 return error(GL_INVALID_ENUM);
5527 }
5528 break;
5529 case GL_TEXTURE_WRAP_T:
5530 if (!texture->setWrapT((GLenum)param))
5531 {
5532 return error(GL_INVALID_ENUM);
5533 }
5534 break;
5535 case GL_TEXTURE_MIN_FILTER:
5536 if (!texture->setMinFilter((GLenum)param))
5537 {
5538 return error(GL_INVALID_ENUM);
5539 }
5540 break;
5541 case GL_TEXTURE_MAG_FILTER:
5542 if (!texture->setMagFilter((GLenum)param))
5543 {
5544 return error(GL_INVALID_ENUM);
5545 }
5546 break;
5547 case GL_TEXTURE_USAGE_ANGLE:
5548 if (!texture->setUsage((GLenum)param))
5549 {
5550 return error(GL_INVALID_ENUM);
5551 }
5552 break;
5553 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5554 if (!context->supportsTextureFilterAnisotropy())
5555 {
5556 return error(GL_INVALID_ENUM);
5557 }
5558 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5559 {
5560 return error(GL_INVALID_VALUE);
5561 }
5562 break;
5563 default:
5564 return error(GL_INVALID_ENUM);
5565 }
5566 }
5567 }
5568 catch(std::bad_alloc&)
5569 {
5570 return error(GL_OUT_OF_MEMORY);
5571 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572}
5573
5574void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5575{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005576 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577}
5578
5579void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005581 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005582
5583 try
5584 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005586
5587 if (context)
5588 {
5589 gl::Texture *texture;
5590
5591 switch (target)
5592 {
5593 case GL_TEXTURE_2D:
5594 texture = context->getTexture2D();
5595 break;
5596 case GL_TEXTURE_CUBE_MAP:
5597 texture = context->getTextureCubeMap();
5598 break;
5599 default:
5600 return error(GL_INVALID_ENUM);
5601 }
5602
5603 switch (pname)
5604 {
5605 case GL_TEXTURE_WRAP_S:
5606 if (!texture->setWrapS((GLenum)param))
5607 {
5608 return error(GL_INVALID_ENUM);
5609 }
5610 break;
5611 case GL_TEXTURE_WRAP_T:
5612 if (!texture->setWrapT((GLenum)param))
5613 {
5614 return error(GL_INVALID_ENUM);
5615 }
5616 break;
5617 case GL_TEXTURE_MIN_FILTER:
5618 if (!texture->setMinFilter((GLenum)param))
5619 {
5620 return error(GL_INVALID_ENUM);
5621 }
5622 break;
5623 case GL_TEXTURE_MAG_FILTER:
5624 if (!texture->setMagFilter((GLenum)param))
5625 {
5626 return error(GL_INVALID_ENUM);
5627 }
5628 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005629 case GL_TEXTURE_USAGE_ANGLE:
5630 if (!texture->setUsage((GLenum)param))
5631 {
5632 return error(GL_INVALID_ENUM);
5633 }
5634 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005635 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5636 if (!context->supportsTextureFilterAnisotropy())
5637 {
5638 return error(GL_INVALID_ENUM);
5639 }
5640 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5641 {
5642 return error(GL_INVALID_VALUE);
5643 }
5644 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 default:
5646 return error(GL_INVALID_ENUM);
5647 }
5648 }
5649 }
5650 catch(std::bad_alloc&)
5651 {
5652 return error(GL_OUT_OF_MEMORY);
5653 }
5654}
5655
5656void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5657{
5658 glTexParameteri(target, pname, *params);
5659}
5660
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005661void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5662{
5663 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5664 target, levels, internalformat, width, height);
5665
5666 try
5667 {
5668 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5669 {
5670 return error(GL_INVALID_ENUM);
5671 }
5672
5673 if (width < 1 || height < 1 || levels < 1)
5674 {
5675 return error(GL_INVALID_VALUE);
5676 }
5677
5678 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5679 {
5680 return error(GL_INVALID_VALUE);
5681 }
5682
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005683 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005684 {
5685 return error(GL_INVALID_OPERATION);
5686 }
5687
5688 GLenum format = gl::ExtractFormat(internalformat);
5689 GLenum type = gl::ExtractType(internalformat);
5690
5691 if (format == GL_NONE || type == GL_NONE)
5692 {
5693 return error(GL_INVALID_ENUM);
5694 }
5695
5696 gl::Context *context = gl::getNonLostContext();
5697
5698 if (context)
5699 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005700 switch (target)
5701 {
5702 case GL_TEXTURE_2D:
5703 if (width > context->getMaximumTextureDimension() ||
5704 height > context->getMaximumTextureDimension())
5705 {
5706 return error(GL_INVALID_VALUE);
5707 }
5708 break;
5709 case GL_TEXTURE_CUBE_MAP:
5710 if (width > context->getMaximumCubeTextureDimension() ||
5711 height > context->getMaximumCubeTextureDimension())
5712 {
5713 return error(GL_INVALID_VALUE);
5714 }
5715 break;
5716 default:
5717 return error(GL_INVALID_ENUM);
5718 }
5719
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005720 if (levels != 1 && !context->supportsNonPower2Texture())
5721 {
5722 if (!gl::isPow2(width) || !gl::isPow2(height))
5723 {
5724 return error(GL_INVALID_OPERATION);
5725 }
5726 }
5727
daniel@transgaming.come1077362011-11-11 04:16:50 +00005728 switch (internalformat)
5729 {
5730 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5731 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5732 if (!context->supportsDXT1Textures())
5733 {
5734 return error(GL_INVALID_ENUM);
5735 }
5736 break;
5737 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5738 if (!context->supportsDXT3Textures())
5739 {
5740 return error(GL_INVALID_ENUM);
5741 }
5742 break;
5743 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5744 if (!context->supportsDXT5Textures())
5745 {
5746 return error(GL_INVALID_ENUM);
5747 }
5748 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005749 case GL_RGBA32F_EXT:
5750 case GL_RGB32F_EXT:
5751 case GL_ALPHA32F_EXT:
5752 case GL_LUMINANCE32F_EXT:
5753 case GL_LUMINANCE_ALPHA32F_EXT:
5754 if (!context->supportsFloat32Textures())
5755 {
5756 return error(GL_INVALID_ENUM);
5757 }
5758 break;
5759 case GL_RGBA16F_EXT:
5760 case GL_RGB16F_EXT:
5761 case GL_ALPHA16F_EXT:
5762 case GL_LUMINANCE16F_EXT:
5763 case GL_LUMINANCE_ALPHA16F_EXT:
5764 if (!context->supportsFloat16Textures())
5765 {
5766 return error(GL_INVALID_ENUM);
5767 }
5768 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005769 case GL_DEPTH_COMPONENT16:
5770 case GL_DEPTH_COMPONENT32_OES:
5771 case GL_DEPTH24_STENCIL8_OES:
5772 if (!context->supportsDepthTextures())
5773 {
5774 return error(GL_INVALID_ENUM);
5775 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005776 if (target != GL_TEXTURE_2D)
5777 {
5778 return error(GL_INVALID_OPERATION);
5779 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005780 // ANGLE_depth_texture only supports 1-level textures
5781 if (levels != 1)
5782 {
5783 return error(GL_INVALID_OPERATION);
5784 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005785 break;
5786 default:
5787 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005788 }
5789
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005790 if (target == GL_TEXTURE_2D)
5791 {
5792 gl::Texture2D *texture = context->getTexture2D();
5793
5794 if (!texture || texture->id() == 0)
5795 {
5796 return error(GL_INVALID_OPERATION);
5797 }
5798
5799 if (texture->isImmutable())
5800 {
5801 return error(GL_INVALID_OPERATION);
5802 }
5803
5804 texture->storage(levels, internalformat, width, height);
5805 }
5806 else if (target == GL_TEXTURE_CUBE_MAP)
5807 {
5808 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5809
5810 if (!texture || texture->id() == 0)
5811 {
5812 return error(GL_INVALID_OPERATION);
5813 }
5814
5815 if (texture->isImmutable())
5816 {
5817 return error(GL_INVALID_OPERATION);
5818 }
5819
5820 texture->storage(levels, internalformat, width);
5821 }
5822 else UNREACHABLE();
5823 }
5824 }
5825 catch(std::bad_alloc&)
5826 {
5827 return error(GL_OUT_OF_MEMORY);
5828 }
5829}
5830
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005831void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5832 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005834 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005835 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005836 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005837 target, level, xoffset, yoffset, width, height, format, type, pixels);
5838
5839 try
5840 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005841 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005842 {
5843 return error(GL_INVALID_ENUM);
5844 }
5845
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005846 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 {
5848 return error(GL_INVALID_VALUE);
5849 }
5850
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005851 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5852 {
5853 return error(GL_INVALID_VALUE);
5854 }
5855
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005856 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005857 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005858 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005859 }
5860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005862
5863 if (context)
5864 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005865 if (level > context->getMaximumTextureLevel())
5866 {
5867 return error(GL_INVALID_VALUE);
5868 }
5869
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005870 if (format == GL_FLOAT)
5871 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005872 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005873 {
5874 return error(GL_INVALID_ENUM);
5875 }
5876 }
5877 else if (format == GL_HALF_FLOAT_OES)
5878 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005879 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005880 {
5881 return error(GL_INVALID_ENUM);
5882 }
5883 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005884 else if (gl::IsDepthTexture(format))
5885 {
5886 if (!context->supportsDepthTextures())
5887 {
5888 return error(GL_INVALID_ENUM);
5889 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005890 if (target != GL_TEXTURE_2D)
5891 {
5892 return error(GL_INVALID_OPERATION);
5893 }
5894 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
5895 return error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005896 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005897
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005898 if (width == 0 || height == 0 || pixels == NULL)
5899 {
5900 return;
5901 }
5902
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005903 if (target == GL_TEXTURE_2D)
5904 {
5905 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00005906 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005907 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005908 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005909 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005910 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005911 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005912 {
5913 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00005914 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005915 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005916 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005917 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005918 }
5919 else
5920 {
5921 UNREACHABLE();
5922 }
5923 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924 }
5925 catch(std::bad_alloc&)
5926 {
5927 return error(GL_OUT_OF_MEMORY);
5928 }
5929}
5930
5931void __stdcall glUniform1f(GLint location, GLfloat x)
5932{
5933 glUniform1fv(location, 1, &x);
5934}
5935
5936void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005938 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005939
5940 try
5941 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005942 if (count < 0)
5943 {
5944 return error(GL_INVALID_VALUE);
5945 }
5946
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005947 if (location == -1)
5948 {
5949 return;
5950 }
5951
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953
5954 if (context)
5955 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005956 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005957 if (!programBinary)
5958 {
5959 return error(GL_INVALID_OPERATION);
5960 }
5961
5962 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005963 {
5964 return error(GL_INVALID_OPERATION);
5965 }
5966 }
5967 }
5968 catch(std::bad_alloc&)
5969 {
5970 return error(GL_OUT_OF_MEMORY);
5971 }
5972}
5973
5974void __stdcall glUniform1i(GLint location, GLint x)
5975{
5976 glUniform1iv(location, 1, &x);
5977}
5978
5979void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5980{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005981 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005982
5983 try
5984 {
5985 if (count < 0)
5986 {
5987 return error(GL_INVALID_VALUE);
5988 }
5989
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005990 if (location == -1)
5991 {
5992 return;
5993 }
5994
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005996
5997 if (context)
5998 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005999 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006000 if (!programBinary)
6001 {
6002 return error(GL_INVALID_OPERATION);
6003 }
6004
6005 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006006 {
6007 return error(GL_INVALID_OPERATION);
6008 }
6009 }
6010 }
6011 catch(std::bad_alloc&)
6012 {
6013 return error(GL_OUT_OF_MEMORY);
6014 }
6015}
6016
6017void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6018{
6019 GLfloat xy[2] = {x, y};
6020
6021 glUniform2fv(location, 1, (GLfloat*)&xy);
6022}
6023
6024void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006026 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006027
6028 try
6029 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006030 if (count < 0)
6031 {
6032 return error(GL_INVALID_VALUE);
6033 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006034
6035 if (location == -1)
6036 {
6037 return;
6038 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006040 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041
6042 if (context)
6043 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006044 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006045 if (!programBinary)
6046 {
6047 return error(GL_INVALID_OPERATION);
6048 }
6049
6050 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 {
6052 return error(GL_INVALID_OPERATION);
6053 }
6054 }
6055 }
6056 catch(std::bad_alloc&)
6057 {
6058 return error(GL_OUT_OF_MEMORY);
6059 }
6060}
6061
6062void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6063{
6064 GLint xy[4] = {x, y};
6065
6066 glUniform2iv(location, 1, (GLint*)&xy);
6067}
6068
6069void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6070{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006071 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006072
6073 try
6074 {
6075 if (count < 0)
6076 {
6077 return error(GL_INVALID_VALUE);
6078 }
6079
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006080 if (location == -1)
6081 {
6082 return;
6083 }
6084
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006086
6087 if (context)
6088 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006089 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006090 if (!programBinary)
6091 {
6092 return error(GL_INVALID_OPERATION);
6093 }
6094
6095 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006096 {
6097 return error(GL_INVALID_OPERATION);
6098 }
6099 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100 }
6101 catch(std::bad_alloc&)
6102 {
6103 return error(GL_OUT_OF_MEMORY);
6104 }
6105}
6106
6107void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6108{
6109 GLfloat xyz[3] = {x, y, z};
6110
6111 glUniform3fv(location, 1, (GLfloat*)&xyz);
6112}
6113
6114void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006116 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006117
6118 try
6119 {
6120 if (count < 0)
6121 {
6122 return error(GL_INVALID_VALUE);
6123 }
6124
6125 if (location == -1)
6126 {
6127 return;
6128 }
6129
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006130 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006131
6132 if (context)
6133 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006134 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006135 if (!programBinary)
6136 {
6137 return error(GL_INVALID_OPERATION);
6138 }
6139
6140 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006141 {
6142 return error(GL_INVALID_OPERATION);
6143 }
6144 }
6145 }
6146 catch(std::bad_alloc&)
6147 {
6148 return error(GL_OUT_OF_MEMORY);
6149 }
6150}
6151
6152void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6153{
6154 GLint xyz[3] = {x, y, z};
6155
6156 glUniform3iv(location, 1, (GLint*)&xyz);
6157}
6158
6159void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006161 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006162
6163 try
6164 {
6165 if (count < 0)
6166 {
6167 return error(GL_INVALID_VALUE);
6168 }
6169
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006170 if (location == -1)
6171 {
6172 return;
6173 }
6174
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006175 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006176
6177 if (context)
6178 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006179 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006180 if (!programBinary)
6181 {
6182 return error(GL_INVALID_OPERATION);
6183 }
6184
6185 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006186 {
6187 return error(GL_INVALID_OPERATION);
6188 }
6189 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006190 }
6191 catch(std::bad_alloc&)
6192 {
6193 return error(GL_OUT_OF_MEMORY);
6194 }
6195}
6196
6197void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6198{
6199 GLfloat xyzw[4] = {x, y, z, w};
6200
6201 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6202}
6203
6204void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006206 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006207
6208 try
6209 {
6210 if (count < 0)
6211 {
6212 return error(GL_INVALID_VALUE);
6213 }
6214
6215 if (location == -1)
6216 {
6217 return;
6218 }
6219
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006221
6222 if (context)
6223 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006224 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006225 if (!programBinary)
6226 {
6227 return error(GL_INVALID_OPERATION);
6228 }
6229
6230 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006231 {
6232 return error(GL_INVALID_OPERATION);
6233 }
6234 }
6235 }
6236 catch(std::bad_alloc&)
6237 {
6238 return error(GL_OUT_OF_MEMORY);
6239 }
6240}
6241
6242void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6243{
6244 GLint xyzw[4] = {x, y, z, w};
6245
6246 glUniform4iv(location, 1, (GLint*)&xyzw);
6247}
6248
6249void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6250{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006251 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006252
6253 try
6254 {
6255 if (count < 0)
6256 {
6257 return error(GL_INVALID_VALUE);
6258 }
6259
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006260 if (location == -1)
6261 {
6262 return;
6263 }
6264
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006266
6267 if (context)
6268 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006269 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006270 if (!programBinary)
6271 {
6272 return error(GL_INVALID_OPERATION);
6273 }
6274
6275 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006276 {
6277 return error(GL_INVALID_OPERATION);
6278 }
6279 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006280 }
6281 catch(std::bad_alloc&)
6282 {
6283 return error(GL_OUT_OF_MEMORY);
6284 }
6285}
6286
6287void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006289 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006290 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006291
6292 try
6293 {
6294 if (count < 0 || transpose != GL_FALSE)
6295 {
6296 return error(GL_INVALID_VALUE);
6297 }
6298
6299 if (location == -1)
6300 {
6301 return;
6302 }
6303
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006304 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006305
6306 if (context)
6307 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006308 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006309 if (!programBinary)
6310 {
6311 return error(GL_INVALID_OPERATION);
6312 }
6313
6314 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006315 {
6316 return error(GL_INVALID_OPERATION);
6317 }
6318 }
6319 }
6320 catch(std::bad_alloc&)
6321 {
6322 return error(GL_OUT_OF_MEMORY);
6323 }
6324}
6325
6326void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006328 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006329 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006330
6331 try
6332 {
6333 if (count < 0 || transpose != GL_FALSE)
6334 {
6335 return error(GL_INVALID_VALUE);
6336 }
6337
6338 if (location == -1)
6339 {
6340 return;
6341 }
6342
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006344
6345 if (context)
6346 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006347 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006348 if (!programBinary)
6349 {
6350 return error(GL_INVALID_OPERATION);
6351 }
6352
6353 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006354 {
6355 return error(GL_INVALID_OPERATION);
6356 }
6357 }
6358 }
6359 catch(std::bad_alloc&)
6360 {
6361 return error(GL_OUT_OF_MEMORY);
6362 }
6363}
6364
6365void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006367 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006368 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006369
6370 try
6371 {
6372 if (count < 0 || transpose != GL_FALSE)
6373 {
6374 return error(GL_INVALID_VALUE);
6375 }
6376
6377 if (location == -1)
6378 {
6379 return;
6380 }
6381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006383
6384 if (context)
6385 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006386 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006387 if (!programBinary)
6388 {
6389 return error(GL_INVALID_OPERATION);
6390 }
6391
6392 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006393 {
6394 return error(GL_INVALID_OPERATION);
6395 }
6396 }
6397 }
6398 catch(std::bad_alloc&)
6399 {
6400 return error(GL_OUT_OF_MEMORY);
6401 }
6402}
6403
6404void __stdcall glUseProgram(GLuint program)
6405{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006406 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006407
6408 try
6409 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006411
6412 if (context)
6413 {
6414 gl::Program *programObject = context->getProgram(program);
6415
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006416 if (!programObject && program != 0)
6417 {
6418 if (context->getShader(program))
6419 {
6420 return error(GL_INVALID_OPERATION);
6421 }
6422 else
6423 {
6424 return error(GL_INVALID_VALUE);
6425 }
6426 }
6427
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006428 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006429 {
6430 return error(GL_INVALID_OPERATION);
6431 }
6432
6433 context->useProgram(program);
6434 }
6435 }
6436 catch(std::bad_alloc&)
6437 {
6438 return error(GL_OUT_OF_MEMORY);
6439 }
6440}
6441
6442void __stdcall glValidateProgram(GLuint program)
6443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006444 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006445
6446 try
6447 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006449
6450 if (context)
6451 {
6452 gl::Program *programObject = context->getProgram(program);
6453
6454 if (!programObject)
6455 {
6456 if (context->getShader(program))
6457 {
6458 return error(GL_INVALID_OPERATION);
6459 }
6460 else
6461 {
6462 return error(GL_INVALID_VALUE);
6463 }
6464 }
6465
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006466 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006467 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006468 }
6469 catch(std::bad_alloc&)
6470 {
6471 return error(GL_OUT_OF_MEMORY);
6472 }
6473}
6474
6475void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006477 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006478
6479 try
6480 {
6481 if (index >= gl::MAX_VERTEX_ATTRIBS)
6482 {
6483 return error(GL_INVALID_VALUE);
6484 }
6485
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006486 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006487
6488 if (context)
6489 {
6490 GLfloat vals[4] = { x, 0, 0, 1 };
6491 context->setVertexAttrib(index, vals);
6492 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006493 }
6494 catch(std::bad_alloc&)
6495 {
6496 return error(GL_OUT_OF_MEMORY);
6497 }
6498}
6499
6500void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6501{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006502 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006503
6504 try
6505 {
6506 if (index >= gl::MAX_VERTEX_ATTRIBS)
6507 {
6508 return error(GL_INVALID_VALUE);
6509 }
6510
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006512
6513 if (context)
6514 {
6515 GLfloat vals[4] = { values[0], 0, 0, 1 };
6516 context->setVertexAttrib(index, vals);
6517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006518 }
6519 catch(std::bad_alloc&)
6520 {
6521 return error(GL_OUT_OF_MEMORY);
6522 }
6523}
6524
6525void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006527 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006528
6529 try
6530 {
6531 if (index >= gl::MAX_VERTEX_ATTRIBS)
6532 {
6533 return error(GL_INVALID_VALUE);
6534 }
6535
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006537
6538 if (context)
6539 {
6540 GLfloat vals[4] = { x, y, 0, 1 };
6541 context->setVertexAttrib(index, vals);
6542 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006543 }
6544 catch(std::bad_alloc&)
6545 {
6546 return error(GL_OUT_OF_MEMORY);
6547 }
6548}
6549
6550void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006552 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006553
6554 try
6555 {
6556 if (index >= gl::MAX_VERTEX_ATTRIBS)
6557 {
6558 return error(GL_INVALID_VALUE);
6559 }
6560
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006562
6563 if (context)
6564 {
6565 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6566 context->setVertexAttrib(index, vals);
6567 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006568 }
6569 catch(std::bad_alloc&)
6570 {
6571 return error(GL_OUT_OF_MEMORY);
6572 }
6573}
6574
6575void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006577 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 +00006578
6579 try
6580 {
6581 if (index >= gl::MAX_VERTEX_ATTRIBS)
6582 {
6583 return error(GL_INVALID_VALUE);
6584 }
6585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006587
6588 if (context)
6589 {
6590 GLfloat vals[4] = { x, y, z, 1 };
6591 context->setVertexAttrib(index, vals);
6592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006593 }
6594 catch(std::bad_alloc&)
6595 {
6596 return error(GL_OUT_OF_MEMORY);
6597 }
6598}
6599
6600void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006602 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006603
6604 try
6605 {
6606 if (index >= gl::MAX_VERTEX_ATTRIBS)
6607 {
6608 return error(GL_INVALID_VALUE);
6609 }
6610
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006611 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006612
6613 if (context)
6614 {
6615 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6616 context->setVertexAttrib(index, vals);
6617 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006618 }
6619 catch(std::bad_alloc&)
6620 {
6621 return error(GL_OUT_OF_MEMORY);
6622 }
6623}
6624
6625void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6626{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006627 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 +00006628
6629 try
6630 {
6631 if (index >= gl::MAX_VERTEX_ATTRIBS)
6632 {
6633 return error(GL_INVALID_VALUE);
6634 }
6635
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006637
6638 if (context)
6639 {
6640 GLfloat vals[4] = { x, y, z, w };
6641 context->setVertexAttrib(index, vals);
6642 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643 }
6644 catch(std::bad_alloc&)
6645 {
6646 return error(GL_OUT_OF_MEMORY);
6647 }
6648}
6649
6650void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006652 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006653
6654 try
6655 {
6656 if (index >= gl::MAX_VERTEX_ATTRIBS)
6657 {
6658 return error(GL_INVALID_VALUE);
6659 }
6660
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006661 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006662
6663 if (context)
6664 {
6665 context->setVertexAttrib(index, values);
6666 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006667 }
6668 catch(std::bad_alloc&)
6669 {
6670 return error(GL_OUT_OF_MEMORY);
6671 }
6672}
6673
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006674void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6675{
6676 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6677
6678 try
6679 {
6680 if (index >= gl::MAX_VERTEX_ATTRIBS)
6681 {
6682 return error(GL_INVALID_VALUE);
6683 }
6684
6685 gl::Context *context = gl::getNonLostContext();
6686
6687 if (context)
6688 {
6689 context->setVertexAttribDivisor(index, divisor);
6690 }
6691 }
6692 catch(std::bad_alloc&)
6693 {
6694 return error(GL_OUT_OF_MEMORY);
6695 }
6696}
6697
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006698void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006700 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006701 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006702 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006703
6704 try
6705 {
6706 if (index >= gl::MAX_VERTEX_ATTRIBS)
6707 {
6708 return error(GL_INVALID_VALUE);
6709 }
6710
6711 if (size < 1 || size > 4)
6712 {
6713 return error(GL_INVALID_VALUE);
6714 }
6715
6716 switch (type)
6717 {
6718 case GL_BYTE:
6719 case GL_UNSIGNED_BYTE:
6720 case GL_SHORT:
6721 case GL_UNSIGNED_SHORT:
6722 case GL_FIXED:
6723 case GL_FLOAT:
6724 break;
6725 default:
6726 return error(GL_INVALID_ENUM);
6727 }
6728
6729 if (stride < 0)
6730 {
6731 return error(GL_INVALID_VALUE);
6732 }
6733
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006734 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006735
6736 if (context)
6737 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006738 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006739 }
6740 }
6741 catch(std::bad_alloc&)
6742 {
6743 return error(GL_OUT_OF_MEMORY);
6744 }
6745}
6746
6747void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006749 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 +00006750
6751 try
6752 {
6753 if (width < 0 || height < 0)
6754 {
6755 return error(GL_INVALID_VALUE);
6756 }
6757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006759
6760 if (context)
6761 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006762 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006763 }
6764 }
6765 catch(std::bad_alloc&)
6766 {
6767 return error(GL_OUT_OF_MEMORY);
6768 }
6769}
6770
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006771void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6772 GLbitfield mask, GLenum filter)
6773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006774 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006775 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6776 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6777 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6778
6779 try
6780 {
6781 switch (filter)
6782 {
6783 case GL_NEAREST:
6784 break;
6785 default:
6786 return error(GL_INVALID_ENUM);
6787 }
6788
6789 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6790 {
6791 return error(GL_INVALID_VALUE);
6792 }
6793
6794 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6795 {
6796 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
6797 return error(GL_INVALID_OPERATION);
6798 }
6799
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006801
6802 if (context)
6803 {
6804 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6805 {
6806 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
6807 return error(GL_INVALID_OPERATION);
6808 }
6809
6810 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6811 }
6812 }
6813 catch(std::bad_alloc&)
6814 {
6815 return error(GL_OUT_OF_MEMORY);
6816 }
6817}
6818
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006819void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6820 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006821{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006822 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006823 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006824 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006825 target, level, internalformat, width, height, depth, border, format, type, pixels);
6826
6827 try
6828 {
6829 UNIMPLEMENTED(); // FIXME
6830 }
6831 catch(std::bad_alloc&)
6832 {
6833 return error(GL_OUT_OF_MEMORY);
6834 }
6835}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006836
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006837void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6838 GLenum *binaryFormat, void *binary)
6839{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006840 EVENT("(GLenum program = 0x%X, bufSize = %d, length = 0x%0.8p, binaryFormat = 0x%0.8p, binary = 0x%0.8p)",
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006841 program, bufSize, length, binaryFormat, binary);
6842
6843 try
6844 {
6845 gl::Context *context = gl::getNonLostContext();
6846
6847 if (context)
6848 {
6849 gl::Program *programObject = context->getProgram(program);
6850
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006851 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006852 {
6853 return error(GL_INVALID_OPERATION);
6854 }
6855
6856 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6857
6858 if (!programBinary)
6859 {
6860 return error(GL_INVALID_OPERATION);
6861 }
6862
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006863 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006864 {
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006865 return error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006866 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006867
6868 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006869 }
6870 }
6871 catch(std::bad_alloc&)
6872 {
6873 return error(GL_OUT_OF_MEMORY);
6874 }
6875}
6876
6877void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6878 const void *binary, GLint length)
6879{
6880 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6881 program, binaryFormat, binary, length);
6882
6883 try
6884 {
6885 gl::Context *context = gl::getNonLostContext();
6886
6887 if (context)
6888 {
6889 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6890 {
6891 return error(GL_INVALID_ENUM);
6892 }
6893
6894 gl::Program *programObject = context->getProgram(program);
6895
6896 if (!programObject)
6897 {
6898 return error(GL_INVALID_OPERATION);
6899 }
6900
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006901 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006902 }
6903 }
6904 catch(std::bad_alloc&)
6905 {
6906 return error(GL_OUT_OF_MEMORY);
6907 }
6908}
6909
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006910__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6911{
6912 struct Extension
6913 {
6914 const char *name;
6915 __eglMustCastToProperFunctionPointerType address;
6916 };
6917
6918 static const Extension glExtensions[] =
6919 {
6920 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006921 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006922 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006923 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6924 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6925 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6926 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6927 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6928 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6929 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006930 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006931 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006932 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6933 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6934 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6935 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006936 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6937 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6938 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6939 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6940 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6941 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6942 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006943 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6944 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6945 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006946 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
6947 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006948
6949 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6950 {
6951 if (strcmp(procname, glExtensions[ext].name) == 0)
6952 {
6953 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6954 }
6955 }
6956
6957 return NULL;
6958}
6959
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006960// Non-public functions used by EGL
6961
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006962bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006963{
6964 EVENT("(egl::Surface* surface = 0x%0.8p)",
6965 surface);
6966
6967 try
6968 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006969 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006970
6971 if (context)
6972 {
6973 gl::Texture2D *textureObject = context->getTexture2D();
6974
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006975 if (textureObject->isImmutable())
6976 {
6977 return false;
6978 }
6979
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006980 if (textureObject)
6981 {
6982 textureObject->bindTexImage(surface);
6983 }
6984 }
6985 }
6986 catch(std::bad_alloc&)
6987 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006988 return error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006989 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006990
6991 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006992}
6993
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006994}