blob: ee8eca9dce511abbdd711840805f695104c0a180 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8
9#define GL_APICALL
10#include <GLES2/gl2.h>
11#include <GLES2/gl2ext.h>
12
daniel@transgaming.com00c75962010-03-11 20:36:15 +000013#include <exception>
14#include <limits>
15
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000016#include "common/debug.h"
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000017#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018
19#include "libGLESv2/main.h"
20#include "libGLESv2/mathutil.h"
21#include "libGLESv2/utilities.h"
22#include "libGLESv2/Buffer.h"
23#include "libGLESv2/Context.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000024#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000025#include "libGLESv2/Framebuffer.h"
26#include "libGLESv2/Program.h"
27#include "libGLESv2/Renderbuffer.h"
28#include "libGLESv2/Shader.h"
29#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000030#include "libGLESv2/Query.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000032bool validImageSize(GLint level, GLsizei width, GLsizei height)
33{
34 if (level < 0 || width < 0 || height < 0)
35 {
36 return false;
37 }
38
39 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
40 {
41 return true;
42 }
43
44 if (level == 0)
45 {
46 return true;
47 }
48
49 if (gl::isPow2(width) && gl::isPow2(height))
50 {
51 return true;
52 }
53
54 return false;
55}
56
daniel@transgaming.com343373a2011-11-29 19:42:32 +000057bool validateSubImageParams(bool compressed, GLsizei width, GLsizei height, GLint xoffset, GLint yoffset, GLint level, GLenum format, gl::Texture *texture)
58{
59 if (!texture)
60 {
61 return error(GL_INVALID_OPERATION, false);
62 }
63
64 if (compressed != texture->isCompressed())
65 {
66 return error(GL_INVALID_OPERATION, false);
67 }
68
69 if (format != GL_NONE && format != texture->getInternalFormat())
70 {
71 return error(GL_INVALID_OPERATION, false);
72 }
73
74 if (compressed)
75 {
76 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
77 (height % 4 != 0 && height != texture->getHeight(0)))
78 {
79 return error(GL_INVALID_OPERATION, false);
80 }
81 }
82
83 if (xoffset + width > texture->getWidth(level) ||
84 yoffset + height > texture->getHeight(level))
85 {
86 return error(GL_INVALID_VALUE, false);
87 }
88
89 return true;
90}
91
daniel@transgaming.comb7915a52011-11-12 03:14:20 +000092// check for combinations of format and type that are valid for ReadPixels
93bool validReadFormatType(GLenum format, GLenum type)
94{
95 switch (format)
96 {
97 case GL_RGBA:
98 switch (type)
99 {
100 case GL_UNSIGNED_BYTE:
101 break;
102 default:
103 return false;
104 }
105 break;
106 case GL_BGRA_EXT:
107 switch (type)
108 {
109 case GL_UNSIGNED_BYTE:
110 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
111 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
112 break;
113 default:
114 return false;
115 }
116 break;
117 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
118 switch (type)
119 {
120 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
121 break;
122 default:
123 return false;
124 }
125 break;
126 default:
127 return false;
128 }
129 return true;
130}
131
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132extern "C"
133{
134
135void __stdcall glActiveTexture(GLenum texture)
136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000137 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138
139 try
140 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000141 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142
143 if (context)
144 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000145 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
146 {
147 return error(GL_INVALID_ENUM);
148 }
149
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000150 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 }
152 }
153 catch(std::bad_alloc&)
154 {
155 return error(GL_OUT_OF_MEMORY);
156 }
157}
158
159void __stdcall glAttachShader(GLuint program, GLuint shader)
160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000161 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000162
163 try
164 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166
167 if (context)
168 {
169 gl::Program *programObject = context->getProgram(program);
170 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000171
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000172 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000173 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000174 if (context->getShader(program))
175 {
176 return error(GL_INVALID_OPERATION);
177 }
178 else
179 {
180 return error(GL_INVALID_VALUE);
181 }
182 }
183
184 if (!shaderObject)
185 {
186 if (context->getProgram(shader))
187 {
188 return error(GL_INVALID_OPERATION);
189 }
190 else
191 {
192 return error(GL_INVALID_VALUE);
193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194 }
195
196 if (!programObject->attachShader(shaderObject))
197 {
198 return error(GL_INVALID_OPERATION);
199 }
200 }
201 }
202 catch(std::bad_alloc&)
203 {
204 return error(GL_OUT_OF_MEMORY);
205 }
206}
207
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000208void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
209{
210 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
211
212 try
213 {
214 switch (target)
215 {
216 case GL_ANY_SAMPLES_PASSED_EXT:
217 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
218 break;
219 default:
220 return error(GL_INVALID_ENUM);
221 }
222
223 if (id == 0)
224 {
225 return error(GL_INVALID_OPERATION);
226 }
227
228 gl::Context *context = gl::getNonLostContext();
229
230 if (context)
231 {
232 context->beginQuery(target, id);
233 }
234 }
235 catch(std::bad_alloc&)
236 {
237 return error(GL_OUT_OF_MEMORY);
238 }
239}
240
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000241void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000243 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000244
245 try
246 {
247 if (index >= gl::MAX_VERTEX_ATTRIBS)
248 {
249 return error(GL_INVALID_VALUE);
250 }
251
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000252 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253
254 if (context)
255 {
256 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000257
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 if (!programObject)
259 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000260 if (context->getShader(program))
261 {
262 return error(GL_INVALID_OPERATION);
263 }
264 else
265 {
266 return error(GL_INVALID_VALUE);
267 }
268 }
269
270 if (strncmp(name, "gl_", 3) == 0)
271 {
272 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273 }
274
275 programObject->bindAttributeLocation(index, name);
276 }
277 }
278 catch(std::bad_alloc&)
279 {
280 return error(GL_OUT_OF_MEMORY);
281 }
282}
283
284void __stdcall glBindBuffer(GLenum target, GLuint buffer)
285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000286 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000287
288 try
289 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000291
292 if (context)
293 {
294 switch (target)
295 {
296 case GL_ARRAY_BUFFER:
297 context->bindArrayBuffer(buffer);
298 return;
299 case GL_ELEMENT_ARRAY_BUFFER:
300 context->bindElementArrayBuffer(buffer);
301 return;
302 default:
303 return error(GL_INVALID_ENUM);
304 }
305 }
306 }
307 catch(std::bad_alloc&)
308 {
309 return error(GL_OUT_OF_MEMORY);
310 }
311}
312
313void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000315 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000316
317 try
318 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000319 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 {
321 return error(GL_INVALID_ENUM);
322 }
323
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325
326 if (context)
327 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000328 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
329 {
330 context->bindReadFramebuffer(framebuffer);
331 }
332
333 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
334 {
335 context->bindDrawFramebuffer(framebuffer);
336 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337 }
338 }
339 catch(std::bad_alloc&)
340 {
341 return error(GL_OUT_OF_MEMORY);
342 }
343}
344
345void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
346{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000347 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348
349 try
350 {
351 if (target != GL_RENDERBUFFER)
352 {
353 return error(GL_INVALID_ENUM);
354 }
355
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000357
358 if (context)
359 {
360 context->bindRenderbuffer(renderbuffer);
361 }
362 }
363 catch(std::bad_alloc&)
364 {
365 return error(GL_OUT_OF_MEMORY);
366 }
367}
368
369void __stdcall glBindTexture(GLenum target, GLuint texture)
370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000371 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000372
373 try
374 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000376
377 if (context)
378 {
379 gl::Texture *textureObject = context->getTexture(texture);
380
381 if (textureObject && textureObject->getTarget() != target && texture != 0)
382 {
383 return error(GL_INVALID_OPERATION);
384 }
385
386 switch (target)
387 {
388 case GL_TEXTURE_2D:
389 context->bindTexture2D(texture);
390 return;
391 case GL_TEXTURE_CUBE_MAP:
392 context->bindTextureCubeMap(texture);
393 return;
394 default:
395 return error(GL_INVALID_ENUM);
396 }
397 }
398 }
399 catch(std::bad_alloc&)
400 {
401 return error(GL_OUT_OF_MEMORY);
402 }
403}
404
405void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
406{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000407 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000408 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000409
410 try
411 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000412 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413
414 if (context)
415 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000416 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000417 }
418 }
419 catch(std::bad_alloc&)
420 {
421 return error(GL_OUT_OF_MEMORY);
422 }
423}
424
425void __stdcall glBlendEquation(GLenum mode)
426{
427 glBlendEquationSeparate(mode, mode);
428}
429
430void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000432 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000433
434 try
435 {
436 switch (modeRGB)
437 {
438 case GL_FUNC_ADD:
439 case GL_FUNC_SUBTRACT:
440 case GL_FUNC_REVERSE_SUBTRACT:
441 break;
442 default:
443 return error(GL_INVALID_ENUM);
444 }
445
446 switch (modeAlpha)
447 {
448 case GL_FUNC_ADD:
449 case GL_FUNC_SUBTRACT:
450 case GL_FUNC_REVERSE_SUBTRACT:
451 break;
452 default:
453 return error(GL_INVALID_ENUM);
454 }
455
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000456 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000457
458 if (context)
459 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000460 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000461 }
462 }
463 catch(std::bad_alloc&)
464 {
465 return error(GL_OUT_OF_MEMORY);
466 }
467}
468
469void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
470{
471 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
472}
473
474void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000476 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 +0000477 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000478
479 try
480 {
481 switch (srcRGB)
482 {
483 case GL_ZERO:
484 case GL_ONE:
485 case GL_SRC_COLOR:
486 case GL_ONE_MINUS_SRC_COLOR:
487 case GL_DST_COLOR:
488 case GL_ONE_MINUS_DST_COLOR:
489 case GL_SRC_ALPHA:
490 case GL_ONE_MINUS_SRC_ALPHA:
491 case GL_DST_ALPHA:
492 case GL_ONE_MINUS_DST_ALPHA:
493 case GL_CONSTANT_COLOR:
494 case GL_ONE_MINUS_CONSTANT_COLOR:
495 case GL_CONSTANT_ALPHA:
496 case GL_ONE_MINUS_CONSTANT_ALPHA:
497 case GL_SRC_ALPHA_SATURATE:
498 break;
499 default:
500 return error(GL_INVALID_ENUM);
501 }
502
503 switch (dstRGB)
504 {
505 case GL_ZERO:
506 case GL_ONE:
507 case GL_SRC_COLOR:
508 case GL_ONE_MINUS_SRC_COLOR:
509 case GL_DST_COLOR:
510 case GL_ONE_MINUS_DST_COLOR:
511 case GL_SRC_ALPHA:
512 case GL_ONE_MINUS_SRC_ALPHA:
513 case GL_DST_ALPHA:
514 case GL_ONE_MINUS_DST_ALPHA:
515 case GL_CONSTANT_COLOR:
516 case GL_ONE_MINUS_CONSTANT_COLOR:
517 case GL_CONSTANT_ALPHA:
518 case GL_ONE_MINUS_CONSTANT_ALPHA:
519 break;
520 default:
521 return error(GL_INVALID_ENUM);
522 }
523
524 switch (srcAlpha)
525 {
526 case GL_ZERO:
527 case GL_ONE:
528 case GL_SRC_COLOR:
529 case GL_ONE_MINUS_SRC_COLOR:
530 case GL_DST_COLOR:
531 case GL_ONE_MINUS_DST_COLOR:
532 case GL_SRC_ALPHA:
533 case GL_ONE_MINUS_SRC_ALPHA:
534 case GL_DST_ALPHA:
535 case GL_ONE_MINUS_DST_ALPHA:
536 case GL_CONSTANT_COLOR:
537 case GL_ONE_MINUS_CONSTANT_COLOR:
538 case GL_CONSTANT_ALPHA:
539 case GL_ONE_MINUS_CONSTANT_ALPHA:
540 case GL_SRC_ALPHA_SATURATE:
541 break;
542 default:
543 return error(GL_INVALID_ENUM);
544 }
545
546 switch (dstAlpha)
547 {
548 case GL_ZERO:
549 case GL_ONE:
550 case GL_SRC_COLOR:
551 case GL_ONE_MINUS_SRC_COLOR:
552 case GL_DST_COLOR:
553 case GL_ONE_MINUS_DST_COLOR:
554 case GL_SRC_ALPHA:
555 case GL_ONE_MINUS_SRC_ALPHA:
556 case GL_DST_ALPHA:
557 case GL_ONE_MINUS_DST_ALPHA:
558 case GL_CONSTANT_COLOR:
559 case GL_ONE_MINUS_CONSTANT_COLOR:
560 case GL_CONSTANT_ALPHA:
561 case GL_ONE_MINUS_CONSTANT_ALPHA:
562 break;
563 default:
564 return error(GL_INVALID_ENUM);
565 }
566
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000567 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
568 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
569
570 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
571 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
572
573 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000574 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000575 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
576 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 }
578
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000579 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000580
581 if (context)
582 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000583 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584 }
585 }
586 catch(std::bad_alloc&)
587 {
588 return error(GL_OUT_OF_MEMORY);
589 }
590}
591
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000592void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000593{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000594 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 +0000595 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596
597 try
598 {
599 if (size < 0)
600 {
601 return error(GL_INVALID_VALUE);
602 }
603
604 switch (usage)
605 {
606 case GL_STREAM_DRAW:
607 case GL_STATIC_DRAW:
608 case GL_DYNAMIC_DRAW:
609 break;
610 default:
611 return error(GL_INVALID_ENUM);
612 }
613
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615
616 if (context)
617 {
618 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000619
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000620 switch (target)
621 {
622 case GL_ARRAY_BUFFER:
623 buffer = context->getArrayBuffer();
624 break;
625 case GL_ELEMENT_ARRAY_BUFFER:
626 buffer = context->getElementArrayBuffer();
627 break;
628 default:
629 return error(GL_INVALID_ENUM);
630 }
631
632 if (!buffer)
633 {
634 return error(GL_INVALID_OPERATION);
635 }
636
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000637 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000638 }
639 }
640 catch(std::bad_alloc&)
641 {
642 return error(GL_OUT_OF_MEMORY);
643 }
644}
645
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000646void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000648 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 +0000649 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000650
651 try
652 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000653 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654 {
655 return error(GL_INVALID_VALUE);
656 }
657
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000658 if (data == NULL)
659 {
660 return;
661 }
662
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000663 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000664
665 if (context)
666 {
667 gl::Buffer *buffer;
668
669 switch (target)
670 {
671 case GL_ARRAY_BUFFER:
672 buffer = context->getArrayBuffer();
673 break;
674 case GL_ELEMENT_ARRAY_BUFFER:
675 buffer = context->getElementArrayBuffer();
676 break;
677 default:
678 return error(GL_INVALID_ENUM);
679 }
680
681 if (!buffer)
682 {
683 return error(GL_INVALID_OPERATION);
684 }
685
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000686 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000687 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000688 return error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000689 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000690
691 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693 }
694 catch(std::bad_alloc&)
695 {
696 return error(GL_OUT_OF_MEMORY);
697 }
698}
699
700GLenum __stdcall glCheckFramebufferStatus(GLenum target)
701{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000702 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703
704 try
705 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000706 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000707 {
708 return error(GL_INVALID_ENUM, 0);
709 }
710
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000711 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000712
713 if (context)
714 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000715 gl::Framebuffer *framebuffer = NULL;
716 if (target == GL_READ_FRAMEBUFFER_ANGLE)
717 {
718 framebuffer = context->getReadFramebuffer();
719 }
720 else
721 {
722 framebuffer = context->getDrawFramebuffer();
723 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724
725 return framebuffer->completeness();
726 }
727 }
728 catch(std::bad_alloc&)
729 {
730 return error(GL_OUT_OF_MEMORY, 0);
731 }
732
733 return 0;
734}
735
736void __stdcall glClear(GLbitfield mask)
737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000738 EVENT("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739
740 try
741 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000742 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000743
744 if (context)
745 {
746 context->clear(mask);
747 }
748 }
749 catch(std::bad_alloc&)
750 {
751 return error(GL_OUT_OF_MEMORY);
752 }
753}
754
755void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000757 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000758 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000759
760 try
761 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000762 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763
764 if (context)
765 {
766 context->setClearColor(red, green, blue, alpha);
767 }
768 }
769 catch(std::bad_alloc&)
770 {
771 return error(GL_OUT_OF_MEMORY);
772 }
773}
774
775void __stdcall glClearDepthf(GLclampf depth)
776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000777 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778
779 try
780 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000781 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 if (context)
784 {
785 context->setClearDepth(depth);
786 }
787 }
788 catch(std::bad_alloc&)
789 {
790 return error(GL_OUT_OF_MEMORY);
791 }
792}
793
794void __stdcall glClearStencil(GLint s)
795{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000796 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000797
798 try
799 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000801
802 if (context)
803 {
804 context->setClearStencil(s);
805 }
806 }
807 catch(std::bad_alloc&)
808 {
809 return error(GL_OUT_OF_MEMORY);
810 }
811}
812
813void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
814{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000815 EVENT("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000816 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000817
818 try
819 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821
822 if (context)
823 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000824 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000825 }
826 }
827 catch(std::bad_alloc&)
828 {
829 return error(GL_OUT_OF_MEMORY);
830 }
831}
832
833void __stdcall glCompileShader(GLuint shader)
834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836
837 try
838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000840
841 if (context)
842 {
843 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000844
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845 if (!shaderObject)
846 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000847 if (context->getProgram(shader))
848 {
849 return error(GL_INVALID_OPERATION);
850 }
851 else
852 {
853 return error(GL_INVALID_VALUE);
854 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000855 }
856
857 shaderObject->compile();
858 }
859 }
860 catch(std::bad_alloc&)
861 {
862 return error(GL_OUT_OF_MEMORY);
863 }
864}
865
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000866void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
867 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000868{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000869 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000870 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000871 target, level, internalformat, width, height, border, imageSize, data);
872
873 try
874 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +0000875 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +0000876 {
877 return error(GL_INVALID_VALUE);
878 }
879
daniel@transgaming.com01868132010-08-24 19:21:17 +0000880 switch (internalformat)
881 {
882 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
883 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +0000884 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
885 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +0000886 break;
887 default:
888 return error(GL_INVALID_ENUM);
889 }
890
891 if (border != 0)
892 {
893 return error(GL_INVALID_VALUE);
894 }
895
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000896 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000897
898 if (context)
899 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +0000900 if (level > context->getMaximumTextureLevel())
901 {
902 return error(GL_INVALID_VALUE);
903 }
904
905 switch (target)
906 {
907 case GL_TEXTURE_2D:
908 if (width > (context->getMaximumTextureDimension() >> level) ||
909 height > (context->getMaximumTextureDimension() >> level))
910 {
911 return error(GL_INVALID_VALUE);
912 }
913 break;
914 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
915 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
916 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
917 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
918 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
919 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
920 if (width != height)
921 {
922 return error(GL_INVALID_VALUE);
923 }
924
925 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
926 height > (context->getMaximumCubeTextureDimension() >> level))
927 {
928 return error(GL_INVALID_VALUE);
929 }
930 break;
931 default:
932 return error(GL_INVALID_ENUM);
933 }
934
gman@chromium.org50c526d2011-08-10 05:19:44 +0000935 switch (internalformat) {
936 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
937 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
938 if (!context->supportsDXT1Textures())
939 {
940 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
941 }
942 break;
943 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
944 if (!context->supportsDXT3Textures())
945 {
946 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
947 }
948 break;
949 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
950 if (!context->supportsDXT5Textures())
951 {
952 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
953 }
954 break;
955 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +0000956 }
957
958 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
959 {
960 return error(GL_INVALID_VALUE);
961 }
962
963 if (target == GL_TEXTURE_2D)
964 {
965 gl::Texture2D *texture = context->getTexture2D();
966
967 if (!texture)
968 {
969 return error(GL_INVALID_OPERATION);
970 }
971
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000972 if (texture->isImmutable())
973 {
974 return error(GL_INVALID_OPERATION);
975 }
976
daniel@transgaming.com01868132010-08-24 19:21:17 +0000977 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
978 }
979 else
980 {
981 gl::TextureCubeMap *texture = context->getTextureCubeMap();
982
983 if (!texture)
984 {
985 return error(GL_INVALID_OPERATION);
986 }
987
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +0000988 if (texture->isImmutable())
989 {
990 return error(GL_INVALID_OPERATION);
991 }
992
daniel@transgaming.com01868132010-08-24 19:21:17 +0000993 switch (target)
994 {
995 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
996 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
997 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
998 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1000 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1001 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1002 break;
1003 default: UNREACHABLE();
1004 }
1005 }
1006 }
1007
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001008 }
1009 catch(std::bad_alloc&)
1010 {
1011 return error(GL_OUT_OF_MEMORY);
1012 }
1013}
1014
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001015void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1016 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001018 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001019 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001020 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1022
1023 try
1024 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001025 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001026 {
1027 return error(GL_INVALID_ENUM);
1028 }
1029
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001030 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001031 {
1032 return error(GL_INVALID_VALUE);
1033 }
1034
daniel@transgaming.com01868132010-08-24 19:21:17 +00001035 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001036 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001037 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1038 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001039 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1040 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001041 break;
1042 default:
1043 return error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001044 }
1045
daniel@transgaming.com01868132010-08-24 19:21:17 +00001046 if (width == 0 || height == 0 || data == NULL)
1047 {
1048 return;
1049 }
1050
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001051 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001052
1053 if (context)
1054 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001055 if (level > context->getMaximumTextureLevel())
1056 {
1057 return error(GL_INVALID_VALUE);
1058 }
1059
gman@chromium.org50c526d2011-08-10 05:19:44 +00001060 switch (format) {
1061 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1062 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1063 if (!context->supportsDXT1Textures())
1064 {
1065 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1066 }
1067 break;
1068 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1069 if (!context->supportsDXT3Textures())
1070 {
1071 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1072 }
1073 break;
1074 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1075 if (!context->supportsDXT5Textures())
1076 {
1077 return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
1078 }
1079 break;
1080 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001081 }
1082
1083 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1084 {
1085 return error(GL_INVALID_VALUE);
1086 }
1087
1088 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1089 {
1090 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 +00001091 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001092 }
1093
1094 if (target == GL_TEXTURE_2D)
1095 {
1096 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001097 if (validateSubImageParams(true, width, height, xoffset, yoffset, level, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001098 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001099 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001100 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001101 }
1102 else if (gl::IsCubemapTextureTarget(target))
1103 {
1104 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001105 if (validateSubImageParams(true, width, height, xoffset, yoffset, level, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001106 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001107 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001108 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001109 }
1110 else
1111 {
1112 UNREACHABLE();
1113 }
1114 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001115 }
1116 catch(std::bad_alloc&)
1117 {
1118 return error(GL_OUT_OF_MEMORY);
1119 }
1120}
1121
1122void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1123{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001124 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001125 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001126 target, level, internalformat, x, y, width, height, border);
1127
1128 try
1129 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001130 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001131 {
1132 return error(GL_INVALID_VALUE);
1133 }
1134
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001135 if (border != 0)
1136 {
1137 return error(GL_INVALID_VALUE);
1138 }
1139
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001141
1142 if (context)
1143 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001144 if (level > context->getMaximumTextureLevel())
1145 {
1146 return error(GL_INVALID_VALUE);
1147 }
1148
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001149 switch (target)
1150 {
1151 case GL_TEXTURE_2D:
1152 if (width > (context->getMaximumTextureDimension() >> level) ||
1153 height > (context->getMaximumTextureDimension() >> level))
1154 {
1155 return error(GL_INVALID_VALUE);
1156 }
1157 break;
1158 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1159 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1160 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1161 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1162 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1163 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1164 if (width != height)
1165 {
1166 return error(GL_INVALID_VALUE);
1167 }
1168
1169 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1170 height > (context->getMaximumCubeTextureDimension() >> level))
1171 {
1172 return error(GL_INVALID_VALUE);
1173 }
1174 break;
1175 default:
1176 return error(GL_INVALID_ENUM);
1177 }
1178
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001179 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001180
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001181 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1182 {
1183 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1184 }
1185
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001186 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1187 {
1188 return error(GL_INVALID_OPERATION);
1189 }
1190
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001191 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001192 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001193
1194 // [OpenGL ES 2.0.24] table 3.9
1195 switch (internalformat)
1196 {
1197 case GL_ALPHA:
1198 if (colorbufferFormat != GL_ALPHA &&
1199 colorbufferFormat != GL_RGBA &&
1200 colorbufferFormat != GL_RGBA4 &&
1201 colorbufferFormat != GL_RGB5_A1 &&
1202 colorbufferFormat != GL_RGBA8_OES)
1203 {
1204 return error(GL_INVALID_OPERATION);
1205 }
1206 break;
1207 case GL_LUMINANCE:
1208 case GL_RGB:
1209 if (colorbufferFormat != GL_RGB &&
1210 colorbufferFormat != GL_RGB565 &&
1211 colorbufferFormat != GL_RGB8_OES &&
1212 colorbufferFormat != GL_RGBA &&
1213 colorbufferFormat != GL_RGBA4 &&
1214 colorbufferFormat != GL_RGB5_A1 &&
1215 colorbufferFormat != GL_RGBA8_OES)
1216 {
1217 return error(GL_INVALID_OPERATION);
1218 }
1219 break;
1220 case GL_LUMINANCE_ALPHA:
1221 case GL_RGBA:
1222 if (colorbufferFormat != GL_RGBA &&
1223 colorbufferFormat != GL_RGBA4 &&
1224 colorbufferFormat != GL_RGB5_A1 &&
1225 colorbufferFormat != GL_RGBA8_OES)
1226 {
1227 return error(GL_INVALID_OPERATION);
1228 }
1229 break;
1230 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1231 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001232 if (context->supportsDXT1Textures())
1233 {
1234 return error(GL_INVALID_OPERATION);
1235 }
1236 else
1237 {
1238 return error(GL_INVALID_ENUM);
1239 }
1240 break;
1241 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1242 if (context->supportsDXT3Textures())
1243 {
1244 return error(GL_INVALID_OPERATION);
1245 }
1246 else
1247 {
1248 return error(GL_INVALID_ENUM);
1249 }
1250 break;
1251 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1252 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001253 {
1254 return error(GL_INVALID_OPERATION);
1255 }
1256 else
1257 {
1258 return error(GL_INVALID_ENUM);
1259 }
1260 break;
1261 default:
1262 return error(GL_INVALID_ENUM);
1263 }
1264
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001265 if (target == GL_TEXTURE_2D)
1266 {
1267 gl::Texture2D *texture = context->getTexture2D();
1268
1269 if (!texture)
1270 {
1271 return error(GL_INVALID_OPERATION);
1272 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001273
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001274 if (texture->isImmutable())
1275 {
1276 return error(GL_INVALID_OPERATION);
1277 }
1278
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001279 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001280 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001281 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001282 {
1283 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1284
1285 if (!texture)
1286 {
1287 return error(GL_INVALID_OPERATION);
1288 }
1289
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001290 if (texture->isImmutable())
1291 {
1292 return error(GL_INVALID_OPERATION);
1293 }
1294
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001295 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001296 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001297 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001298 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001299 }
1300 catch(std::bad_alloc&)
1301 {
1302 return error(GL_OUT_OF_MEMORY);
1303 }
1304}
1305
1306void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001308 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001309 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001310 target, level, xoffset, yoffset, x, y, width, height);
1311
1312 try
1313 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001314 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001315 {
1316 return error(GL_INVALID_ENUM);
1317 }
1318
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001319 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001320 {
1321 return error(GL_INVALID_VALUE);
1322 }
1323
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001324 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1325 {
1326 return error(GL_INVALID_VALUE);
1327 }
1328
1329 if (width == 0 || height == 0)
1330 {
1331 return;
1332 }
1333
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001335
1336 if (context)
1337 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001338 if (level > context->getMaximumTextureLevel())
1339 {
1340 return error(GL_INVALID_VALUE);
1341 }
1342
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001343 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001344
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001345 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1346 {
1347 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1348 }
1349
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001350 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1351 {
1352 return error(GL_INVALID_OPERATION);
1353 }
1354
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001355 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001356 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001357 gl::Texture *texture = NULL;
1358
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001359 if (target == GL_TEXTURE_2D)
1360 {
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001361 texture = context->getTexture2D();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001362 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001363 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001364 {
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001365 texture = context->getTextureCubeMap();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001366 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001367 else UNREACHABLE();
1368
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001369 if (!validateSubImageParams(false, width, height, xoffset, yoffset, level, GL_NONE, texture))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001370 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001371 return; // error already registered by validateSubImageParams
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00001372 }
1373
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001374 GLenum textureFormat = texture->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001375
1376 // [OpenGL ES 2.0.24] table 3.9
1377 switch (textureFormat)
1378 {
1379 case GL_ALPHA:
1380 if (colorbufferFormat != GL_ALPHA &&
1381 colorbufferFormat != GL_RGBA &&
1382 colorbufferFormat != GL_RGBA4 &&
1383 colorbufferFormat != GL_RGB5_A1 &&
1384 colorbufferFormat != GL_RGBA8_OES)
1385 {
1386 return error(GL_INVALID_OPERATION);
1387 }
1388 break;
1389 case GL_LUMINANCE:
1390 case GL_RGB:
1391 if (colorbufferFormat != GL_RGB &&
1392 colorbufferFormat != GL_RGB565 &&
1393 colorbufferFormat != GL_RGB8_OES &&
1394 colorbufferFormat != GL_RGBA &&
1395 colorbufferFormat != GL_RGBA4 &&
1396 colorbufferFormat != GL_RGB5_A1 &&
1397 colorbufferFormat != GL_RGBA8_OES)
1398 {
1399 return error(GL_INVALID_OPERATION);
1400 }
1401 break;
1402 case GL_LUMINANCE_ALPHA:
1403 case GL_RGBA:
1404 if (colorbufferFormat != GL_RGBA &&
1405 colorbufferFormat != GL_RGBA4 &&
1406 colorbufferFormat != GL_RGB5_A1 &&
1407 colorbufferFormat != GL_RGBA8_OES)
1408 {
1409 return error(GL_INVALID_OPERATION);
1410 }
1411 break;
1412 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1413 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001414 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1415 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001416 return error(GL_INVALID_OPERATION);
1417 default:
1418 return error(GL_INVALID_OPERATION);
1419 }
1420
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001421 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001422 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001423 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001424
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001425 catch(std::bad_alloc&)
1426 {
1427 return error(GL_OUT_OF_MEMORY);
1428 }
1429}
1430
1431GLuint __stdcall glCreateProgram(void)
1432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001433 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001434
1435 try
1436 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001437 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001438
1439 if (context)
1440 {
1441 return context->createProgram();
1442 }
1443 }
1444 catch(std::bad_alloc&)
1445 {
1446 return error(GL_OUT_OF_MEMORY, 0);
1447 }
1448
1449 return 0;
1450}
1451
1452GLuint __stdcall glCreateShader(GLenum type)
1453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001454 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001455
1456 try
1457 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001458 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459
1460 if (context)
1461 {
1462 switch (type)
1463 {
1464 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001465 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466 return context->createShader(type);
1467 default:
1468 return error(GL_INVALID_ENUM, 0);
1469 }
1470 }
1471 }
1472 catch(std::bad_alloc&)
1473 {
1474 return error(GL_OUT_OF_MEMORY, 0);
1475 }
1476
1477 return 0;
1478}
1479
1480void __stdcall glCullFace(GLenum mode)
1481{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001482 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001483
1484 try
1485 {
1486 switch (mode)
1487 {
1488 case GL_FRONT:
1489 case GL_BACK:
1490 case GL_FRONT_AND_BACK:
1491 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001493
1494 if (context)
1495 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001496 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001497 }
1498 }
1499 break;
1500 default:
1501 return error(GL_INVALID_ENUM);
1502 }
1503 }
1504 catch(std::bad_alloc&)
1505 {
1506 return error(GL_OUT_OF_MEMORY);
1507 }
1508}
1509
1510void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001512 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001513
1514 try
1515 {
1516 if (n < 0)
1517 {
1518 return error(GL_INVALID_VALUE);
1519 }
1520
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522
1523 if (context)
1524 {
1525 for (int i = 0; i < n; i++)
1526 {
1527 context->deleteBuffer(buffers[i]);
1528 }
1529 }
1530 }
1531 catch(std::bad_alloc&)
1532 {
1533 return error(GL_OUT_OF_MEMORY);
1534 }
1535}
1536
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001537void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1538{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001539 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001540
1541 try
1542 {
1543 if (n < 0)
1544 {
1545 return error(GL_INVALID_VALUE);
1546 }
1547
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001548 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001549
1550 if (context)
1551 {
1552 for (int i = 0; i < n; i++)
1553 {
1554 context->deleteFence(fences[i]);
1555 }
1556 }
1557 }
1558 catch(std::bad_alloc&)
1559 {
1560 return error(GL_OUT_OF_MEMORY);
1561 }
1562}
1563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1565{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001566 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001567
1568 try
1569 {
1570 if (n < 0)
1571 {
1572 return error(GL_INVALID_VALUE);
1573 }
1574
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001575 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576
1577 if (context)
1578 {
1579 for (int i = 0; i < n; i++)
1580 {
1581 if (framebuffers[i] != 0)
1582 {
1583 context->deleteFramebuffer(framebuffers[i]);
1584 }
1585 }
1586 }
1587 }
1588 catch(std::bad_alloc&)
1589 {
1590 return error(GL_OUT_OF_MEMORY);
1591 }
1592}
1593
1594void __stdcall glDeleteProgram(GLuint program)
1595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001596 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001597
1598 try
1599 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001600 if (program == 0)
1601 {
1602 return;
1603 }
1604
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001605 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001606
1607 if (context)
1608 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001609 if (!context->getProgram(program))
1610 {
1611 if(context->getShader(program))
1612 {
1613 return error(GL_INVALID_OPERATION);
1614 }
1615 else
1616 {
1617 return error(GL_INVALID_VALUE);
1618 }
1619 }
1620
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001621 context->deleteProgram(program);
1622 }
1623 }
1624 catch(std::bad_alloc&)
1625 {
1626 return error(GL_OUT_OF_MEMORY);
1627 }
1628}
1629
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001630void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1631{
1632 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1633
1634 try
1635 {
1636 if (n < 0)
1637 {
1638 return error(GL_INVALID_VALUE);
1639 }
1640
1641 gl::Context *context = gl::getNonLostContext();
1642
1643 if (context)
1644 {
1645 for (int i = 0; i < n; i++)
1646 {
1647 context->deleteQuery(ids[i]);
1648 }
1649 }
1650 }
1651 catch(std::bad_alloc&)
1652 {
1653 return error(GL_OUT_OF_MEMORY);
1654 }
1655}
1656
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001659 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660
1661 try
1662 {
1663 if (n < 0)
1664 {
1665 return error(GL_INVALID_VALUE);
1666 }
1667
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001668 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669
1670 if (context)
1671 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001672 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001673 {
1674 context->deleteRenderbuffer(renderbuffers[i]);
1675 }
1676 }
1677 }
1678 catch(std::bad_alloc&)
1679 {
1680 return error(GL_OUT_OF_MEMORY);
1681 }
1682}
1683
1684void __stdcall glDeleteShader(GLuint shader)
1685{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001686 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687
1688 try
1689 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001690 if (shader == 0)
1691 {
1692 return;
1693 }
1694
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001696
1697 if (context)
1698 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001699 if (!context->getShader(shader))
1700 {
1701 if(context->getProgram(shader))
1702 {
1703 return error(GL_INVALID_OPERATION);
1704 }
1705 else
1706 {
1707 return error(GL_INVALID_VALUE);
1708 }
1709 }
1710
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001711 context->deleteShader(shader);
1712 }
1713 }
1714 catch(std::bad_alloc&)
1715 {
1716 return error(GL_OUT_OF_MEMORY);
1717 }
1718}
1719
1720void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001722 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001723
1724 try
1725 {
1726 if (n < 0)
1727 {
1728 return error(GL_INVALID_VALUE);
1729 }
1730
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001732
1733 if (context)
1734 {
1735 for (int i = 0; i < n; i++)
1736 {
1737 if (textures[i] != 0)
1738 {
1739 context->deleteTexture(textures[i]);
1740 }
1741 }
1742 }
1743 }
1744 catch(std::bad_alloc&)
1745 {
1746 return error(GL_OUT_OF_MEMORY);
1747 }
1748}
1749
1750void __stdcall glDepthFunc(GLenum func)
1751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001752 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001753
1754 try
1755 {
1756 switch (func)
1757 {
1758 case GL_NEVER:
1759 case GL_ALWAYS:
1760 case GL_LESS:
1761 case GL_LEQUAL:
1762 case GL_EQUAL:
1763 case GL_GREATER:
1764 case GL_GEQUAL:
1765 case GL_NOTEQUAL:
1766 break;
1767 default:
1768 return error(GL_INVALID_ENUM);
1769 }
1770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001772
1773 if (context)
1774 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001775 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001776 }
1777 }
1778 catch(std::bad_alloc&)
1779 {
1780 return error(GL_OUT_OF_MEMORY);
1781 }
1782}
1783
1784void __stdcall glDepthMask(GLboolean flag)
1785{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001786 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001787
1788 try
1789 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001791
1792 if (context)
1793 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001794 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001795 }
1796 }
1797 catch(std::bad_alloc&)
1798 {
1799 return error(GL_OUT_OF_MEMORY);
1800 }
1801}
1802
1803void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001805 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001806
1807 try
1808 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001809 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810
1811 if (context)
1812 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001813 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001814 }
1815 }
1816 catch(std::bad_alloc&)
1817 {
1818 return error(GL_OUT_OF_MEMORY);
1819 }
1820}
1821
1822void __stdcall glDetachShader(GLuint program, GLuint shader)
1823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001824 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825
1826 try
1827 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001828 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001829
1830 if (context)
1831 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001832
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001833 gl::Program *programObject = context->getProgram(program);
1834 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001835
1836 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001837 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001838 gl::Shader *shaderByProgramHandle;
1839 shaderByProgramHandle = context->getShader(program);
1840 if (!shaderByProgramHandle)
1841 {
1842 return error(GL_INVALID_VALUE);
1843 }
1844 else
1845 {
1846 return error(GL_INVALID_OPERATION);
1847 }
1848 }
1849
1850 if (!shaderObject)
1851 {
1852 gl::Program *programByShaderHandle = context->getProgram(shader);
1853 if (!programByShaderHandle)
1854 {
1855 return error(GL_INVALID_VALUE);
1856 }
1857 else
1858 {
1859 return error(GL_INVALID_OPERATION);
1860 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 }
1862
1863 if (!programObject->detachShader(shaderObject))
1864 {
1865 return error(GL_INVALID_OPERATION);
1866 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001867 }
1868 }
1869 catch(std::bad_alloc&)
1870 {
1871 return error(GL_OUT_OF_MEMORY);
1872 }
1873}
1874
1875void __stdcall glDisable(GLenum cap)
1876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001877 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878
1879 try
1880 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882
1883 if (context)
1884 {
1885 switch (cap)
1886 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001887 case GL_CULL_FACE: context->setCullFace(false); break;
1888 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1889 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1890 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1891 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1892 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1893 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1894 case GL_BLEND: context->setBlend(false); break;
1895 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896 default:
1897 return error(GL_INVALID_ENUM);
1898 }
1899 }
1900 }
1901 catch(std::bad_alloc&)
1902 {
1903 return error(GL_OUT_OF_MEMORY);
1904 }
1905}
1906
1907void __stdcall glDisableVertexAttribArray(GLuint index)
1908{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001909 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001910
1911 try
1912 {
1913 if (index >= gl::MAX_VERTEX_ATTRIBS)
1914 {
1915 return error(GL_INVALID_VALUE);
1916 }
1917
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919
1920 if (context)
1921 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001922 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001923 }
1924 }
1925 catch(std::bad_alloc&)
1926 {
1927 return error(GL_OUT_OF_MEMORY);
1928 }
1929}
1930
1931void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1932{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001933 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934
1935 try
1936 {
1937 if (count < 0 || first < 0)
1938 {
1939 return error(GL_INVALID_VALUE);
1940 }
1941
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001942 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943
1944 if (context)
1945 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001946 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947 }
1948 }
1949 catch(std::bad_alloc&)
1950 {
1951 return error(GL_OUT_OF_MEMORY);
1952 }
1953}
1954
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001955void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1956{
1957 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1958
1959 try
1960 {
1961 if (count < 0 || first < 0 || primcount < 0)
1962 {
1963 return error(GL_INVALID_VALUE);
1964 }
1965
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001966 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001967 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00001968 gl::Context *context = gl::getNonLostContext();
1969
1970 if (context)
1971 {
1972 context->drawArrays(mode, first, count, primcount);
1973 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00001974 }
1975 }
1976 catch(std::bad_alloc&)
1977 {
1978 return error(GL_OUT_OF_MEMORY);
1979 }
1980}
1981
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001982void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001983{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001984 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 +00001985 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986
1987 try
1988 {
1989 if (count < 0)
1990 {
1991 return error(GL_INVALID_VALUE);
1992 }
1993
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001995
1996 if (context)
1997 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00001998 switch (type)
1999 {
2000 case GL_UNSIGNED_BYTE:
2001 case GL_UNSIGNED_SHORT:
2002 break;
2003 case GL_UNSIGNED_INT:
2004 if (!context->supports32bitIndices())
2005 {
2006 return error(GL_INVALID_ENUM);
2007 }
2008 break;
2009 default:
2010 return error(GL_INVALID_ENUM);
2011 }
2012
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002013 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002014 }
2015 }
2016 catch(std::bad_alloc&)
2017 {
2018 return error(GL_OUT_OF_MEMORY);
2019 }
2020}
2021
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002022void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2023{
2024 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2025 mode, count, type, indices, primcount);
2026
2027 try
2028 {
2029 if (count < 0 || primcount < 0)
2030 {
2031 return error(GL_INVALID_VALUE);
2032 }
2033
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002034 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002035 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002036 gl::Context *context = gl::getNonLostContext();
2037
2038 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002039 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002040 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002041 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002042 case GL_UNSIGNED_BYTE:
2043 case GL_UNSIGNED_SHORT:
2044 break;
2045 case GL_UNSIGNED_INT:
2046 if (!context->supports32bitIndices())
2047 {
2048 return error(GL_INVALID_ENUM);
2049 }
2050 break;
2051 default:
2052 return error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002053 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002054
2055 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002056 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002057 }
2058 }
2059 catch(std::bad_alloc&)
2060 {
2061 return error(GL_OUT_OF_MEMORY);
2062 }
2063}
2064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002065void __stdcall glEnable(GLenum cap)
2066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002067 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068
2069 try
2070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072
2073 if (context)
2074 {
2075 switch (cap)
2076 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002077 case GL_CULL_FACE: context->setCullFace(true); break;
2078 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2079 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2080 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2081 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2082 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2083 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2084 case GL_BLEND: context->setBlend(true); break;
2085 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086 default:
2087 return error(GL_INVALID_ENUM);
2088 }
2089 }
2090 }
2091 catch(std::bad_alloc&)
2092 {
2093 return error(GL_OUT_OF_MEMORY);
2094 }
2095}
2096
2097void __stdcall glEnableVertexAttribArray(GLuint index)
2098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002099 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100
2101 try
2102 {
2103 if (index >= gl::MAX_VERTEX_ATTRIBS)
2104 {
2105 return error(GL_INVALID_VALUE);
2106 }
2107
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002109
2110 if (context)
2111 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002112 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002113 }
2114 }
2115 catch(std::bad_alloc&)
2116 {
2117 return error(GL_OUT_OF_MEMORY);
2118 }
2119}
2120
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002121void __stdcall glEndQueryEXT(GLenum target)
2122{
2123 EVENT("GLenum target = 0x%X)", target);
2124
2125 try
2126 {
2127 switch (target)
2128 {
2129 case GL_ANY_SAMPLES_PASSED_EXT:
2130 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2131 break;
2132 default:
2133 return error(GL_INVALID_ENUM);
2134 }
2135
2136 gl::Context *context = gl::getNonLostContext();
2137
2138 if (context)
2139 {
2140 context->endQuery(target);
2141 }
2142 }
2143 catch(std::bad_alloc&)
2144 {
2145 return error(GL_OUT_OF_MEMORY);
2146 }
2147}
2148
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002149void __stdcall glFinishFenceNV(GLuint fence)
2150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002151 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002152
2153 try
2154 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002155 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002156
2157 if (context)
2158 {
2159 gl::Fence* fenceObject = context->getFence(fence);
2160
2161 if (fenceObject == NULL)
2162 {
2163 return error(GL_INVALID_OPERATION);
2164 }
2165
2166 fenceObject->finishFence();
2167 }
2168 }
2169 catch(std::bad_alloc&)
2170 {
2171 return error(GL_OUT_OF_MEMORY);
2172 }
2173}
2174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175void __stdcall glFinish(void)
2176{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002177 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002178
2179 try
2180 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182
2183 if (context)
2184 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002185 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186 }
2187 }
2188 catch(std::bad_alloc&)
2189 {
2190 return error(GL_OUT_OF_MEMORY);
2191 }
2192}
2193
2194void __stdcall glFlush(void)
2195{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002196 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002197
2198 try
2199 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002200 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002201
2202 if (context)
2203 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002204 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002205 }
2206 }
2207 catch(std::bad_alloc&)
2208 {
2209 return error(GL_OUT_OF_MEMORY);
2210 }
2211}
2212
2213void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002215 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002216 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002217
2218 try
2219 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002220 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002221 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002222 {
2223 return error(GL_INVALID_ENUM);
2224 }
2225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227
2228 if (context)
2229 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002230 gl::Framebuffer *framebuffer = NULL;
2231 GLuint framebufferHandle = 0;
2232 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2233 {
2234 framebuffer = context->getReadFramebuffer();
2235 framebufferHandle = context->getReadFramebufferHandle();
2236 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002237 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002238 {
2239 framebuffer = context->getDrawFramebuffer();
2240 framebufferHandle = context->getDrawFramebufferHandle();
2241 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002242
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002243 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244 {
2245 return error(GL_INVALID_OPERATION);
2246 }
2247
2248 switch (attachment)
2249 {
2250 case GL_COLOR_ATTACHMENT0:
2251 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2252 break;
2253 case GL_DEPTH_ATTACHMENT:
2254 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2255 break;
2256 case GL_STENCIL_ATTACHMENT:
2257 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2258 break;
2259 default:
2260 return error(GL_INVALID_ENUM);
2261 }
2262 }
2263 }
2264 catch(std::bad_alloc&)
2265 {
2266 return error(GL_OUT_OF_MEMORY);
2267 }
2268}
2269
2270void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002272 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002273 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
2275 try
2276 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002277 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002278 {
2279 return error(GL_INVALID_ENUM);
2280 }
2281
2282 switch (attachment)
2283 {
2284 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002285 case GL_DEPTH_ATTACHMENT:
2286 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002287 break;
2288 default:
2289 return error(GL_INVALID_ENUM);
2290 }
2291
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002292 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002293
2294 if (context)
2295 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002296 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002297 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002298 textarget = GL_NONE;
2299 }
2300 else
2301 {
2302 gl::Texture *tex = context->getTexture(texture);
2303
2304 if (tex == NULL)
2305 {
2306 return error(GL_INVALID_OPERATION);
2307 }
2308
daniel@transgaming.com01868132010-08-24 19:21:17 +00002309 if (tex->isCompressed())
2310 {
2311 return error(GL_INVALID_OPERATION);
2312 }
2313
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002314 switch (textarget)
2315 {
2316 case GL_TEXTURE_2D:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002317 if (tex->getTarget() != GL_TEXTURE_2D)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318 {
2319 return error(GL_INVALID_OPERATION);
2320 }
2321 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002322
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002323 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002324 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002329 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2330 {
2331 return error(GL_INVALID_OPERATION);
2332 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002334
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335 default:
2336 return error(GL_INVALID_ENUM);
2337 }
2338
2339 if (level != 0)
2340 {
2341 return error(GL_INVALID_VALUE);
2342 }
2343 }
2344
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002345 gl::Framebuffer *framebuffer = NULL;
2346 GLuint framebufferHandle = 0;
2347 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2348 {
2349 framebuffer = context->getReadFramebuffer();
2350 framebufferHandle = context->getReadFramebufferHandle();
2351 }
2352 else
2353 {
2354 framebuffer = context->getDrawFramebuffer();
2355 framebufferHandle = context->getDrawFramebufferHandle();
2356 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002358 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002359 {
2360 return error(GL_INVALID_OPERATION);
2361 }
2362
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002363 switch (attachment)
2364 {
2365 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2366 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2367 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2368 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
2370 }
2371 catch(std::bad_alloc&)
2372 {
2373 return error(GL_OUT_OF_MEMORY);
2374 }
2375}
2376
2377void __stdcall glFrontFace(GLenum mode)
2378{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002379 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002380
2381 try
2382 {
2383 switch (mode)
2384 {
2385 case GL_CW:
2386 case GL_CCW:
2387 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002388 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389
2390 if (context)
2391 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002392 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002393 }
2394 }
2395 break;
2396 default:
2397 return error(GL_INVALID_ENUM);
2398 }
2399 }
2400 catch(std::bad_alloc&)
2401 {
2402 return error(GL_OUT_OF_MEMORY);
2403 }
2404}
2405
2406void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2407{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002408 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409
2410 try
2411 {
2412 if (n < 0)
2413 {
2414 return error(GL_INVALID_VALUE);
2415 }
2416
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002417 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002418
2419 if (context)
2420 {
2421 for (int i = 0; i < n; i++)
2422 {
2423 buffers[i] = context->createBuffer();
2424 }
2425 }
2426 }
2427 catch(std::bad_alloc&)
2428 {
2429 return error(GL_OUT_OF_MEMORY);
2430 }
2431}
2432
2433void __stdcall glGenerateMipmap(GLenum target)
2434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002435 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436
2437 try
2438 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002440
2441 if (context)
2442 {
2443 gl::Texture *texture;
2444
2445 switch (target)
2446 {
2447 case GL_TEXTURE_2D:
2448 texture = context->getTexture2D();
2449 break;
2450
2451 case GL_TEXTURE_CUBE_MAP:
2452 texture = context->getTextureCubeMap();
2453 break;
2454
2455 default:
2456 return error(GL_INVALID_ENUM);
2457 }
2458
daniel@transgaming.com01868132010-08-24 19:21:17 +00002459 if (texture->isCompressed())
2460 {
2461 return error(GL_INVALID_OPERATION);
2462 }
2463
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002464 texture->generateMipmaps();
2465 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466 }
2467 catch(std::bad_alloc&)
2468 {
2469 return error(GL_OUT_OF_MEMORY);
2470 }
2471}
2472
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002473void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002475 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002476
2477 try
2478 {
2479 if (n < 0)
2480 {
2481 return error(GL_INVALID_VALUE);
2482 }
2483
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002484 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002485
2486 if (context)
2487 {
2488 for (int i = 0; i < n; i++)
2489 {
2490 fences[i] = context->createFence();
2491 }
2492 }
2493 }
2494 catch(std::bad_alloc&)
2495 {
2496 return error(GL_OUT_OF_MEMORY);
2497 }
2498}
2499
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2501{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002502 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002503
2504 try
2505 {
2506 if (n < 0)
2507 {
2508 return error(GL_INVALID_VALUE);
2509 }
2510
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512
2513 if (context)
2514 {
2515 for (int i = 0; i < n; i++)
2516 {
2517 framebuffers[i] = context->createFramebuffer();
2518 }
2519 }
2520 }
2521 catch(std::bad_alloc&)
2522 {
2523 return error(GL_OUT_OF_MEMORY);
2524 }
2525}
2526
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002527void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2528{
2529 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2530
2531 try
2532 {
2533 if (n < 0)
2534 {
2535 return error(GL_INVALID_VALUE);
2536 }
2537
2538 gl::Context *context = gl::getNonLostContext();
2539
2540 if (context)
2541 {
2542 for (int i = 0; i < n; i++)
2543 {
2544 ids[i] = context->createQuery();
2545 }
2546 }
2547 }
2548 catch(std::bad_alloc&)
2549 {
2550 return error(GL_OUT_OF_MEMORY);
2551 }
2552}
2553
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002554void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2555{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002556 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002557
2558 try
2559 {
2560 if (n < 0)
2561 {
2562 return error(GL_INVALID_VALUE);
2563 }
2564
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002565 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566
2567 if (context)
2568 {
2569 for (int i = 0; i < n; i++)
2570 {
2571 renderbuffers[i] = context->createRenderbuffer();
2572 }
2573 }
2574 }
2575 catch(std::bad_alloc&)
2576 {
2577 return error(GL_OUT_OF_MEMORY);
2578 }
2579}
2580
2581void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002583 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002584
2585 try
2586 {
2587 if (n < 0)
2588 {
2589 return error(GL_INVALID_VALUE);
2590 }
2591
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002592 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002593
2594 if (context)
2595 {
2596 for (int i = 0; i < n; i++)
2597 {
2598 textures[i] = context->createTexture();
2599 }
2600 }
2601 }
2602 catch(std::bad_alloc&)
2603 {
2604 return error(GL_OUT_OF_MEMORY);
2605 }
2606}
2607
daniel@transgaming.com85423182010-04-22 13:35:27 +00002608void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002610 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002611 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002612 program, index, bufsize, length, size, type, name);
2613
2614 try
2615 {
2616 if (bufsize < 0)
2617 {
2618 return error(GL_INVALID_VALUE);
2619 }
2620
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002621 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002622
2623 if (context)
2624 {
2625 gl::Program *programObject = context->getProgram(program);
2626
2627 if (!programObject)
2628 {
2629 if (context->getShader(program))
2630 {
2631 return error(GL_INVALID_OPERATION);
2632 }
2633 else
2634 {
2635 return error(GL_INVALID_VALUE);
2636 }
2637 }
2638
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002639 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002640 {
2641 return error(GL_INVALID_VALUE);
2642 }
2643
2644 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2645 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002646 }
2647 catch(std::bad_alloc&)
2648 {
2649 return error(GL_OUT_OF_MEMORY);
2650 }
2651}
2652
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002653void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002654{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002655 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002656 "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 +00002657 program, index, bufsize, length, size, type, name);
2658
2659 try
2660 {
2661 if (bufsize < 0)
2662 {
2663 return error(GL_INVALID_VALUE);
2664 }
2665
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002667
2668 if (context)
2669 {
2670 gl::Program *programObject = context->getProgram(program);
2671
2672 if (!programObject)
2673 {
2674 if (context->getShader(program))
2675 {
2676 return error(GL_INVALID_OPERATION);
2677 }
2678 else
2679 {
2680 return error(GL_INVALID_VALUE);
2681 }
2682 }
2683
2684 if (index >= (GLuint)programObject->getActiveUniformCount())
2685 {
2686 return error(GL_INVALID_VALUE);
2687 }
2688
2689 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2690 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002691 }
2692 catch(std::bad_alloc&)
2693 {
2694 return error(GL_OUT_OF_MEMORY);
2695 }
2696}
2697
2698void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002700 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 +00002701 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002702
2703 try
2704 {
2705 if (maxcount < 0)
2706 {
2707 return error(GL_INVALID_VALUE);
2708 }
2709
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002710 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002711
2712 if (context)
2713 {
2714 gl::Program *programObject = context->getProgram(program);
2715
2716 if (!programObject)
2717 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002718 if (context->getShader(program))
2719 {
2720 return error(GL_INVALID_OPERATION);
2721 }
2722 else
2723 {
2724 return error(GL_INVALID_VALUE);
2725 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002726 }
2727
2728 return programObject->getAttachedShaders(maxcount, count, shaders);
2729 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002730 }
2731 catch(std::bad_alloc&)
2732 {
2733 return error(GL_OUT_OF_MEMORY);
2734 }
2735}
2736
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002737int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002739 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740
2741 try
2742 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002743 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002744
2745 if (context)
2746 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002747
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002748 gl::Program *programObject = context->getProgram(program);
2749
2750 if (!programObject)
2751 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002752 if (context->getShader(program))
2753 {
2754 return error(GL_INVALID_OPERATION, -1);
2755 }
2756 else
2757 {
2758 return error(GL_INVALID_VALUE, -1);
2759 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002760 }
2761
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002762 if (!programObject->isLinked())
2763 {
2764 return error(GL_INVALID_OPERATION, -1);
2765 }
2766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767 return programObject->getAttributeLocation(name);
2768 }
2769 }
2770 catch(std::bad_alloc&)
2771 {
2772 return error(GL_OUT_OF_MEMORY, -1);
2773 }
2774
2775 return -1;
2776}
2777
2778void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002780 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002781
2782 try
2783 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002784 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002785
2786 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002787 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002788 if (!(context->getBooleanv(pname, params)))
2789 {
2790 GLenum nativeType;
2791 unsigned int numParams = 0;
2792 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2793 return error(GL_INVALID_ENUM);
2794
2795 if (numParams == 0)
2796 return; // it is known that the pname is valid, but there are no parameters to return
2797
2798 if (nativeType == GL_FLOAT)
2799 {
2800 GLfloat *floatParams = NULL;
2801 floatParams = new GLfloat[numParams];
2802
2803 context->getFloatv(pname, floatParams);
2804
2805 for (unsigned int i = 0; i < numParams; ++i)
2806 {
2807 if (floatParams[i] == 0.0f)
2808 params[i] = GL_FALSE;
2809 else
2810 params[i] = GL_TRUE;
2811 }
2812
2813 delete [] floatParams;
2814 }
2815 else if (nativeType == GL_INT)
2816 {
2817 GLint *intParams = NULL;
2818 intParams = new GLint[numParams];
2819
2820 context->getIntegerv(pname, intParams);
2821
2822 for (unsigned int i = 0; i < numParams; ++i)
2823 {
2824 if (intParams[i] == 0)
2825 params[i] = GL_FALSE;
2826 else
2827 params[i] = GL_TRUE;
2828 }
2829
2830 delete [] intParams;
2831 }
2832 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002833 }
2834 }
2835 catch(std::bad_alloc&)
2836 {
2837 return error(GL_OUT_OF_MEMORY);
2838 }
2839}
2840
2841void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002843 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 +00002844
2845 try
2846 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002847 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002848
2849 if (context)
2850 {
2851 gl::Buffer *buffer;
2852
2853 switch (target)
2854 {
2855 case GL_ARRAY_BUFFER:
2856 buffer = context->getArrayBuffer();
2857 break;
2858 case GL_ELEMENT_ARRAY_BUFFER:
2859 buffer = context->getElementArrayBuffer();
2860 break;
2861 default: return error(GL_INVALID_ENUM);
2862 }
2863
2864 if (!buffer)
2865 {
2866 // A null buffer means that "0" is bound to the requested buffer target
2867 return error(GL_INVALID_OPERATION);
2868 }
2869
2870 switch (pname)
2871 {
2872 case GL_BUFFER_USAGE:
2873 *params = buffer->usage();
2874 break;
2875 case GL_BUFFER_SIZE:
2876 *params = buffer->size();
2877 break;
2878 default: return error(GL_INVALID_ENUM);
2879 }
2880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881 }
2882 catch(std::bad_alloc&)
2883 {
2884 return error(GL_OUT_OF_MEMORY);
2885 }
2886}
2887
2888GLenum __stdcall glGetError(void)
2889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002890 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002891
2892 gl::Context *context = gl::getContext();
2893
2894 if (context)
2895 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00002896 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897 }
2898
2899 return GL_NO_ERROR;
2900}
2901
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002902void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002904 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002905
2906 try
2907 {
2908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002909 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002910
2911 if (context)
2912 {
2913 gl::Fence *fenceObject = context->getFence(fence);
2914
2915 if (fenceObject == NULL)
2916 {
2917 return error(GL_INVALID_OPERATION);
2918 }
2919
2920 fenceObject->getFenceiv(pname, params);
2921 }
2922 }
2923 catch(std::bad_alloc&)
2924 {
2925 return error(GL_OUT_OF_MEMORY);
2926 }
2927}
2928
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002929void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2930{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002931 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002932
2933 try
2934 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002935 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002936
2937 if (context)
2938 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002939 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002940 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002941 GLenum nativeType;
2942 unsigned int numParams = 0;
2943 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2944 return error(GL_INVALID_ENUM);
2945
2946 if (numParams == 0)
2947 return; // it is known that the pname is valid, but that there are no parameters to return.
2948
2949 if (nativeType == GL_BOOL)
2950 {
2951 GLboolean *boolParams = NULL;
2952 boolParams = new GLboolean[numParams];
2953
2954 context->getBooleanv(pname, boolParams);
2955
2956 for (unsigned int i = 0; i < numParams; ++i)
2957 {
2958 if (boolParams[i] == GL_FALSE)
2959 params[i] = 0.0f;
2960 else
2961 params[i] = 1.0f;
2962 }
2963
2964 delete [] boolParams;
2965 }
2966 else if (nativeType == GL_INT)
2967 {
2968 GLint *intParams = NULL;
2969 intParams = new GLint[numParams];
2970
2971 context->getIntegerv(pname, intParams);
2972
2973 for (unsigned int i = 0; i < numParams; ++i)
2974 {
2975 params[i] = (GLfloat)intParams[i];
2976 }
2977
2978 delete [] intParams;
2979 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002980 }
2981 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002982 }
2983 catch(std::bad_alloc&)
2984 {
2985 return error(GL_OUT_OF_MEMORY);
2986 }
2987}
2988
2989void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002991 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 +00002992 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002993
2994 try
2995 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002996 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997
2998 if (context)
2999 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003000 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003001 {
3002 return error(GL_INVALID_ENUM);
3003 }
3004
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003005 gl::Framebuffer *framebuffer = NULL;
3006 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3007 {
3008 if(context->getReadFramebufferHandle() == 0)
3009 {
3010 return error(GL_INVALID_OPERATION);
3011 }
3012
3013 framebuffer = context->getReadFramebuffer();
3014 }
3015 else
3016 {
3017 if (context->getDrawFramebufferHandle() == 0)
3018 {
3019 return error(GL_INVALID_OPERATION);
3020 }
3021
3022 framebuffer = context->getDrawFramebuffer();
3023 }
3024
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003025 GLenum attachmentType;
3026 GLuint attachmentHandle;
3027 switch (attachment)
3028 {
3029 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003030 attachmentType = framebuffer->getColorbufferType();
3031 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003032 break;
3033 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003034 attachmentType = framebuffer->getDepthbufferType();
3035 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003036 break;
3037 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003038 attachmentType = framebuffer->getStencilbufferType();
3039 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003040 break;
3041 default: return error(GL_INVALID_ENUM);
3042 }
3043
3044 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003045 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003046 {
3047 attachmentObjectType = attachmentType;
3048 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003049 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003050 {
3051 attachmentObjectType = GL_TEXTURE;
3052 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003053 else
3054 {
3055 UNREACHABLE();
3056 return;
3057 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003058
3059 switch (pname)
3060 {
3061 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3062 *params = attachmentObjectType;
3063 break;
3064 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3065 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3066 {
3067 *params = attachmentHandle;
3068 }
3069 else
3070 {
3071 return error(GL_INVALID_ENUM);
3072 }
3073 break;
3074 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3075 if (attachmentObjectType == GL_TEXTURE)
3076 {
3077 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3078 }
3079 else
3080 {
3081 return error(GL_INVALID_ENUM);
3082 }
3083 break;
3084 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3085 if (attachmentObjectType == GL_TEXTURE)
3086 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003087 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003088 {
3089 *params = attachmentType;
3090 }
3091 else
3092 {
3093 *params = 0;
3094 }
3095 }
3096 else
3097 {
3098 return error(GL_INVALID_ENUM);
3099 }
3100 break;
3101 default:
3102 return error(GL_INVALID_ENUM);
3103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104 }
3105 }
3106 catch(std::bad_alloc&)
3107 {
3108 return error(GL_OUT_OF_MEMORY);
3109 }
3110}
3111
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003112GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3113{
3114 EVENT("()");
3115
3116 try
3117 {
3118 gl::Context *context = gl::getContext();
3119
3120 if (context)
3121 {
3122 return context->getResetStatus();
3123 }
3124
3125 return GL_NO_ERROR;
3126 }
3127 catch(std::bad_alloc&)
3128 {
3129 return GL_OUT_OF_MEMORY;
3130 }
3131}
3132
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003133void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003135 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003136
3137 try
3138 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140
3141 if (context)
3142 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003143 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003144 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003145 GLenum nativeType;
3146 unsigned int numParams = 0;
3147 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3148 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003150 if (numParams == 0)
3151 return; // it is known that pname is valid, but there are no parameters to return
3152
3153 if (nativeType == GL_BOOL)
3154 {
3155 GLboolean *boolParams = NULL;
3156 boolParams = new GLboolean[numParams];
3157
3158 context->getBooleanv(pname, boolParams);
3159
3160 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003161 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003162 if (boolParams[i] == GL_FALSE)
3163 params[i] = 0;
3164 else
3165 params[i] = 1;
3166 }
3167
3168 delete [] boolParams;
3169 }
3170 else if (nativeType == GL_FLOAT)
3171 {
3172 GLfloat *floatParams = NULL;
3173 floatParams = new GLfloat[numParams];
3174
3175 context->getFloatv(pname, floatParams);
3176
3177 for (unsigned int i = 0; i < numParams; ++i)
3178 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003179 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 +00003180 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003181 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003182 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003183 else
3184 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 +00003185 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003186
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003187 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003188 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189 }
3190 }
3191 }
3192 catch(std::bad_alloc&)
3193 {
3194 return error(GL_OUT_OF_MEMORY);
3195 }
3196}
3197
3198void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3199{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003200 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003201
3202 try
3203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205
3206 if (context)
3207 {
3208 gl::Program *programObject = context->getProgram(program);
3209
3210 if (!programObject)
3211 {
3212 return error(GL_INVALID_VALUE);
3213 }
3214
3215 switch (pname)
3216 {
3217 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003218 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219 return;
3220 case GL_LINK_STATUS:
3221 *params = programObject->isLinked();
3222 return;
3223 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003224 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225 return;
3226 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003227 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003228 return;
3229 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003230 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231 return;
3232 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003233 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234 return;
3235 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003236 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237 return;
3238 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003239 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003240 return;
3241 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003242 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003243 return;
3244 default:
3245 return error(GL_INVALID_ENUM);
3246 }
3247 }
3248 }
3249 catch(std::bad_alloc&)
3250 {
3251 return error(GL_OUT_OF_MEMORY);
3252 }
3253}
3254
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003255void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003257 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 +00003258 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259
3260 try
3261 {
3262 if (bufsize < 0)
3263 {
3264 return error(GL_INVALID_VALUE);
3265 }
3266
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003268
3269 if (context)
3270 {
3271 gl::Program *programObject = context->getProgram(program);
3272
3273 if (!programObject)
3274 {
3275 return error(GL_INVALID_VALUE);
3276 }
3277
3278 programObject->getInfoLog(bufsize, length, infolog);
3279 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 }
3281 catch(std::bad_alloc&)
3282 {
3283 return error(GL_OUT_OF_MEMORY);
3284 }
3285}
3286
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003287void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3288{
3289 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3290
3291 try
3292 {
3293 switch (pname)
3294 {
3295 case GL_CURRENT_QUERY_EXT:
3296 break;
3297 default:
3298 return error(GL_INVALID_ENUM);
3299 }
3300
3301 gl::Context *context = gl::getNonLostContext();
3302
3303 if (context)
3304 {
3305 params[0] = context->getActiveQuery(target);
3306 }
3307 }
3308 catch(std::bad_alloc&)
3309 {
3310 return error(GL_OUT_OF_MEMORY);
3311 }
3312}
3313
3314void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3315{
3316 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3317
3318 try
3319 {
3320 switch (pname)
3321 {
3322 case GL_QUERY_RESULT_EXT:
3323 case GL_QUERY_RESULT_AVAILABLE_EXT:
3324 break;
3325 default:
3326 return error(GL_INVALID_ENUM);
3327 }
3328 gl::Context *context = gl::getNonLostContext();
3329
3330 if (context)
3331 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003332 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3333
3334 if (!queryObject)
3335 {
3336 return error(GL_INVALID_OPERATION);
3337 }
3338
3339 if (context->getActiveQuery(queryObject->getType()) == id)
3340 {
3341 return error(GL_INVALID_OPERATION);
3342 }
3343
3344 switch(pname)
3345 {
3346 case GL_QUERY_RESULT_EXT:
3347 params[0] = queryObject->getResult();
3348 break;
3349 case GL_QUERY_RESULT_AVAILABLE_EXT:
3350 params[0] = queryObject->isResultAvailable();
3351 break;
3352 default:
3353 ASSERT(false);
3354 }
3355 }
3356 }
3357 catch(std::bad_alloc&)
3358 {
3359 return error(GL_OUT_OF_MEMORY);
3360 }
3361}
3362
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003363void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3364{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003365 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 +00003366
3367 try
3368 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003369 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003370
3371 if (context)
3372 {
3373 if (target != GL_RENDERBUFFER)
3374 {
3375 return error(GL_INVALID_ENUM);
3376 }
3377
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003378 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003379 {
3380 return error(GL_INVALID_OPERATION);
3381 }
3382
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003383 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003384
3385 switch (pname)
3386 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003387 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3388 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3389 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3390 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3391 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3392 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3393 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3394 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3395 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003396 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003397 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003398 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003399 *params = renderbuffer->getSamples();
3400 }
3401 else
3402 {
3403 return error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003404 }
3405 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003406 default:
3407 return error(GL_INVALID_ENUM);
3408 }
3409 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003410 }
3411 catch(std::bad_alloc&)
3412 {
3413 return error(GL_OUT_OF_MEMORY);
3414 }
3415}
3416
3417void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3418{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003419 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420
3421 try
3422 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003423 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424
3425 if (context)
3426 {
3427 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003428
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003429 if (!shaderObject)
3430 {
3431 return error(GL_INVALID_VALUE);
3432 }
3433
3434 switch (pname)
3435 {
3436 case GL_SHADER_TYPE:
3437 *params = shaderObject->getType();
3438 return;
3439 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003440 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441 return;
3442 case GL_COMPILE_STATUS:
3443 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3444 return;
3445 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003446 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 return;
3448 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003449 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003451 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3452 *params = shaderObject->getTranslatedSourceLength();
3453 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 default:
3455 return error(GL_INVALID_ENUM);
3456 }
3457 }
3458 }
3459 catch(std::bad_alloc&)
3460 {
3461 return error(GL_OUT_OF_MEMORY);
3462 }
3463}
3464
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003465void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003467 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 +00003468 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003469
3470 try
3471 {
3472 if (bufsize < 0)
3473 {
3474 return error(GL_INVALID_VALUE);
3475 }
3476
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003478
3479 if (context)
3480 {
3481 gl::Shader *shaderObject = context->getShader(shader);
3482
3483 if (!shaderObject)
3484 {
3485 return error(GL_INVALID_VALUE);
3486 }
3487
3488 shaderObject->getInfoLog(bufsize, length, infolog);
3489 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003490 }
3491 catch(std::bad_alloc&)
3492 {
3493 return error(GL_OUT_OF_MEMORY);
3494 }
3495}
3496
3497void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003499 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 +00003500 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501
3502 try
3503 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003504 switch (shadertype)
3505 {
3506 case GL_VERTEX_SHADER:
3507 case GL_FRAGMENT_SHADER:
3508 break;
3509 default:
3510 return error(GL_INVALID_ENUM);
3511 }
3512
3513 switch (precisiontype)
3514 {
3515 case GL_LOW_FLOAT:
3516 case GL_MEDIUM_FLOAT:
3517 case GL_HIGH_FLOAT:
3518 // Assume IEEE 754 precision
3519 range[0] = 127;
3520 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003521 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003522 break;
3523 case GL_LOW_INT:
3524 case GL_MEDIUM_INT:
3525 case GL_HIGH_INT:
3526 // Some (most) hardware only supports single-precision floating-point numbers,
3527 // which can accurately represent integers up to +/-16777216
3528 range[0] = 24;
3529 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003530 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003531 break;
3532 default:
3533 return error(GL_INVALID_ENUM);
3534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 }
3536 catch(std::bad_alloc&)
3537 {
3538 return error(GL_OUT_OF_MEMORY);
3539 }
3540}
3541
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003542void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003544 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 +00003545 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003546
3547 try
3548 {
3549 if (bufsize < 0)
3550 {
3551 return error(GL_INVALID_VALUE);
3552 }
3553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003555
3556 if (context)
3557 {
3558 gl::Shader *shaderObject = context->getShader(shader);
3559
3560 if (!shaderObject)
3561 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00003562 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003563 }
3564
3565 shaderObject->getSource(bufsize, length, source);
3566 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003567 }
3568 catch(std::bad_alloc&)
3569 {
3570 return error(GL_OUT_OF_MEMORY);
3571 }
3572}
3573
zmo@google.coma574f782011-10-03 21:45:23 +00003574void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3575{
3576 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3577 shader, bufsize, length, source);
3578
3579 try
3580 {
3581 if (bufsize < 0)
3582 {
3583 return error(GL_INVALID_VALUE);
3584 }
3585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003586 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003587
3588 if (context)
3589 {
3590 gl::Shader *shaderObject = context->getShader(shader);
3591
3592 if (!shaderObject)
3593 {
3594 return error(GL_INVALID_OPERATION);
3595 }
3596
3597 shaderObject->getTranslatedSource(bufsize, length, source);
3598 }
3599 }
3600 catch(std::bad_alloc&)
3601 {
3602 return error(GL_OUT_OF_MEMORY);
3603 }
3604}
3605
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003606const GLubyte* __stdcall glGetString(GLenum name)
3607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003608 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003609
3610 try
3611 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003613
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003614 switch (name)
3615 {
3616 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003617 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003618 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003619 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003620 case GL_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003621 return (GLubyte*)"OpenGL ES 2.0 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003623 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE "VERSION_STRING")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003624 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003625 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 default:
3627 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
3628 }
3629 }
3630 catch(std::bad_alloc&)
3631 {
3632 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003634}
3635
3636void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3637{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003638 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 +00003639
3640 try
3641 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003642 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003643
3644 if (context)
3645 {
3646 gl::Texture *texture;
3647
3648 switch (target)
3649 {
3650 case GL_TEXTURE_2D:
3651 texture = context->getTexture2D();
3652 break;
3653 case GL_TEXTURE_CUBE_MAP:
3654 texture = context->getTextureCubeMap();
3655 break;
3656 default:
3657 return error(GL_INVALID_ENUM);
3658 }
3659
3660 switch (pname)
3661 {
3662 case GL_TEXTURE_MAG_FILTER:
3663 *params = (GLfloat)texture->getMagFilter();
3664 break;
3665 case GL_TEXTURE_MIN_FILTER:
3666 *params = (GLfloat)texture->getMinFilter();
3667 break;
3668 case GL_TEXTURE_WRAP_S:
3669 *params = (GLfloat)texture->getWrapS();
3670 break;
3671 case GL_TEXTURE_WRAP_T:
3672 *params = (GLfloat)texture->getWrapT();
3673 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003674 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3675 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3676 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003677 case GL_TEXTURE_USAGE_ANGLE:
3678 *params = (GLfloat)texture->getUsage();
3679 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003680 default:
3681 return error(GL_INVALID_ENUM);
3682 }
3683 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003684 }
3685 catch(std::bad_alloc&)
3686 {
3687 return error(GL_OUT_OF_MEMORY);
3688 }
3689}
3690
3691void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003693 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 +00003694
3695 try
3696 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003697 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003698
3699 if (context)
3700 {
3701 gl::Texture *texture;
3702
3703 switch (target)
3704 {
3705 case GL_TEXTURE_2D:
3706 texture = context->getTexture2D();
3707 break;
3708 case GL_TEXTURE_CUBE_MAP:
3709 texture = context->getTextureCubeMap();
3710 break;
3711 default:
3712 return error(GL_INVALID_ENUM);
3713 }
3714
3715 switch (pname)
3716 {
3717 case GL_TEXTURE_MAG_FILTER:
3718 *params = texture->getMagFilter();
3719 break;
3720 case GL_TEXTURE_MIN_FILTER:
3721 *params = texture->getMinFilter();
3722 break;
3723 case GL_TEXTURE_WRAP_S:
3724 *params = texture->getWrapS();
3725 break;
3726 case GL_TEXTURE_WRAP_T:
3727 *params = texture->getWrapT();
3728 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003729 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3730 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3731 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003732 case GL_TEXTURE_USAGE_ANGLE:
3733 *params = texture->getUsage();
3734 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003735 default:
3736 return error(GL_INVALID_ENUM);
3737 }
3738 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003739 }
3740 catch(std::bad_alloc&)
3741 {
3742 return error(GL_OUT_OF_MEMORY);
3743 }
3744}
3745
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003746void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3747{
3748 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3749 program, location, bufSize, params);
3750
3751 try
3752 {
3753 if (bufSize < 0)
3754 {
3755 return error(GL_INVALID_VALUE);
3756 }
3757
3758 gl::Context *context = gl::getNonLostContext();
3759
3760 if (context)
3761 {
3762 if (program == 0)
3763 {
3764 return error(GL_INVALID_VALUE);
3765 }
3766
3767 gl::Program *programObject = context->getProgram(program);
3768
3769 if (!programObject || !programObject->isLinked())
3770 {
3771 return error(GL_INVALID_OPERATION);
3772 }
3773
3774 if (!programObject->getUniformfv(location, &bufSize, params))
3775 {
3776 return error(GL_INVALID_OPERATION);
3777 }
3778 }
3779 }
3780 catch(std::bad_alloc&)
3781 {
3782 return error(GL_OUT_OF_MEMORY);
3783 }
3784}
3785
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003788 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789
3790 try
3791 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003793
3794 if (context)
3795 {
3796 if (program == 0)
3797 {
3798 return error(GL_INVALID_VALUE);
3799 }
3800
3801 gl::Program *programObject = context->getProgram(program);
3802
3803 if (!programObject || !programObject->isLinked())
3804 {
3805 return error(GL_INVALID_OPERATION);
3806 }
3807
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003808 if (!programObject->getUniformfv(location, NULL, params))
3809 {
3810 return error(GL_INVALID_OPERATION);
3811 }
3812 }
3813 }
3814 catch(std::bad_alloc&)
3815 {
3816 return error(GL_OUT_OF_MEMORY);
3817 }
3818}
3819
3820void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3821{
3822 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3823 program, location, bufSize, params);
3824
3825 try
3826 {
3827 if (bufSize < 0)
3828 {
3829 return error(GL_INVALID_VALUE);
3830 }
3831
3832 gl::Context *context = gl::getNonLostContext();
3833
3834 if (context)
3835 {
3836 if (program == 0)
3837 {
3838 return error(GL_INVALID_VALUE);
3839 }
3840
3841 gl::Program *programObject = context->getProgram(program);
3842
3843 if (!programObject || !programObject->isLinked())
3844 {
3845 return error(GL_INVALID_OPERATION);
3846 }
3847
3848 if (!programObject)
3849 {
3850 return error(GL_INVALID_OPERATION);
3851 }
3852
3853 if (!programObject->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003854 {
3855 return error(GL_INVALID_OPERATION);
3856 }
3857 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858 }
3859 catch(std::bad_alloc&)
3860 {
3861 return error(GL_OUT_OF_MEMORY);
3862 }
3863}
3864
3865void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003867 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003868
3869 try
3870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003872
3873 if (context)
3874 {
3875 if (program == 0)
3876 {
3877 return error(GL_INVALID_VALUE);
3878 }
3879
3880 gl::Program *programObject = context->getProgram(program);
3881
3882 if (!programObject || !programObject->isLinked())
3883 {
3884 return error(GL_INVALID_OPERATION);
3885 }
3886
3887 if (!programObject)
3888 {
3889 return error(GL_INVALID_OPERATION);
3890 }
3891
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003892 if (!programObject->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003893 {
3894 return error(GL_INVALID_OPERATION);
3895 }
3896 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003897 }
3898 catch(std::bad_alloc&)
3899 {
3900 return error(GL_OUT_OF_MEMORY);
3901 }
3902}
3903
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003904int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003906 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003907
3908 try
3909 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003910 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003911
3912 if (strstr(name, "gl_") == name)
3913 {
3914 return -1;
3915 }
3916
3917 if (context)
3918 {
3919 gl::Program *programObject = context->getProgram(program);
3920
3921 if (!programObject)
3922 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00003923 if (context->getShader(program))
3924 {
3925 return error(GL_INVALID_OPERATION, -1);
3926 }
3927 else
3928 {
3929 return error(GL_INVALID_VALUE, -1);
3930 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931 }
3932
3933 if (!programObject->isLinked())
3934 {
3935 return error(GL_INVALID_OPERATION, -1);
3936 }
3937
daniel@transgaming.com024f1a92011-09-20 16:06:25 +00003938 return programObject->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939 }
3940 }
3941 catch(std::bad_alloc&)
3942 {
3943 return error(GL_OUT_OF_MEMORY, -1);
3944 }
3945
3946 return -1;
3947}
3948
3949void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003951 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003952
3953 try
3954 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003955 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003956
daniel@transgaming.come0078962010-04-15 20:45:08 +00003957 if (context)
3958 {
3959 if (index >= gl::MAX_VERTEX_ATTRIBS)
3960 {
3961 return error(GL_INVALID_VALUE);
3962 }
3963
daniel@transgaming.com83921382011-01-08 05:46:00 +00003964 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003965
daniel@transgaming.come0078962010-04-15 20:45:08 +00003966 switch (pname)
3967 {
3968 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00003969 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003970 break;
3971 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003972 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003973 break;
3974 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003975 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003976 break;
3977 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003978 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003979 break;
3980 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003981 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003982 break;
3983 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00003984 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00003985 break;
3986 case GL_CURRENT_VERTEX_ATTRIB:
3987 for (int i = 0; i < 4; ++i)
3988 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003989 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003990 }
3991 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003992 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
3993 *params = (GLfloat)attribState.mDivisor;
3994 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003995 default: return error(GL_INVALID_ENUM);
3996 }
3997 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998 }
3999 catch(std::bad_alloc&)
4000 {
4001 return error(GL_OUT_OF_MEMORY);
4002 }
4003}
4004
4005void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4006{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004007 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004008
4009 try
4010 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004011 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004012
daniel@transgaming.come0078962010-04-15 20:45:08 +00004013 if (context)
4014 {
4015 if (index >= gl::MAX_VERTEX_ATTRIBS)
4016 {
4017 return error(GL_INVALID_VALUE);
4018 }
4019
daniel@transgaming.com83921382011-01-08 05:46:00 +00004020 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004021
daniel@transgaming.come0078962010-04-15 20:45:08 +00004022 switch (pname)
4023 {
4024 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004025 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004026 break;
4027 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004028 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004029 break;
4030 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004031 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004032 break;
4033 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004034 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004035 break;
4036 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004037 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004038 break;
4039 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004040 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004041 break;
4042 case GL_CURRENT_VERTEX_ATTRIB:
4043 for (int i = 0; i < 4; ++i)
4044 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004045 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004046 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4047 }
4048 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004049 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4050 *params = (GLint)attribState.mDivisor;
4051 break;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004052 default: return error(GL_INVALID_ENUM);
4053 }
4054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055 }
4056 catch(std::bad_alloc&)
4057 {
4058 return error(GL_OUT_OF_MEMORY);
4059 }
4060}
4061
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004062void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004064 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065
4066 try
4067 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004068 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004069
daniel@transgaming.come0078962010-04-15 20:45:08 +00004070 if (context)
4071 {
4072 if (index >= gl::MAX_VERTEX_ATTRIBS)
4073 {
4074 return error(GL_INVALID_VALUE);
4075 }
4076
4077 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4078 {
4079 return error(GL_INVALID_ENUM);
4080 }
4081
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004082 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004083 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084 }
4085 catch(std::bad_alloc&)
4086 {
4087 return error(GL_OUT_OF_MEMORY);
4088 }
4089}
4090
4091void __stdcall glHint(GLenum target, GLenum mode)
4092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004093 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094
4095 try
4096 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004097 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004098 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004099 case GL_FASTEST:
4100 case GL_NICEST:
4101 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004102 break;
4103 default:
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004104 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004105 }
4106
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004107 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004108 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004109 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004110 case GL_GENERATE_MIPMAP_HINT:
4111 if (context) context->setGenerateMipmapHint(mode);
4112 break;
4113 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4114 if (context) context->setFragmentShaderDerivativeHint(mode);
4115 break;
4116 default:
4117 return error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004118 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 }
4120 catch(std::bad_alloc&)
4121 {
4122 return error(GL_OUT_OF_MEMORY);
4123 }
4124}
4125
4126GLboolean __stdcall glIsBuffer(GLuint buffer)
4127{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004128 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004129
4130 try
4131 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004133
4134 if (context && buffer)
4135 {
4136 gl::Buffer *bufferObject = context->getBuffer(buffer);
4137
4138 if (bufferObject)
4139 {
4140 return GL_TRUE;
4141 }
4142 }
4143 }
4144 catch(std::bad_alloc&)
4145 {
4146 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4147 }
4148
4149 return GL_FALSE;
4150}
4151
4152GLboolean __stdcall glIsEnabled(GLenum cap)
4153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004154 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155
4156 try
4157 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159
4160 if (context)
4161 {
4162 switch (cap)
4163 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004164 case GL_CULL_FACE: return context->isCullFaceEnabled();
4165 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4166 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4167 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4168 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4169 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4170 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4171 case GL_BLEND: return context->isBlendEnabled();
4172 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004173 default:
4174 return error(GL_INVALID_ENUM, false);
4175 }
4176 }
4177 }
4178 catch(std::bad_alloc&)
4179 {
4180 return error(GL_OUT_OF_MEMORY, false);
4181 }
4182
4183 return false;
4184}
4185
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004186GLboolean __stdcall glIsFenceNV(GLuint fence)
4187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004188 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004189
4190 try
4191 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004192 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004193
4194 if (context)
4195 {
4196 gl::Fence *fenceObject = context->getFence(fence);
4197
4198 if (fenceObject == NULL)
4199 {
4200 return GL_FALSE;
4201 }
4202
4203 return fenceObject->isFence();
4204 }
4205 }
4206 catch(std::bad_alloc&)
4207 {
4208 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4209 }
4210
4211 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004212}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004214GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004216 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004217
4218 try
4219 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004221
4222 if (context && framebuffer)
4223 {
4224 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4225
4226 if (framebufferObject)
4227 {
4228 return GL_TRUE;
4229 }
4230 }
4231 }
4232 catch(std::bad_alloc&)
4233 {
4234 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4235 }
4236
4237 return GL_FALSE;
4238}
4239
4240GLboolean __stdcall glIsProgram(GLuint program)
4241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004242 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243
4244 try
4245 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004246 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247
4248 if (context && program)
4249 {
4250 gl::Program *programObject = context->getProgram(program);
4251
4252 if (programObject)
4253 {
4254 return GL_TRUE;
4255 }
4256 }
4257 }
4258 catch(std::bad_alloc&)
4259 {
4260 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4261 }
4262
4263 return GL_FALSE;
4264}
4265
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004266GLboolean __stdcall glIsQueryEXT(GLuint id)
4267{
4268 EVENT("(GLuint id = %d)", id);
4269
4270 try
4271 {
4272 if (id == 0)
4273 {
4274 return GL_FALSE;
4275 }
4276
4277 gl::Context *context = gl::getNonLostContext();
4278
4279 if (context)
4280 {
4281 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4282
4283 if (queryObject)
4284 {
4285 return GL_TRUE;
4286 }
4287 }
4288 }
4289 catch(std::bad_alloc&)
4290 {
4291 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4292 }
4293
4294 return GL_FALSE;
4295}
4296
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004299 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300
4301 try
4302 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004303 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304
4305 if (context && renderbuffer)
4306 {
4307 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4308
4309 if (renderbufferObject)
4310 {
4311 return GL_TRUE;
4312 }
4313 }
4314 }
4315 catch(std::bad_alloc&)
4316 {
4317 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4318 }
4319
4320 return GL_FALSE;
4321}
4322
4323GLboolean __stdcall glIsShader(GLuint shader)
4324{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004325 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326
4327 try
4328 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330
4331 if (context && shader)
4332 {
4333 gl::Shader *shaderObject = context->getShader(shader);
4334
4335 if (shaderObject)
4336 {
4337 return GL_TRUE;
4338 }
4339 }
4340 }
4341 catch(std::bad_alloc&)
4342 {
4343 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4344 }
4345
4346 return GL_FALSE;
4347}
4348
4349GLboolean __stdcall glIsTexture(GLuint texture)
4350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004351 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352
4353 try
4354 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004355 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356
4357 if (context && texture)
4358 {
4359 gl::Texture *textureObject = context->getTexture(texture);
4360
4361 if (textureObject)
4362 {
4363 return GL_TRUE;
4364 }
4365 }
4366 }
4367 catch(std::bad_alloc&)
4368 {
4369 return error(GL_OUT_OF_MEMORY, GL_FALSE);
4370 }
4371
4372 return GL_FALSE;
4373}
4374
4375void __stdcall glLineWidth(GLfloat width)
4376{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004377 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378
4379 try
4380 {
4381 if (width <= 0.0f)
4382 {
4383 return error(GL_INVALID_VALUE);
4384 }
4385
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004386 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004387
4388 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004390 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004391 }
4392 }
4393 catch(std::bad_alloc&)
4394 {
4395 return error(GL_OUT_OF_MEMORY);
4396 }
4397}
4398
4399void __stdcall glLinkProgram(GLuint program)
4400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004401 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402
4403 try
4404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004405 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004406
4407 if (context)
4408 {
4409 gl::Program *programObject = context->getProgram(program);
4410
4411 if (!programObject)
4412 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004413 if (context->getShader(program))
4414 {
4415 return error(GL_INVALID_OPERATION);
4416 }
4417 else
4418 {
4419 return error(GL_INVALID_VALUE);
4420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 }
4422
4423 programObject->link();
4424 }
4425 }
4426 catch(std::bad_alloc&)
4427 {
4428 return error(GL_OUT_OF_MEMORY);
4429 }
4430}
4431
4432void __stdcall glPixelStorei(GLenum pname, GLint param)
4433{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004434 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004435
4436 try
4437 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004438 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004439
4440 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004442 switch (pname)
4443 {
4444 case GL_UNPACK_ALIGNMENT:
4445 if (param != 1 && param != 2 && param != 4 && param != 8)
4446 {
4447 return error(GL_INVALID_VALUE);
4448 }
4449
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004450 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004451 break;
4452
4453 case GL_PACK_ALIGNMENT:
4454 if (param != 1 && param != 2 && param != 4 && param != 8)
4455 {
4456 return error(GL_INVALID_VALUE);
4457 }
4458
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004459 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004460 break;
4461
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004462 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4463 context->setPackReverseRowOrder(param != 0);
4464 break;
4465
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004466 default:
4467 return error(GL_INVALID_ENUM);
4468 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469 }
4470 }
4471 catch(std::bad_alloc&)
4472 {
4473 return error(GL_OUT_OF_MEMORY);
4474 }
4475}
4476
4477void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004479 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004480
4481 try
4482 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004484
4485 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004487 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004488 }
4489 }
4490 catch(std::bad_alloc&)
4491 {
4492 return error(GL_OUT_OF_MEMORY);
4493 }
4494}
4495
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004496void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4497 GLenum format, GLenum type, GLsizei bufSize,
4498 GLvoid *data)
4499{
4500 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4501 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4502 x, y, width, height, format, type, bufSize, data);
4503
4504 try
4505 {
4506 if (width < 0 || height < 0 || bufSize < 0)
4507 {
4508 return error(GL_INVALID_VALUE);
4509 }
4510
4511 if (!validReadFormatType(format, type))
4512 {
4513 return error(GL_INVALID_OPERATION);
4514 }
4515
4516 gl::Context *context = gl::getNonLostContext();
4517
4518 if (context)
4519 {
4520 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4521 }
4522 }
4523 catch(std::bad_alloc&)
4524 {
4525 return error(GL_OUT_OF_MEMORY);
4526 }
4527}
4528
4529void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4530 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004532 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004533 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004534 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004535
4536 try
4537 {
4538 if (width < 0 || height < 0)
4539 {
4540 return error(GL_INVALID_VALUE);
4541 }
4542
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004543 if (!validReadFormatType(format, type))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004544 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 return error(GL_INVALID_OPERATION);
4546 }
4547
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004548 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004549
4550 if (context)
4551 {
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004552 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553 }
4554 }
4555 catch(std::bad_alloc&)
4556 {
4557 return error(GL_OUT_OF_MEMORY);
4558 }
4559}
4560
4561void __stdcall glReleaseShaderCompiler(void)
4562{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004563 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564
4565 try
4566 {
4567 gl::Shader::releaseCompiler();
4568 }
4569 catch(std::bad_alloc&)
4570 {
4571 return error(GL_OUT_OF_MEMORY);
4572 }
4573}
4574
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004575void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004577 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 +00004578 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579
4580 try
4581 {
4582 switch (target)
4583 {
4584 case GL_RENDERBUFFER:
4585 break;
4586 default:
4587 return error(GL_INVALID_ENUM);
4588 }
4589
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004590 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592 return error(GL_INVALID_ENUM);
4593 }
4594
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004595 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004596 {
4597 return error(GL_INVALID_VALUE);
4598 }
4599
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004601
4602 if (context)
4603 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004604 if (width > context->getMaximumRenderbufferDimension() ||
4605 height > context->getMaximumRenderbufferDimension() ||
4606 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004607 {
4608 return error(GL_INVALID_VALUE);
4609 }
4610
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004611 GLuint handle = context->getRenderbufferHandle();
4612 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004613 {
4614 return error(GL_INVALID_OPERATION);
4615 }
4616
4617 switch (internalformat)
4618 {
4619 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004620 context->setRenderbufferStorage(new gl::Depthbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004621 break;
4622 case GL_RGBA4:
4623 case GL_RGB5_A1:
4624 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004625 case GL_RGB8_OES:
4626 case GL_RGBA8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004627 context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 break;
4629 case GL_STENCIL_INDEX8:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004630 context->setRenderbufferStorage(new gl::Stencilbuffer(width, height, samples));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631 break;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004632 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004633 context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height, samples));
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004634 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635 default:
4636 return error(GL_INVALID_ENUM);
4637 }
4638 }
4639 }
4640 catch(std::bad_alloc&)
4641 {
4642 return error(GL_OUT_OF_MEMORY);
4643 }
4644}
4645
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004646void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4647{
4648 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4649}
4650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004651void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004653 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654
4655 try
4656 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004657 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004659 if (context)
4660 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004661 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004662 }
4663 }
4664 catch(std::bad_alloc&)
4665 {
4666 return error(GL_OUT_OF_MEMORY);
4667 }
4668}
4669
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004670void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004672 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004673
4674 try
4675 {
4676 if (condition != GL_ALL_COMPLETED_NV)
4677 {
4678 return error(GL_INVALID_ENUM);
4679 }
4680
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004681 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004682
4683 if (context)
4684 {
4685 gl::Fence *fenceObject = context->getFence(fence);
4686
4687 if (fenceObject == NULL)
4688 {
4689 return error(GL_INVALID_OPERATION);
4690 }
4691
4692 fenceObject->setFence(condition);
4693 }
4694 }
4695 catch(std::bad_alloc&)
4696 {
4697 return error(GL_OUT_OF_MEMORY);
4698 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004699}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004700
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004701void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4702{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004703 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 +00004704
4705 try
4706 {
4707 if (width < 0 || height < 0)
4708 {
4709 return error(GL_INVALID_VALUE);
4710 }
4711
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004712 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004713
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004714 if (context)
4715 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004716 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004717 }
4718 }
4719 catch(std::bad_alloc&)
4720 {
4721 return error(GL_OUT_OF_MEMORY);
4722 }
4723}
4724
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004725void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004727 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004728 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004729 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730
4731 try
4732 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004733 // No binary shader formats are supported.
4734 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735 }
4736 catch(std::bad_alloc&)
4737 {
4738 return error(GL_OUT_OF_MEMORY);
4739 }
4740}
4741
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004742void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004744 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 +00004745 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746
4747 try
4748 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004749 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750 {
4751 return error(GL_INVALID_VALUE);
4752 }
4753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755
4756 if (context)
4757 {
4758 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004759
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760 if (!shaderObject)
4761 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004762 if (context->getProgram(shader))
4763 {
4764 return error(GL_INVALID_OPERATION);
4765 }
4766 else
4767 {
4768 return error(GL_INVALID_VALUE);
4769 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770 }
4771
4772 shaderObject->setSource(count, string, length);
4773 }
4774 }
4775 catch(std::bad_alloc&)
4776 {
4777 return error(GL_OUT_OF_MEMORY);
4778 }
4779}
4780
4781void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4782{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004783 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784}
4785
4786void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004788 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 +00004789
4790 try
4791 {
4792 switch (face)
4793 {
4794 case GL_FRONT:
4795 case GL_BACK:
4796 case GL_FRONT_AND_BACK:
4797 break;
4798 default:
4799 return error(GL_INVALID_ENUM);
4800 }
4801
4802 switch (func)
4803 {
4804 case GL_NEVER:
4805 case GL_ALWAYS:
4806 case GL_LESS:
4807 case GL_LEQUAL:
4808 case GL_EQUAL:
4809 case GL_GEQUAL:
4810 case GL_GREATER:
4811 case GL_NOTEQUAL:
4812 break;
4813 default:
4814 return error(GL_INVALID_ENUM);
4815 }
4816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818
4819 if (context)
4820 {
4821 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4822 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004823 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 }
4825
4826 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4827 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004828 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829 }
4830 }
4831 }
4832 catch(std::bad_alloc&)
4833 {
4834 return error(GL_OUT_OF_MEMORY);
4835 }
4836}
4837
4838void __stdcall glStencilMask(GLuint mask)
4839{
4840 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4841}
4842
4843void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004845 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846
4847 try
4848 {
4849 switch (face)
4850 {
4851 case GL_FRONT:
4852 case GL_BACK:
4853 case GL_FRONT_AND_BACK:
4854 break;
4855 default:
4856 return error(GL_INVALID_ENUM);
4857 }
4858
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860
4861 if (context)
4862 {
4863 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4864 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004865 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004866 }
4867
4868 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4869 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004870 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871 }
4872 }
4873 }
4874 catch(std::bad_alloc&)
4875 {
4876 return error(GL_OUT_OF_MEMORY);
4877 }
4878}
4879
4880void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4881{
4882 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4883}
4884
4885void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004887 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 +00004888 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004889
4890 try
4891 {
4892 switch (face)
4893 {
4894 case GL_FRONT:
4895 case GL_BACK:
4896 case GL_FRONT_AND_BACK:
4897 break;
4898 default:
4899 return error(GL_INVALID_ENUM);
4900 }
4901
4902 switch (fail)
4903 {
4904 case GL_ZERO:
4905 case GL_KEEP:
4906 case GL_REPLACE:
4907 case GL_INCR:
4908 case GL_DECR:
4909 case GL_INVERT:
4910 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004911 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004912 break;
4913 default:
4914 return error(GL_INVALID_ENUM);
4915 }
4916
4917 switch (zfail)
4918 {
4919 case GL_ZERO:
4920 case GL_KEEP:
4921 case GL_REPLACE:
4922 case GL_INCR:
4923 case GL_DECR:
4924 case GL_INVERT:
4925 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004926 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004927 break;
4928 default:
4929 return error(GL_INVALID_ENUM);
4930 }
4931
4932 switch (zpass)
4933 {
4934 case GL_ZERO:
4935 case GL_KEEP:
4936 case GL_REPLACE:
4937 case GL_INCR:
4938 case GL_DECR:
4939 case GL_INVERT:
4940 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004941 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004942 break;
4943 default:
4944 return error(GL_INVALID_ENUM);
4945 }
4946
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004947 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004948
4949 if (context)
4950 {
4951 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4952 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004953 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954 }
4955
4956 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4957 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004958 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004959 }
4960 }
4961 }
4962 catch(std::bad_alloc&)
4963 {
4964 return error(GL_OUT_OF_MEMORY);
4965 }
4966}
4967
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004968GLboolean __stdcall glTestFenceNV(GLuint fence)
4969{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004970 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004971
4972 try
4973 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004974 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004975
4976 if (context)
4977 {
4978 gl::Fence *fenceObject = context->getFence(fence);
4979
4980 if (fenceObject == NULL)
4981 {
4982 return error(GL_INVALID_OPERATION, GL_TRUE);
4983 }
4984
4985 return fenceObject->testFence();
4986 }
4987 }
4988 catch(std::bad_alloc&)
4989 {
4990 error(GL_OUT_OF_MEMORY);
4991 }
4992
4993 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004994}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004995
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004996void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4997 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004999 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 +00005000 "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 +00005001 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002
5003 try
5004 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005005 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005006 {
5007 return error(GL_INVALID_VALUE);
5008 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005009
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005010 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011 {
5012 return error(GL_INVALID_OPERATION);
5013 }
5014
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005015 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016 {
5017 case GL_ALPHA:
5018 case GL_LUMINANCE:
5019 case GL_LUMINANCE_ALPHA:
5020 switch (type)
5021 {
5022 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005023 case GL_FLOAT:
5024 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 break;
5026 default:
5027 return error(GL_INVALID_ENUM);
5028 }
5029 break;
5030 case GL_RGB:
5031 switch (type)
5032 {
5033 case GL_UNSIGNED_BYTE:
5034 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005035 case GL_FLOAT:
5036 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 break;
5038 default:
5039 return error(GL_INVALID_ENUM);
5040 }
5041 break;
5042 case GL_RGBA:
5043 switch (type)
5044 {
5045 case GL_UNSIGNED_BYTE:
5046 case GL_UNSIGNED_SHORT_4_4_4_4:
5047 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005048 case GL_FLOAT:
5049 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005050 break;
5051 default:
5052 return error(GL_INVALID_ENUM);
5053 }
5054 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005055 case GL_BGRA_EXT:
5056 switch (type)
5057 {
5058 case GL_UNSIGNED_BYTE:
5059 break;
5060 default:
5061 return error(GL_INVALID_ENUM);
5062 }
5063 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005064 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5065 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005066 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5067 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005068 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005069 default:
5070 return error(GL_INVALID_VALUE);
5071 }
5072
5073 if (border != 0)
5074 {
5075 return error(GL_INVALID_VALUE);
5076 }
5077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005078 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005079
5080 if (context)
5081 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005082 if (level > context->getMaximumTextureLevel())
5083 {
5084 return error(GL_INVALID_VALUE);
5085 }
5086
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005087 switch (target)
5088 {
5089 case GL_TEXTURE_2D:
5090 if (width > (context->getMaximumTextureDimension() >> level) ||
5091 height > (context->getMaximumTextureDimension() >> level))
5092 {
5093 return error(GL_INVALID_VALUE);
5094 }
5095 break;
5096 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5097 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5098 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5099 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5100 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5101 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5102 if (width != height)
5103 {
5104 return error(GL_INVALID_VALUE);
5105 }
5106
5107 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5108 height > (context->getMaximumCubeTextureDimension() >> level))
5109 {
5110 return error(GL_INVALID_VALUE);
5111 }
5112 break;
5113 default:
5114 return error(GL_INVALID_ENUM);
5115 }
5116
gman@chromium.org50c526d2011-08-10 05:19:44 +00005117 switch (format) {
5118 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5119 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5120 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005121 {
5122 return error(GL_INVALID_OPERATION);
5123 }
5124 else
5125 {
5126 return error(GL_INVALID_ENUM);
5127 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005128 break;
5129 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5130 if (context->supportsDXT3Textures())
5131 {
5132 return error(GL_INVALID_OPERATION);
5133 }
5134 else
5135 {
5136 return error(GL_INVALID_ENUM);
5137 }
5138 break;
5139 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5140 if (context->supportsDXT5Textures())
5141 {
5142 return error(GL_INVALID_OPERATION);
5143 }
5144 else
5145 {
5146 return error(GL_INVALID_ENUM);
5147 }
5148 break;
5149 default:
5150 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005151 }
5152
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005153 if (type == GL_FLOAT)
5154 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005155 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005156 {
5157 return error(GL_INVALID_ENUM);
5158 }
5159 }
5160 else if (type == GL_HALF_FLOAT_OES)
5161 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005162 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005163 {
5164 return error(GL_INVALID_ENUM);
5165 }
5166 }
5167
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005168 if (target == GL_TEXTURE_2D)
5169 {
5170 gl::Texture2D *texture = context->getTexture2D();
5171
5172 if (!texture)
5173 {
5174 return error(GL_INVALID_OPERATION);
5175 }
5176
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005177 if (texture->isImmutable())
5178 {
5179 return error(GL_INVALID_OPERATION);
5180 }
5181
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005182 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005183 }
5184 else
5185 {
5186 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5187
5188 if (!texture)
5189 {
5190 return error(GL_INVALID_OPERATION);
5191 }
5192
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005193 if (texture->isImmutable())
5194 {
5195 return error(GL_INVALID_OPERATION);
5196 }
5197
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 switch (target)
5199 {
5200 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005201 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005202 break;
5203 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005204 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005205 break;
5206 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005207 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208 break;
5209 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005210 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211 break;
5212 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005213 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214 break;
5215 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005216 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217 break;
5218 default: UNREACHABLE();
5219 }
5220 }
5221 }
5222 }
5223 catch(std::bad_alloc&)
5224 {
5225 return error(GL_OUT_OF_MEMORY);
5226 }
5227}
5228
5229void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5230{
5231 glTexParameteri(target, pname, (GLint)param);
5232}
5233
5234void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5235{
5236 glTexParameteri(target, pname, (GLint)*params);
5237}
5238
5239void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5240{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005241 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242
5243 try
5244 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005246
5247 if (context)
5248 {
5249 gl::Texture *texture;
5250
5251 switch (target)
5252 {
5253 case GL_TEXTURE_2D:
5254 texture = context->getTexture2D();
5255 break;
5256 case GL_TEXTURE_CUBE_MAP:
5257 texture = context->getTextureCubeMap();
5258 break;
5259 default:
5260 return error(GL_INVALID_ENUM);
5261 }
5262
5263 switch (pname)
5264 {
5265 case GL_TEXTURE_WRAP_S:
5266 if (!texture->setWrapS((GLenum)param))
5267 {
5268 return error(GL_INVALID_ENUM);
5269 }
5270 break;
5271 case GL_TEXTURE_WRAP_T:
5272 if (!texture->setWrapT((GLenum)param))
5273 {
5274 return error(GL_INVALID_ENUM);
5275 }
5276 break;
5277 case GL_TEXTURE_MIN_FILTER:
5278 if (!texture->setMinFilter((GLenum)param))
5279 {
5280 return error(GL_INVALID_ENUM);
5281 }
5282 break;
5283 case GL_TEXTURE_MAG_FILTER:
5284 if (!texture->setMagFilter((GLenum)param))
5285 {
5286 return error(GL_INVALID_ENUM);
5287 }
5288 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005289 case GL_TEXTURE_USAGE_ANGLE:
5290 if (!texture->setUsage((GLenum)param))
5291 {
5292 return error(GL_INVALID_ENUM);
5293 }
5294 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005295 default:
5296 return error(GL_INVALID_ENUM);
5297 }
5298 }
5299 }
5300 catch(std::bad_alloc&)
5301 {
5302 return error(GL_OUT_OF_MEMORY);
5303 }
5304}
5305
5306void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5307{
5308 glTexParameteri(target, pname, *params);
5309}
5310
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005311void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5312{
5313 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5314 target, levels, internalformat, width, height);
5315
5316 try
5317 {
5318 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5319 {
5320 return error(GL_INVALID_ENUM);
5321 }
5322
5323 if (width < 1 || height < 1 || levels < 1)
5324 {
5325 return error(GL_INVALID_VALUE);
5326 }
5327
5328 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5329 {
5330 return error(GL_INVALID_VALUE);
5331 }
5332
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005333 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005334 {
5335 return error(GL_INVALID_OPERATION);
5336 }
5337
5338 GLenum format = gl::ExtractFormat(internalformat);
5339 GLenum type = gl::ExtractType(internalformat);
5340
5341 if (format == GL_NONE || type == GL_NONE)
5342 {
5343 return error(GL_INVALID_ENUM);
5344 }
5345
5346 gl::Context *context = gl::getNonLostContext();
5347
5348 if (context)
5349 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005350 switch (target)
5351 {
5352 case GL_TEXTURE_2D:
5353 if (width > context->getMaximumTextureDimension() ||
5354 height > context->getMaximumTextureDimension())
5355 {
5356 return error(GL_INVALID_VALUE);
5357 }
5358 break;
5359 case GL_TEXTURE_CUBE_MAP:
5360 if (width > context->getMaximumCubeTextureDimension() ||
5361 height > context->getMaximumCubeTextureDimension())
5362 {
5363 return error(GL_INVALID_VALUE);
5364 }
5365 break;
5366 default:
5367 return error(GL_INVALID_ENUM);
5368 }
5369
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005370 if (levels != 1 && !context->supportsNonPower2Texture())
5371 {
5372 if (!gl::isPow2(width) || !gl::isPow2(height))
5373 {
5374 return error(GL_INVALID_OPERATION);
5375 }
5376 }
5377
daniel@transgaming.come1077362011-11-11 04:16:50 +00005378 switch (internalformat)
5379 {
5380 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5381 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5382 if (!context->supportsDXT1Textures())
5383 {
5384 return error(GL_INVALID_ENUM);
5385 }
5386 break;
5387 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5388 if (!context->supportsDXT3Textures())
5389 {
5390 return error(GL_INVALID_ENUM);
5391 }
5392 break;
5393 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5394 if (!context->supportsDXT5Textures())
5395 {
5396 return error(GL_INVALID_ENUM);
5397 }
5398 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005399 case GL_RGBA32F_EXT:
5400 case GL_RGB32F_EXT:
5401 case GL_ALPHA32F_EXT:
5402 case GL_LUMINANCE32F_EXT:
5403 case GL_LUMINANCE_ALPHA32F_EXT:
5404 if (!context->supportsFloat32Textures())
5405 {
5406 return error(GL_INVALID_ENUM);
5407 }
5408 break;
5409 case GL_RGBA16F_EXT:
5410 case GL_RGB16F_EXT:
5411 case GL_ALPHA16F_EXT:
5412 case GL_LUMINANCE16F_EXT:
5413 case GL_LUMINANCE_ALPHA16F_EXT:
5414 if (!context->supportsFloat16Textures())
5415 {
5416 return error(GL_INVALID_ENUM);
5417 }
5418 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005419 }
5420
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005421 if (target == GL_TEXTURE_2D)
5422 {
5423 gl::Texture2D *texture = context->getTexture2D();
5424
5425 if (!texture || texture->id() == 0)
5426 {
5427 return error(GL_INVALID_OPERATION);
5428 }
5429
5430 if (texture->isImmutable())
5431 {
5432 return error(GL_INVALID_OPERATION);
5433 }
5434
5435 texture->storage(levels, internalformat, width, height);
5436 }
5437 else if (target == GL_TEXTURE_CUBE_MAP)
5438 {
5439 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5440
5441 if (!texture || texture->id() == 0)
5442 {
5443 return error(GL_INVALID_OPERATION);
5444 }
5445
5446 if (texture->isImmutable())
5447 {
5448 return error(GL_INVALID_OPERATION);
5449 }
5450
5451 texture->storage(levels, internalformat, width);
5452 }
5453 else UNREACHABLE();
5454 }
5455 }
5456 catch(std::bad_alloc&)
5457 {
5458 return error(GL_OUT_OF_MEMORY);
5459 }
5460}
5461
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005462void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5463 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005465 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005466 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005467 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 target, level, xoffset, yoffset, width, height, format, type, pixels);
5469
5470 try
5471 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005472 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005473 {
5474 return error(GL_INVALID_ENUM);
5475 }
5476
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005477 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 {
5479 return error(GL_INVALID_VALUE);
5480 }
5481
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005482 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5483 {
5484 return error(GL_INVALID_VALUE);
5485 }
5486
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005487 if (!gl::CheckTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005488 {
5489 return error(GL_INVALID_ENUM);
5490 }
5491
5492 if (width == 0 || height == 0 || pixels == NULL)
5493 {
5494 return;
5495 }
5496
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005497 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005498
5499 if (context)
5500 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005501 if (level > context->getMaximumTextureLevel())
5502 {
5503 return error(GL_INVALID_VALUE);
5504 }
5505
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005506 if (format == GL_FLOAT)
5507 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005508 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005509 {
5510 return error(GL_INVALID_ENUM);
5511 }
5512 }
5513 else if (format == GL_HALF_FLOAT_OES)
5514 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005515 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005516 {
5517 return error(GL_INVALID_ENUM);
5518 }
5519 }
5520
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005521 if (target == GL_TEXTURE_2D)
5522 {
5523 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005524 if (validateSubImageParams(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005525 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005526 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005527 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005528 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005529 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005530 {
5531 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005532 if (validateSubImageParams(false, width, height, xoffset, yoffset, level, format, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005533 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005534 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005535 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005536 }
5537 else
5538 {
5539 UNREACHABLE();
5540 }
5541 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 }
5543 catch(std::bad_alloc&)
5544 {
5545 return error(GL_OUT_OF_MEMORY);
5546 }
5547}
5548
5549void __stdcall glUniform1f(GLint location, GLfloat x)
5550{
5551 glUniform1fv(location, 1, &x);
5552}
5553
5554void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5555{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005556 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557
5558 try
5559 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005560 if (count < 0)
5561 {
5562 return error(GL_INVALID_VALUE);
5563 }
5564
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005565 if (location == -1)
5566 {
5567 return;
5568 }
5569
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005570 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571
5572 if (context)
5573 {
5574 gl::Program *program = context->getCurrentProgram();
5575
5576 if (!program)
5577 {
5578 return error(GL_INVALID_OPERATION);
5579 }
5580
5581 if (!program->setUniform1fv(location, count, v))
5582 {
5583 return error(GL_INVALID_OPERATION);
5584 }
5585 }
5586 }
5587 catch(std::bad_alloc&)
5588 {
5589 return error(GL_OUT_OF_MEMORY);
5590 }
5591}
5592
5593void __stdcall glUniform1i(GLint location, GLint x)
5594{
5595 glUniform1iv(location, 1, &x);
5596}
5597
5598void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005600 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601
5602 try
5603 {
5604 if (count < 0)
5605 {
5606 return error(GL_INVALID_VALUE);
5607 }
5608
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005609 if (location == -1)
5610 {
5611 return;
5612 }
5613
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615
5616 if (context)
5617 {
5618 gl::Program *program = context->getCurrentProgram();
5619
5620 if (!program)
5621 {
5622 return error(GL_INVALID_OPERATION);
5623 }
5624
5625 if (!program->setUniform1iv(location, count, v))
5626 {
5627 return error(GL_INVALID_OPERATION);
5628 }
5629 }
5630 }
5631 catch(std::bad_alloc&)
5632 {
5633 return error(GL_OUT_OF_MEMORY);
5634 }
5635}
5636
5637void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5638{
5639 GLfloat xy[2] = {x, y};
5640
5641 glUniform2fv(location, 1, (GLfloat*)&xy);
5642}
5643
5644void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005646 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647
5648 try
5649 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650 if (count < 0)
5651 {
5652 return error(GL_INVALID_VALUE);
5653 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005654
5655 if (location == -1)
5656 {
5657 return;
5658 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 if (context)
5663 {
5664 gl::Program *program = context->getCurrentProgram();
5665
5666 if (!program)
5667 {
5668 return error(GL_INVALID_OPERATION);
5669 }
5670
5671 if (!program->setUniform2fv(location, count, v))
5672 {
5673 return error(GL_INVALID_OPERATION);
5674 }
5675 }
5676 }
5677 catch(std::bad_alloc&)
5678 {
5679 return error(GL_OUT_OF_MEMORY);
5680 }
5681}
5682
5683void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5684{
5685 GLint xy[4] = {x, y};
5686
5687 glUniform2iv(location, 1, (GLint*)&xy);
5688}
5689
5690void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005692 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693
5694 try
5695 {
5696 if (count < 0)
5697 {
5698 return error(GL_INVALID_VALUE);
5699 }
5700
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005701 if (location == -1)
5702 {
5703 return;
5704 }
5705
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005706 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005707
5708 if (context)
5709 {
5710 gl::Program *program = context->getCurrentProgram();
5711
5712 if (!program)
5713 {
5714 return error(GL_INVALID_OPERATION);
5715 }
5716
5717 if (!program->setUniform2iv(location, count, v))
5718 {
5719 return error(GL_INVALID_OPERATION);
5720 }
5721 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723 catch(std::bad_alloc&)
5724 {
5725 return error(GL_OUT_OF_MEMORY);
5726 }
5727}
5728
5729void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5730{
5731 GLfloat xyz[3] = {x, y, z};
5732
5733 glUniform3fv(location, 1, (GLfloat*)&xyz);
5734}
5735
5736void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005738 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739
5740 try
5741 {
5742 if (count < 0)
5743 {
5744 return error(GL_INVALID_VALUE);
5745 }
5746
5747 if (location == -1)
5748 {
5749 return;
5750 }
5751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753
5754 if (context)
5755 {
5756 gl::Program *program = context->getCurrentProgram();
5757
5758 if (!program)
5759 {
5760 return error(GL_INVALID_OPERATION);
5761 }
5762
5763 if (!program->setUniform3fv(location, count, v))
5764 {
5765 return error(GL_INVALID_OPERATION);
5766 }
5767 }
5768 }
5769 catch(std::bad_alloc&)
5770 {
5771 return error(GL_OUT_OF_MEMORY);
5772 }
5773}
5774
5775void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5776{
5777 GLint xyz[3] = {x, y, z};
5778
5779 glUniform3iv(location, 1, (GLint*)&xyz);
5780}
5781
5782void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5783{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005784 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005785
5786 try
5787 {
5788 if (count < 0)
5789 {
5790 return error(GL_INVALID_VALUE);
5791 }
5792
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005793 if (location == -1)
5794 {
5795 return;
5796 }
5797
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005798 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005799
5800 if (context)
5801 {
5802 gl::Program *program = context->getCurrentProgram();
5803
5804 if (!program)
5805 {
5806 return error(GL_INVALID_OPERATION);
5807 }
5808
5809 if (!program->setUniform3iv(location, count, v))
5810 {
5811 return error(GL_INVALID_OPERATION);
5812 }
5813 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005814 }
5815 catch(std::bad_alloc&)
5816 {
5817 return error(GL_OUT_OF_MEMORY);
5818 }
5819}
5820
5821void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5822{
5823 GLfloat xyzw[4] = {x, y, z, w};
5824
5825 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5826}
5827
5828void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005830 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831
5832 try
5833 {
5834 if (count < 0)
5835 {
5836 return error(GL_INVALID_VALUE);
5837 }
5838
5839 if (location == -1)
5840 {
5841 return;
5842 }
5843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845
5846 if (context)
5847 {
5848 gl::Program *program = context->getCurrentProgram();
5849
5850 if (!program)
5851 {
5852 return error(GL_INVALID_OPERATION);
5853 }
5854
5855 if (!program->setUniform4fv(location, count, v))
5856 {
5857 return error(GL_INVALID_OPERATION);
5858 }
5859 }
5860 }
5861 catch(std::bad_alloc&)
5862 {
5863 return error(GL_OUT_OF_MEMORY);
5864 }
5865}
5866
5867void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5868{
5869 GLint xyzw[4] = {x, y, z, w};
5870
5871 glUniform4iv(location, 1, (GLint*)&xyzw);
5872}
5873
5874void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5875{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005876 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005877
5878 try
5879 {
5880 if (count < 0)
5881 {
5882 return error(GL_INVALID_VALUE);
5883 }
5884
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005885 if (location == -1)
5886 {
5887 return;
5888 }
5889
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005891
5892 if (context)
5893 {
5894 gl::Program *program = context->getCurrentProgram();
5895
5896 if (!program)
5897 {
5898 return error(GL_INVALID_OPERATION);
5899 }
5900
5901 if (!program->setUniform4iv(location, count, v))
5902 {
5903 return error(GL_INVALID_OPERATION);
5904 }
5905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005906 }
5907 catch(std::bad_alloc&)
5908 {
5909 return error(GL_OUT_OF_MEMORY);
5910 }
5911}
5912
5913void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5914{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005915 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005916 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005917
5918 try
5919 {
5920 if (count < 0 || transpose != GL_FALSE)
5921 {
5922 return error(GL_INVALID_VALUE);
5923 }
5924
5925 if (location == -1)
5926 {
5927 return;
5928 }
5929
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931
5932 if (context)
5933 {
5934 gl::Program *program = context->getCurrentProgram();
5935
5936 if (!program)
5937 {
5938 return error(GL_INVALID_OPERATION);
5939 }
5940
5941 if (!program->setUniformMatrix2fv(location, count, value))
5942 {
5943 return error(GL_INVALID_OPERATION);
5944 }
5945 }
5946 }
5947 catch(std::bad_alloc&)
5948 {
5949 return error(GL_OUT_OF_MEMORY);
5950 }
5951}
5952
5953void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005955 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005956 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005957
5958 try
5959 {
5960 if (count < 0 || transpose != GL_FALSE)
5961 {
5962 return error(GL_INVALID_VALUE);
5963 }
5964
5965 if (location == -1)
5966 {
5967 return;
5968 }
5969
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971
5972 if (context)
5973 {
5974 gl::Program *program = context->getCurrentProgram();
5975
5976 if (!program)
5977 {
5978 return error(GL_INVALID_OPERATION);
5979 }
5980
5981 if (!program->setUniformMatrix3fv(location, count, value))
5982 {
5983 return error(GL_INVALID_OPERATION);
5984 }
5985 }
5986 }
5987 catch(std::bad_alloc&)
5988 {
5989 return error(GL_OUT_OF_MEMORY);
5990 }
5991}
5992
5993void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5994{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005995 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005996 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997
5998 try
5999 {
6000 if (count < 0 || transpose != GL_FALSE)
6001 {
6002 return error(GL_INVALID_VALUE);
6003 }
6004
6005 if (location == -1)
6006 {
6007 return;
6008 }
6009
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006010 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011
6012 if (context)
6013 {
6014 gl::Program *program = context->getCurrentProgram();
6015
6016 if (!program)
6017 {
6018 return error(GL_INVALID_OPERATION);
6019 }
6020
6021 if (!program->setUniformMatrix4fv(location, count, value))
6022 {
6023 return error(GL_INVALID_OPERATION);
6024 }
6025 }
6026 }
6027 catch(std::bad_alloc&)
6028 {
6029 return error(GL_OUT_OF_MEMORY);
6030 }
6031}
6032
6033void __stdcall glUseProgram(GLuint program)
6034{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006035 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036
6037 try
6038 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006039 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006040
6041 if (context)
6042 {
6043 gl::Program *programObject = context->getProgram(program);
6044
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006045 if (!programObject && program != 0)
6046 {
6047 if (context->getShader(program))
6048 {
6049 return error(GL_INVALID_OPERATION);
6050 }
6051 else
6052 {
6053 return error(GL_INVALID_VALUE);
6054 }
6055 }
6056
6057 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 {
6059 return error(GL_INVALID_OPERATION);
6060 }
6061
6062 context->useProgram(program);
6063 }
6064 }
6065 catch(std::bad_alloc&)
6066 {
6067 return error(GL_OUT_OF_MEMORY);
6068 }
6069}
6070
6071void __stdcall glValidateProgram(GLuint program)
6072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006073 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006074
6075 try
6076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006078
6079 if (context)
6080 {
6081 gl::Program *programObject = context->getProgram(program);
6082
6083 if (!programObject)
6084 {
6085 if (context->getShader(program))
6086 {
6087 return error(GL_INVALID_OPERATION);
6088 }
6089 else
6090 {
6091 return error(GL_INVALID_VALUE);
6092 }
6093 }
6094
6095 programObject->validate();
6096 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006097 }
6098 catch(std::bad_alloc&)
6099 {
6100 return error(GL_OUT_OF_MEMORY);
6101 }
6102}
6103
6104void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006106 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006107
6108 try
6109 {
6110 if (index >= gl::MAX_VERTEX_ATTRIBS)
6111 {
6112 return error(GL_INVALID_VALUE);
6113 }
6114
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006115 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006116
6117 if (context)
6118 {
6119 GLfloat vals[4] = { x, 0, 0, 1 };
6120 context->setVertexAttrib(index, vals);
6121 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006122 }
6123 catch(std::bad_alloc&)
6124 {
6125 return error(GL_OUT_OF_MEMORY);
6126 }
6127}
6128
6129void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006131 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132
6133 try
6134 {
6135 if (index >= gl::MAX_VERTEX_ATTRIBS)
6136 {
6137 return error(GL_INVALID_VALUE);
6138 }
6139
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006141
6142 if (context)
6143 {
6144 GLfloat vals[4] = { values[0], 0, 0, 1 };
6145 context->setVertexAttrib(index, vals);
6146 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006147 }
6148 catch(std::bad_alloc&)
6149 {
6150 return error(GL_OUT_OF_MEMORY);
6151 }
6152}
6153
6154void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6155{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006156 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006157
6158 try
6159 {
6160 if (index >= gl::MAX_VERTEX_ATTRIBS)
6161 {
6162 return error(GL_INVALID_VALUE);
6163 }
6164
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006166
6167 if (context)
6168 {
6169 GLfloat vals[4] = { x, y, 0, 1 };
6170 context->setVertexAttrib(index, vals);
6171 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006172 }
6173 catch(std::bad_alloc&)
6174 {
6175 return error(GL_OUT_OF_MEMORY);
6176 }
6177}
6178
6179void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006181 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006182
6183 try
6184 {
6185 if (index >= gl::MAX_VERTEX_ATTRIBS)
6186 {
6187 return error(GL_INVALID_VALUE);
6188 }
6189
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006190 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006191
6192 if (context)
6193 {
6194 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6195 context->setVertexAttrib(index, vals);
6196 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006197 }
6198 catch(std::bad_alloc&)
6199 {
6200 return error(GL_OUT_OF_MEMORY);
6201 }
6202}
6203
6204void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006206 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 +00006207
6208 try
6209 {
6210 if (index >= gl::MAX_VERTEX_ATTRIBS)
6211 {
6212 return error(GL_INVALID_VALUE);
6213 }
6214
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006216
6217 if (context)
6218 {
6219 GLfloat vals[4] = { x, y, z, 1 };
6220 context->setVertexAttrib(index, vals);
6221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222 }
6223 catch(std::bad_alloc&)
6224 {
6225 return error(GL_OUT_OF_MEMORY);
6226 }
6227}
6228
6229void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006231 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232
6233 try
6234 {
6235 if (index >= gl::MAX_VERTEX_ATTRIBS)
6236 {
6237 return error(GL_INVALID_VALUE);
6238 }
6239
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006241
6242 if (context)
6243 {
6244 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6245 context->setVertexAttrib(index, vals);
6246 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006247 }
6248 catch(std::bad_alloc&)
6249 {
6250 return error(GL_OUT_OF_MEMORY);
6251 }
6252}
6253
6254void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006256 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 +00006257
6258 try
6259 {
6260 if (index >= gl::MAX_VERTEX_ATTRIBS)
6261 {
6262 return error(GL_INVALID_VALUE);
6263 }
6264
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006266
6267 if (context)
6268 {
6269 GLfloat vals[4] = { x, y, z, w };
6270 context->setVertexAttrib(index, vals);
6271 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006272 }
6273 catch(std::bad_alloc&)
6274 {
6275 return error(GL_OUT_OF_MEMORY);
6276 }
6277}
6278
6279void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006281 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006282
6283 try
6284 {
6285 if (index >= gl::MAX_VERTEX_ATTRIBS)
6286 {
6287 return error(GL_INVALID_VALUE);
6288 }
6289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006291
6292 if (context)
6293 {
6294 context->setVertexAttrib(index, values);
6295 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006296 }
6297 catch(std::bad_alloc&)
6298 {
6299 return error(GL_OUT_OF_MEMORY);
6300 }
6301}
6302
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006303void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6304{
6305 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6306
6307 try
6308 {
6309 if (index >= gl::MAX_VERTEX_ATTRIBS)
6310 {
6311 return error(GL_INVALID_VALUE);
6312 }
6313
6314 gl::Context *context = gl::getNonLostContext();
6315
6316 if (context)
6317 {
6318 context->setVertexAttribDivisor(index, divisor);
6319 }
6320 }
6321 catch(std::bad_alloc&)
6322 {
6323 return error(GL_OUT_OF_MEMORY);
6324 }
6325}
6326
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006327void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006328{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006329 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006330 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006331 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006332
6333 try
6334 {
6335 if (index >= gl::MAX_VERTEX_ATTRIBS)
6336 {
6337 return error(GL_INVALID_VALUE);
6338 }
6339
6340 if (size < 1 || size > 4)
6341 {
6342 return error(GL_INVALID_VALUE);
6343 }
6344
6345 switch (type)
6346 {
6347 case GL_BYTE:
6348 case GL_UNSIGNED_BYTE:
6349 case GL_SHORT:
6350 case GL_UNSIGNED_SHORT:
6351 case GL_FIXED:
6352 case GL_FLOAT:
6353 break;
6354 default:
6355 return error(GL_INVALID_ENUM);
6356 }
6357
6358 if (stride < 0)
6359 {
6360 return error(GL_INVALID_VALUE);
6361 }
6362
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006363 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006364
6365 if (context)
6366 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006367 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006368 }
6369 }
6370 catch(std::bad_alloc&)
6371 {
6372 return error(GL_OUT_OF_MEMORY);
6373 }
6374}
6375
6376void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6377{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006378 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 +00006379
6380 try
6381 {
6382 if (width < 0 || height < 0)
6383 {
6384 return error(GL_INVALID_VALUE);
6385 }
6386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388
6389 if (context)
6390 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006391 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006392 }
6393 }
6394 catch(std::bad_alloc&)
6395 {
6396 return error(GL_OUT_OF_MEMORY);
6397 }
6398}
6399
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006400void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6401 GLbitfield mask, GLenum filter)
6402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006403 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006404 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6405 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6406 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6407
6408 try
6409 {
6410 switch (filter)
6411 {
6412 case GL_NEAREST:
6413 break;
6414 default:
6415 return error(GL_INVALID_ENUM);
6416 }
6417
6418 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6419 {
6420 return error(GL_INVALID_VALUE);
6421 }
6422
6423 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6424 {
6425 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
6426 return error(GL_INVALID_OPERATION);
6427 }
6428
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006429 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006430
6431 if (context)
6432 {
6433 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6434 {
6435 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
6436 return error(GL_INVALID_OPERATION);
6437 }
6438
6439 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6440 }
6441 }
6442 catch(std::bad_alloc&)
6443 {
6444 return error(GL_OUT_OF_MEMORY);
6445 }
6446}
6447
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006448void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6449 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006450{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006451 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006452 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006453 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006454 target, level, internalformat, width, height, depth, border, format, type, pixels);
6455
6456 try
6457 {
6458 UNIMPLEMENTED(); // FIXME
6459 }
6460 catch(std::bad_alloc&)
6461 {
6462 return error(GL_OUT_OF_MEMORY);
6463 }
6464}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006465
6466__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6467{
6468 struct Extension
6469 {
6470 const char *name;
6471 __eglMustCastToProperFunctionPointerType address;
6472 };
6473
6474 static const Extension glExtensions[] =
6475 {
6476 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006477 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006478 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006479 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6480 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6481 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6482 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6483 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6484 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6485 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006486 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006487 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006488 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6489 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6490 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6491 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006492 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6493 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6494 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6495 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6496 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6497 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6498 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006499 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6500 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6501 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006502 };
6503
6504 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6505 {
6506 if (strcmp(procname, glExtensions[ext].name) == 0)
6507 {
6508 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6509 }
6510 }
6511
6512 return NULL;
6513}
6514
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006515// Non-public functions used by EGL
6516
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006517bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006518{
6519 EVENT("(egl::Surface* surface = 0x%0.8p)",
6520 surface);
6521
6522 try
6523 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006524 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006525
6526 if (context)
6527 {
6528 gl::Texture2D *textureObject = context->getTexture2D();
6529
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006530 if (textureObject->isImmutable())
6531 {
6532 return false;
6533 }
6534
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006535 if (textureObject)
6536 {
6537 textureObject->bindTexImage(surface);
6538 }
6539 }
6540 }
6541 catch(std::bad_alloc&)
6542 {
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006543 return error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006544 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006545
6546 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006547}
6548
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006549}