blob: ed3073669724cba5dd61c8c395ad85dab8b989e9 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +000025bool validImageSize(const gl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000026{
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000027 if (level < 0 || width < 0 || height < 0 || depth < 0)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000028 {
29 return false;
30 }
31
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +000032 if (context->supportsNonPower2Texture())
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000033 {
34 return true;
35 }
36
37 if (level == 0)
38 {
39 return true;
40 }
41
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000042 if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000043 {
44 return true;
45 }
46
47 return false;
48}
49
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +000050bool validCompressedImageSize(GLsizei width, GLsizei height)
51{
52 if (width != 1 && width != 2 && width % 4 != 0)
53 {
54 return false;
55 }
56
57 if (height != 1 && height != 2 && height % 4 != 0)
58 {
59 return false;
60 }
61
62 return true;
63}
64
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000065// Verify that format/type are one of the combinations from table 3.4.
66bool checkTextureFormatType(GLenum format, GLenum type)
67{
68 // validate <format> by itself (used as secondary key below)
69 switch (format)
70 {
71 case GL_RGBA:
72 case GL_BGRA_EXT:
73 case GL_RGB:
74 case GL_ALPHA:
75 case GL_LUMINANCE:
76 case GL_LUMINANCE_ALPHA:
77 case GL_DEPTH_COMPONENT:
78 case GL_DEPTH_STENCIL_OES:
79 break;
80 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000081 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000082 }
83
84 // invalid <type> -> sets INVALID_ENUM
85 // invalid <format>+<type> combination -> sets INVALID_OPERATION
86 switch (type)
87 {
88 case GL_UNSIGNED_BYTE:
89 switch (format)
90 {
91 case GL_RGBA:
92 case GL_BGRA_EXT:
93 case GL_RGB:
94 case GL_ALPHA:
95 case GL_LUMINANCE:
96 case GL_LUMINANCE_ALPHA:
97 return true;
98 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000099 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000100 }
101
102 case GL_FLOAT:
103 case GL_HALF_FLOAT_OES:
104 switch (format)
105 {
106 case GL_RGBA:
107 case GL_RGB:
108 case GL_ALPHA:
109 case GL_LUMINANCE:
110 case GL_LUMINANCE_ALPHA:
111 return true;
112 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000113 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000114 }
115
116 case GL_UNSIGNED_SHORT_4_4_4_4:
117 case GL_UNSIGNED_SHORT_5_5_5_1:
118 switch (format)
119 {
120 case GL_RGBA:
121 return true;
122 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000123 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000124 }
125
126 case GL_UNSIGNED_SHORT_5_6_5:
127 switch (format)
128 {
129 case GL_RGB:
130 return true;
131 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000132 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000133 }
134
135 case GL_UNSIGNED_SHORT:
136 case GL_UNSIGNED_INT:
137 switch (format)
138 {
139 case GL_DEPTH_COMPONENT:
140 return true;
141 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000143 }
144
145 case GL_UNSIGNED_INT_24_8_OES:
146 switch (format)
147 {
148 case GL_DEPTH_STENCIL_OES:
149 return true;
150 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000151 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000152 }
153
154 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000156 }
157}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000158
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000159bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000160 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000161 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000162{
163 if (!texture)
164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000165 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000166 }
167
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000168 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000171 }
172
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000173 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000174 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000175 GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000176 if (internalformat != texture->getInternalFormat(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000179 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000180 }
181
182 if (compressed)
183 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000184 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
185 (height % 4 != 0 && height != texture->getHeight(0)))
186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000187 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000188 }
189 }
190
191 if (xoffset + width > texture->getWidth(level) ||
192 yoffset + height > texture->getHeight(level))
193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000194 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000195 }
196
197 return true;
198}
199
200bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000201 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000202 gl::TextureCubeMap *texture)
203{
204 if (!texture)
205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000206 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000207 }
208
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000211 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000212 }
213
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000214 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000215 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000216 GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000217 if (internalformat != texture->getInternalFormat(target, level))
218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000220 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000221 }
222
223 if (compressed)
224 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000225 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
226 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000228 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000229 }
230 }
231
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000232 if (xoffset + width > texture->getWidth(target, level) ||
233 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000235 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000236 }
237
238 return true;
239}
240
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000241bool validateES2TexImageParameters(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
242 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
243 GLint border, GLenum format, GLenum type, const GLvoid *pixels)
244{
245 if (!validImageSize(context, level, width, height, 1))
246 {
247 return gl::error(GL_INVALID_VALUE, false);
248 }
249
250 if (isCompressed && !validCompressedImageSize(width, height))
251 {
252 return gl::error(GL_INVALID_OPERATION, false);
253 }
254
255 if (level < 0 || xoffset < 0 ||
256 std::numeric_limits<GLsizei>::max() - xoffset < width ||
257 std::numeric_limits<GLsizei>::max() - yoffset < height)
258 {
259 return gl::error(GL_INVALID_VALUE, false);
260 }
261
262 if (!isSubImage && !isCompressed && internalformat != GLint(format))
263 {
264 return gl::error(GL_INVALID_OPERATION, false);
265 }
266
267 gl::Texture *texture = NULL;
268 bool textureCompressed = false;
269 GLenum textureInternalFormat = GL_NONE;
270 GLint textureLevelWidth = 0;
271 GLint textureLevelHeight = 0;
272 switch (target)
273 {
274 case GL_TEXTURE_2D:
275 {
276 if (width > (context->getMaximum2DTextureDimension() >> level) ||
277 height > (context->getMaximum2DTextureDimension() >> level))
278 {
279 return gl::error(GL_INVALID_VALUE, false);
280 }
281
282 gl::Texture2D *tex2d = context->getTexture2D();
283 if (tex2d)
284 {
285 textureCompressed = tex2d->isCompressed(level);
286 textureInternalFormat = tex2d->getInternalFormat(level);
287 textureLevelWidth = tex2d->getWidth(level);
288 textureLevelHeight = tex2d->getHeight(level);
289 texture = tex2d;
290 }
291
292 if (isSubImage && !validateSubImageParams2D(isCompressed, width, height, xoffset, yoffset,
293 level, format, type, tex2d))
294 {
295 return false;
296 }
297
298 texture = tex2d;
299 }
300 break;
301
302 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
303 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
304 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
305 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
306 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
307 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
308 {
309 if (!isSubImage && width != height)
310 {
311 return gl::error(GL_INVALID_VALUE, false);
312 }
313
314 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
315 height > (context->getMaximumCubeTextureDimension() >> level))
316 {
317 return gl::error(GL_INVALID_VALUE, false);
318 }
319
320 gl::TextureCubeMap *texCube = context->getTextureCubeMap();
321 if (texCube)
322 {
323 textureCompressed = texCube->isCompressed(target, level);
324 textureInternalFormat = texCube->getInternalFormat(target, level);
325 textureLevelWidth = texCube->getWidth(target, level);
326 textureLevelHeight = texCube->getHeight(target, level);
327 texture = texCube;
328 }
329
330 if (isSubImage && !validateSubImageParamsCube(isCompressed, width, height, xoffset, yoffset,
331 target, level, format, type, texCube))
332 {
333 return false;
334 }
335 }
336 break;
337
338 default:
339 return gl::error(GL_INVALID_ENUM, false);
340 }
341
342 if (!texture)
343 {
344 return gl::error(GL_INVALID_OPERATION, false);
345 }
346
347 if (!isSubImage && texture->isImmutable())
348 {
349 return gl::error(GL_INVALID_OPERATION, false);
350 }
351
352 // Verify zero border
353 if (border != 0)
354 {
355 return gl::error(GL_INVALID_VALUE, false);
356 }
357
358 // Verify texture is not requesting more mip levels than are available.
359 if (level > context->getMaximumTextureLevel())
360 {
361 return gl::error(GL_INVALID_VALUE, false);
362 }
363
364 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
365 if (isCompressed)
366 {
367 switch (actualInternalFormat)
368 {
369 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
370 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
371 if (!context->supportsDXT1Textures())
372 {
373 return gl::error(GL_INVALID_ENUM, false);
374 }
375 break;
376 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
377 if (!context->supportsDXT3Textures())
378 {
379 return gl::error(GL_INVALID_ENUM, false);
380 }
381 break;
382 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
383 if (!context->supportsDXT5Textures())
384 {
385 return gl::error(GL_INVALID_ENUM, false);
386 }
387 break;
388 default:
389 return gl::error(GL_INVALID_ENUM, false);
390 }
391 }
392 else
393 {
394 // validate <type> by itself (used as secondary key below)
395 switch (type)
396 {
397 case GL_UNSIGNED_BYTE:
398 case GL_UNSIGNED_SHORT_5_6_5:
399 case GL_UNSIGNED_SHORT_4_4_4_4:
400 case GL_UNSIGNED_SHORT_5_5_5_1:
401 case GL_UNSIGNED_SHORT:
402 case GL_UNSIGNED_INT:
403 case GL_UNSIGNED_INT_24_8_OES:
404 case GL_HALF_FLOAT_OES:
405 case GL_FLOAT:
406 break;
407 default:
408 return gl::error(GL_INVALID_ENUM, false);
409 }
410
411 // validate <format> + <type> combinations
412 // - invalid <format> -> sets INVALID_ENUM
413 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
414 switch (format)
415 {
416 case GL_ALPHA:
417 case GL_LUMINANCE:
418 case GL_LUMINANCE_ALPHA:
419 switch (type)
420 {
421 case GL_UNSIGNED_BYTE:
422 case GL_FLOAT:
423 case GL_HALF_FLOAT_OES:
424 break;
425 default:
426 return gl::error(GL_INVALID_OPERATION, false);
427 }
428 break;
429 case GL_RGB:
430 switch (type)
431 {
432 case GL_UNSIGNED_BYTE:
433 case GL_UNSIGNED_SHORT_5_6_5:
434 case GL_FLOAT:
435 case GL_HALF_FLOAT_OES:
436 break;
437 default:
438 return gl::error(GL_INVALID_OPERATION, false);
439 }
440 break;
441 case GL_RGBA:
442 switch (type)
443 {
444 case GL_UNSIGNED_BYTE:
445 case GL_UNSIGNED_SHORT_4_4_4_4:
446 case GL_UNSIGNED_SHORT_5_5_5_1:
447 case GL_FLOAT:
448 case GL_HALF_FLOAT_OES:
449 break;
450 default:
451 return gl::error(GL_INVALID_OPERATION, false);
452 }
453 break;
454 case GL_BGRA_EXT:
455 switch (type)
456 {
457 case GL_UNSIGNED_BYTE:
458 break;
459 default:
460 return gl::error(GL_INVALID_OPERATION, false);
461 }
462 break;
463 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
464 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
465 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
466 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
467 break;
468 case GL_DEPTH_COMPONENT:
469 switch (type)
470 {
471 case GL_UNSIGNED_SHORT:
472 case GL_UNSIGNED_INT:
473 break;
474 default:
475 return gl::error(GL_INVALID_OPERATION, false);
476 }
477 break;
478 case GL_DEPTH_STENCIL_OES:
479 switch (type)
480 {
481 case GL_UNSIGNED_INT_24_8_OES:
482 break;
483 default:
484 return gl::error(GL_INVALID_OPERATION, false);
485 }
486 break;
487 default:
488 return gl::error(GL_INVALID_ENUM, false);
489 }
490
491 switch (format)
492 {
493 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
494 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
495 if (context->supportsDXT1Textures())
496 {
497 return gl::error(GL_INVALID_OPERATION, false);
498 }
499 else
500 {
501 return gl::error(GL_INVALID_ENUM, false);
502 }
503 break;
504 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
505 if (context->supportsDXT3Textures())
506 {
507 return gl::error(GL_INVALID_OPERATION, false);
508 }
509 else
510 {
511 return gl::error(GL_INVALID_ENUM, false);
512 }
513 break;
514 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
515 if (context->supportsDXT5Textures())
516 {
517 return gl::error(GL_INVALID_OPERATION, false);
518 }
519 else
520 {
521 return gl::error(GL_INVALID_ENUM, false);
522 }
523 break;
524 case GL_DEPTH_COMPONENT:
525 case GL_DEPTH_STENCIL_OES:
526 if (!context->supportsDepthTextures())
527 {
528 return gl::error(GL_INVALID_VALUE, false);
529 }
530 if (target != GL_TEXTURE_2D)
531 {
532 return gl::error(GL_INVALID_OPERATION, false);
533 }
534 // OES_depth_texture supports loading depth data and multiple levels,
535 // but ANGLE_depth_texture does not
536 if (pixels != NULL || level != 0)
537 {
538 return gl::error(GL_INVALID_OPERATION, false);
539 }
540 break;
541 default:
542 break;
543 }
544
545 if (type == GL_FLOAT)
546 {
547 if (!context->supportsFloat32Textures())
548 {
549 return gl::error(GL_INVALID_ENUM, false);
550 }
551 }
552 else if (type == GL_HALF_FLOAT_OES)
553 {
554 if (!context->supportsFloat16Textures())
555 {
556 return gl::error(GL_INVALID_ENUM, false);
557 }
558 }
559 }
560
561 return true;
562}
563
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +0000564bool validateES3TexImageParameters(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
565 GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
566 GLint border, GLenum format, GLenum type)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000567{
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000568 // Validate image size
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000569 if (!validImageSize(context, level, width, height, depth))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000570 {
571 return gl::error(GL_INVALID_VALUE, false);
572 }
573
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000574 if (isCompressed && !validCompressedImageSize(width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000575 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000576 return gl::error(GL_INVALID_OPERATION, false);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000577 }
578
579 // Verify zero border
580 if (border != 0)
581 {
582 return gl::error(GL_INVALID_VALUE, false);
583 }
584
585 // Validate dimensions based on Context limits and validate the texture
586 if (level > context->getMaximumTextureLevel())
587 {
588 return gl::error(GL_INVALID_VALUE, false);
589 }
590
591 gl::Texture *texture = NULL;
592 bool textureCompressed = false;
593 GLenum textureInternalFormat = GL_NONE;
594 GLint textureLevelWidth = 0;
595 GLint textureLevelHeight = 0;
596 GLint textureLevelDepth = 0;
597 switch (target)
598 {
599 case GL_TEXTURE_2D:
600 {
601 if (width > (context->getMaximum2DTextureDimension() >> level) ||
602 height > (context->getMaximum2DTextureDimension() >> level))
603 {
604 return gl::error(GL_INVALID_VALUE, false);
605 }
606
607 gl::Texture2D *texture2d = context->getTexture2D();
608 if (texture2d)
609 {
610 textureCompressed = texture2d->isCompressed(level);
611 textureInternalFormat = texture2d->getInternalFormat(level);
612 textureLevelWidth = texture2d->getWidth(level);
613 textureLevelHeight = texture2d->getHeight(level);
614 textureLevelDepth = 1;
615 texture = texture2d;
616 }
617 }
618 break;
619
620 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
621 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
622 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
623 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
624 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
625 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
626 {
627 if (width != height)
628 {
629 return gl::error(GL_INVALID_VALUE, false);
630 }
631
632 if (width > (context->getMaximumCubeTextureDimension() >> level))
633 {
634 return gl::error(GL_INVALID_VALUE, false);
635 }
636
637 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
638 if (textureCube)
639 {
640 textureCompressed = textureCube->isCompressed(target, level);
641 textureInternalFormat = textureCube->getInternalFormat(target, level);
642 textureLevelWidth = textureCube->getWidth(target, level);
643 textureLevelHeight = textureCube->getHeight(target, level);
644 textureLevelDepth = 1;
645 texture = textureCube;
646 }
647 }
648 break;
649
650 case GL_TEXTURE_3D:
651 {
652 if (width > (context->getMaximum3DTextureDimension() >> level) ||
653 height > (context->getMaximum3DTextureDimension() >> level) ||
654 depth > (context->getMaximum3DTextureDimension() >> level))
655 {
656 return gl::error(GL_INVALID_VALUE, false);
657 }
658
659 gl::Texture3D *texture3d = context->getTexture3D();
660 if (texture3d)
661 {
662 textureCompressed = texture3d->isCompressed(level);
663 textureInternalFormat = texture3d->getInternalFormat(level);
664 textureLevelWidth = texture3d->getWidth(level);
665 textureLevelHeight = texture3d->getHeight(level);
666 textureLevelDepth = texture3d->getDepth(level);
667 texture = texture3d;
668 }
669 }
670 break;
671
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +0000672 case GL_TEXTURE_2D_ARRAY:
673 {
674 if (width > (context->getMaximum2DTextureDimension() >> level) ||
675 height > (context->getMaximum2DTextureDimension() >> level) ||
676 depth > (context->getMaximum2DArrayTextureLayers() >> level))
677 {
678 return gl::error(GL_INVALID_VALUE, false);
679 }
680
681 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
682 if (texture2darray)
683 {
684 textureCompressed = texture2darray->isCompressed(level);
685 textureInternalFormat = texture2darray->getInternalFormat(level);
686 textureLevelWidth = texture2darray->getWidth(level);
687 textureLevelHeight = texture2darray->getHeight(level);
688 textureLevelDepth = texture2darray->getDepth(level);
689 texture = texture2darray;
690 }
691 }
692 break;
693
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000694 default:
695 return gl::error(GL_INVALID_ENUM, false);
696 }
697
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000698 if (!texture)
699 {
700 return gl::error(GL_INVALID_OPERATION, false);
701 }
702
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000703 if (texture->isImmutable())
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000704 {
705 return gl::error(GL_INVALID_OPERATION, false);
706 }
707
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000708 // Validate texture formats
709 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
710 if (isCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000711 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000712 if (!gl::IsFormatCompressed(actualInternalFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000713 {
714 return gl::error(GL_INVALID_ENUM, false);
715 }
716
717 if (target == GL_TEXTURE_3D)
718 {
719 return gl::error(GL_INVALID_OPERATION, false);
720 }
721 }
722 else
723 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000724 if (!gl::IsValidInternalFormat(actualInternalFormat, context) ||
725 !gl::IsValidFormat(format, context->getClientVersion()) ||
726 !gl::IsValidType(type, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000727 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000728 return gl::error(GL_INVALID_ENUM, false);
729 }
730
731 if (!gl::IsValidFormatCombination(actualInternalFormat, format, type, context->getClientVersion()))
732 {
733 return gl::error(GL_INVALID_OPERATION, false);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000734 }
735
736 if ((target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) &&
737 (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000738 {
739 return gl::error(GL_INVALID_OPERATION, false);
740 }
741 }
742
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000743 // Validate sub image parameters
744 if (isSubImage)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000745 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000746 if (isCompressed != textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000747 {
748 return gl::error(GL_INVALID_OPERATION, false);
749 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000750
751 if (format != GL_NONE)
752 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000753 GLenum internalformat = gl::GetSizedInternalFormat(format, type, context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000754 if (internalformat != textureInternalFormat)
755 {
756 return gl::error(GL_INVALID_OPERATION, false);
757 }
758 }
759
760 if (isCompressed)
761 {
762 if ((width % 4 != 0 && width != textureLevelWidth) ||
763 (height % 4 != 0 && height != textureLevelHeight))
764 {
765 return gl::error(GL_INVALID_OPERATION, false);
766 }
767 }
768
769 if (width == 0 || height == 0 || depth == 0)
770 {
771 return false;
772 }
773
774 if (xoffset < 0 || yoffset < 0 || zoffset < 0)
775 {
776 return gl::error(GL_INVALID_VALUE, false);
777 }
778
779 if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
780 std::numeric_limits<GLsizei>::max() - yoffset < height ||
781 std::numeric_limits<GLsizei>::max() - zoffset < depth)
782 {
783 return gl::error(GL_INVALID_VALUE, false);
784 }
785
786 if (xoffset + width > textureLevelWidth ||
787 yoffset + height > textureLevelHeight ||
788 zoffset + depth > textureLevelDepth)
789 {
790 return gl::error(GL_INVALID_VALUE, false);
791 }
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000792 }
793
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000794 return true;
795}
796
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +0000797
798bool validateES2CopyTexImageParameters(gl::Context* context, GLenum target, GLint level, GLenum internalformat, bool isSubImage,
799 GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height,
800 GLint border)
801{
802 if (!gl::IsInternalTextureTarget(target))
803 {
804 return gl::error(GL_INVALID_ENUM, false);
805 }
806
807 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
808 {
809 return gl::error(GL_INVALID_VALUE, false);
810 }
811
812 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
813 {
814 return gl::error(GL_INVALID_VALUE, false);
815 }
816
817 if (width == 0 || height == 0)
818 {
819 return false;
820 }
821
822 // Verify zero border
823 if (border != 0)
824 {
825 return gl::error(GL_INVALID_VALUE, false);
826 }
827
828 // Validate dimensions based on Context limits and validate the texture
829 if (level > context->getMaximumTextureLevel())
830 {
831 return gl::error(GL_INVALID_VALUE, false);
832 }
833
834 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
835
836 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
837 {
838 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
839 }
840
841 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
842 {
843 return gl::error(GL_INVALID_OPERATION, false);
844 }
845
846 GLenum colorbufferFormat = framebuffer->getReadColorbuffer()->getInternalFormat();
847 gl::Texture *texture = NULL;
848 GLenum textureFormat = GL_RGBA;
849
850 switch (target)
851 {
852 case GL_TEXTURE_2D:
853 {
854 if (width > (context->getMaximum2DTextureDimension() >> level) ||
855 height > (context->getMaximum2DTextureDimension() >> level))
856 {
857 return gl::error(GL_INVALID_VALUE, false);
858 }
859
860 gl::Texture2D *tex2d = context->getTexture2D();
861 if (tex2d)
862 {
863 if (isSubImage && !validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
864 {
865 return false; // error already registered by validateSubImageParams
866 }
867 texture = tex2d;
868 textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
869 }
870 }
871 break;
872
873 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
874 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
875 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
879 {
880 if (!isSubImage && width != height)
881 {
882 return gl::error(GL_INVALID_VALUE, false);
883 }
884
885 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
886 height > (context->getMaximumCubeTextureDimension() >> level))
887 {
888 return gl::error(GL_INVALID_VALUE, false);
889 }
890
891 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
892 if (texcube)
893 {
894 if (isSubImage && !validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
895 {
896 return false; // error already registered by validateSubImageParams
897 }
898 texture = texcube;
899 textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
900 }
901 }
902 break;
903
904 default:
905 return gl::error(GL_INVALID_ENUM, false);
906 }
907
908 if (!texture)
909 {
910 return gl::error(GL_INVALID_OPERATION, false);
911 }
912
913 if (texture->isImmutable() && !isSubImage)
914 {
915 return gl::error(GL_INVALID_OPERATION, false);
916 }
917
918
919 // [OpenGL ES 2.0.24] table 3.9
920 if (isSubImage)
921 {
922 switch (textureFormat)
923 {
924 case GL_ALPHA:
925 if (colorbufferFormat != GL_ALPHA8_EXT &&
926 colorbufferFormat != GL_RGBA4 &&
927 colorbufferFormat != GL_RGB5_A1 &&
928 colorbufferFormat != GL_RGBA8_OES)
929 {
930 return gl::error(GL_INVALID_OPERATION, false);
931 }
932 break;
933 case GL_LUMINANCE:
934 case GL_RGB:
935 if (colorbufferFormat != GL_RGB565 &&
936 colorbufferFormat != GL_RGB8_OES &&
937 colorbufferFormat != GL_RGBA4 &&
938 colorbufferFormat != GL_RGB5_A1 &&
939 colorbufferFormat != GL_RGBA8_OES)
940 {
941 return gl::error(GL_INVALID_OPERATION, false);
942 }
943 break;
944 case GL_LUMINANCE_ALPHA:
945 case GL_RGBA:
946 if (colorbufferFormat != GL_RGBA4 &&
947 colorbufferFormat != GL_RGB5_A1 &&
948 colorbufferFormat != GL_RGBA8_OES)
949 {
950 return gl::error(GL_INVALID_OPERATION, false);
951 }
952 break;
953 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
954 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
955 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
956 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
957 return gl::error(GL_INVALID_OPERATION, false);
958 case GL_DEPTH_COMPONENT:
959 case GL_DEPTH_STENCIL_OES:
960 return gl::error(GL_INVALID_OPERATION, false);
961 default:
962 return gl::error(GL_INVALID_OPERATION, false);
963 }
964 }
965 else
966 {
967 switch (internalformat)
968 {
969 case GL_ALPHA:
970 if (colorbufferFormat != GL_ALPHA8_EXT &&
971 colorbufferFormat != GL_RGBA4 &&
972 colorbufferFormat != GL_RGB5_A1 &&
973 colorbufferFormat != GL_BGRA8_EXT &&
974 colorbufferFormat != GL_RGBA8_OES)
975 {
976 return gl::error(GL_INVALID_OPERATION, false);
977 }
978 break;
979 case GL_LUMINANCE:
980 case GL_RGB:
981 if (colorbufferFormat != GL_RGB565 &&
982 colorbufferFormat != GL_RGB8_OES &&
983 colorbufferFormat != GL_RGBA4 &&
984 colorbufferFormat != GL_RGB5_A1 &&
985 colorbufferFormat != GL_BGRA8_EXT &&
986 colorbufferFormat != GL_RGBA8_OES)
987 {
988 return gl::error(GL_INVALID_OPERATION, false);
989 }
990 break;
991 case GL_LUMINANCE_ALPHA:
992 case GL_RGBA:
993 if (colorbufferFormat != GL_RGBA4 &&
994 colorbufferFormat != GL_RGB5_A1 &&
995 colorbufferFormat != GL_BGRA8_EXT &&
996 colorbufferFormat != GL_RGBA8_OES)
997 {
998 return gl::error(GL_INVALID_OPERATION, false);
999 }
1000 break;
1001 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1002 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1003 if (context->supportsDXT1Textures())
1004 {
1005 return gl::error(GL_INVALID_OPERATION, false);
1006 }
1007 else
1008 {
1009 return gl::error(GL_INVALID_ENUM, false);
1010 }
1011 break;
1012 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1013 if (context->supportsDXT3Textures())
1014 {
1015 return gl::error(GL_INVALID_OPERATION, false);
1016 }
1017 else
1018 {
1019 return gl::error(GL_INVALID_ENUM, false);
1020 }
1021 break;
1022 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1023 if (context->supportsDXT5Textures())
1024 {
1025 return gl::error(GL_INVALID_OPERATION, false);
1026 }
1027 else
1028 {
1029 return gl::error(GL_INVALID_ENUM, false);
1030 }
1031 break;
1032 case GL_DEPTH_COMPONENT:
1033 case GL_DEPTH_COMPONENT16:
1034 case GL_DEPTH_COMPONENT32_OES:
1035 case GL_DEPTH_STENCIL_OES:
1036 case GL_DEPTH24_STENCIL8_OES:
1037 if (context->supportsDepthTextures())
1038 {
1039 return gl::error(GL_INVALID_OPERATION, false);
1040 }
1041 else
1042 {
1043 return gl::error(GL_INVALID_ENUM, false);
1044 }
1045 default:
1046 return gl::error(GL_INVALID_ENUM, false);
1047 }
1048 }
1049
1050 return true;
1051}
1052
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00001053bool validateES3CopyTexImageParameters(gl::Context *context, GLenum target, GLint level, GLenum internalformat,
1054 bool isSubImage, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
1055 GLsizei width, GLsizei height, GLint border)
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001056{
1057 if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001058 {
1059 return gl::error(GL_INVALID_VALUE, false);
1060 }
1061
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001062 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1063 {
1064 return gl::error(GL_INVALID_VALUE, false);
1065 }
1066
1067 if (width == 0 || height == 0)
1068 {
1069 return false;
1070 }
1071
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00001072 if (border != 0)
1073 {
1074 return gl::error(GL_INVALID_VALUE, false);
1075 }
1076
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001077 if (level > context->getMaximumTextureLevel())
1078 {
1079 return gl::error(GL_INVALID_VALUE, false);
1080 }
1081
1082 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1083
1084 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1085 {
1086 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
1087 }
1088
1089 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
1090 {
1091 return gl::error(GL_INVALID_OPERATION, false);
1092 }
1093
1094 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
1095 GLenum colorbufferFormat = source->getInternalFormat();
1096 gl::Texture *texture = NULL;
1097 GLenum textureFormat = GL_RGBA;
1098 bool textureCompressed = false;
1099 GLint textureLevelWidth = 0;
1100 GLint textureLevelHeight = 0;
1101 GLint textureLevelDepth = 0;
1102 switch (target)
1103 {
1104 case GL_TEXTURE_2D:
1105 {
1106 gl::Texture2D *texture2d = context->getTexture2D();
1107 if (texture2d)
1108 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001109 textureFormat = gl::GetFormat(texture2d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001110 textureCompressed = texture2d->isCompressed(level);
1111 textureLevelWidth = texture2d->getWidth(level);
1112 textureLevelHeight = texture2d->getHeight(level);
1113 textureLevelDepth = 1;
1114 texture = texture2d;
1115 }
1116 }
1117 break;
1118
1119 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1120 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1121 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1122 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1123 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1124 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1125 {
1126 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
1127 if (textureCube)
1128 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001129 textureFormat = gl::GetFormat(textureCube->getInternalFormat(target, level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001130 textureCompressed = textureCube->isCompressed(target, level);
1131 textureLevelWidth = textureCube->getWidth(target, level);
1132 textureLevelHeight = textureCube->getHeight(target, level);
1133 textureLevelDepth = 1;
1134 texture = textureCube;
1135 }
1136 }
1137 break;
1138
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00001139 case GL_TEXTURE_2D_ARRAY:
1140 {
1141 gl::Texture2DArray *texture2dArray = context->getTexture2DArray();
1142 if (texture2dArray)
1143 {
1144 textureFormat = gl::GetFormat(texture2dArray->getInternalFormat(level), context->getClientVersion());
1145 textureCompressed = texture2dArray->isCompressed(level);
1146 textureLevelWidth = texture2dArray->getWidth(level);
1147 textureLevelHeight = texture2dArray->getHeight(level);
1148 textureLevelDepth = texture2dArray->getDepth(level);
1149 texture = texture2dArray;
1150 }
1151 }
1152 break;
1153
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001154 case GL_TEXTURE_3D:
1155 {
1156 gl::Texture3D *texture3d = context->getTexture3D();
1157 if (texture3d)
1158 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001159 textureFormat = gl::GetFormat(texture3d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001160 textureCompressed = texture3d->isCompressed(level);
1161 textureLevelWidth = texture3d->getWidth(level);
1162 textureLevelHeight = texture3d->getHeight(level);
1163 textureLevelDepth = texture3d->getDepth(level);
1164 texture = texture3d;
1165 }
1166 }
1167 break;
1168
1169 default:
1170 return gl::error(GL_INVALID_ENUM, false);
1171 }
1172
1173 if (!texture)
1174 {
1175 return gl::error(GL_INVALID_OPERATION, false);
1176 }
1177
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00001178 if (texture->isImmutable() && !isSubImage)
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001179 {
1180 return gl::error(GL_INVALID_OPERATION, false);
1181 }
1182
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00001183 if (textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001184 {
1185 if ((width % 4 != 0 && width != textureLevelWidth) ||
1186 (height % 4 != 0 && height != textureLevelHeight))
1187 {
1188 return gl::error(GL_INVALID_OPERATION, false);
1189 }
1190 }
1191
1192 if (xoffset + width > textureLevelWidth ||
1193 yoffset + height > textureLevelHeight ||
1194 zoffset >= textureLevelDepth)
1195 {
1196 return gl::error(GL_INVALID_VALUE, false);
1197 }
1198
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001199 if (!gl::IsValidCopyTexImageCombination(textureFormat, colorbufferFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00001200 {
1201 return gl::error(GL_INVALID_OPERATION, false);
1202 }
1203
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001204 return true;
1205}
1206
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00001207// check for combinations of format and type that are valid for ReadPixels
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00001208bool validES2ReadFormatType(GLenum format, GLenum type)
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00001209{
1210 switch (format)
1211 {
1212 case GL_RGBA:
1213 switch (type)
1214 {
1215 case GL_UNSIGNED_BYTE:
1216 break;
1217 default:
1218 return false;
1219 }
1220 break;
1221 case GL_BGRA_EXT:
1222 switch (type)
1223 {
1224 case GL_UNSIGNED_BYTE:
1225 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
1226 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
1227 break;
1228 default:
1229 return false;
1230 }
1231 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00001232 default:
1233 return false;
1234 }
1235 return true;
1236}
1237
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00001238bool validES3ReadFormatType(GLenum internalFormat, GLenum format, GLenum type)
1239{
1240 switch (format)
1241 {
1242 case GL_RGBA:
1243 switch (type)
1244 {
1245 case GL_UNSIGNED_BYTE:
1246 break;
1247 case GL_UNSIGNED_INT_2_10_10_10_REV:
1248 if (internalFormat != GL_RGB10_A2)
1249 {
1250 return false;
1251 }
1252 break;
1253 default:
1254 return false;
1255 }
1256 break;
1257 case GL_RGBA_INTEGER:
1258 switch (type)
1259 {
1260 case GL_INT:
1261 case GL_UNSIGNED_INT:
1262 break;
1263 default:
1264 return false;
1265 }
1266 break;
1267 case GL_BGRA_EXT:
1268 switch (type)
1269 {
1270 case GL_UNSIGNED_BYTE:
1271 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
1272 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
1273 break;
1274 default:
1275 return false;
1276 }
1277 break;
1278 default:
1279 return false;
1280 }
1281 return true;
1282}
1283
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +00001284bool validateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
1285 const GLenum* attachments)
1286{
1287 bool defaultFramebuffer = false;
1288
1289 switch (target)
1290 {
1291 case GL_DRAW_FRAMEBUFFER:
1292 case GL_FRAMEBUFFER:
1293 defaultFramebuffer = context->getDrawFramebufferHandle() == 0;
1294 break;
1295 case GL_READ_FRAMEBUFFER:
1296 defaultFramebuffer = context->getReadFramebufferHandle() == 0;
1297 break;
1298 default:
1299 return gl::error(GL_INVALID_ENUM, false);
1300 }
1301
1302 for (int i = 0; i < numAttachments; ++i)
1303 {
1304 if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
1305 {
1306 if (defaultFramebuffer)
1307 {
1308 return gl::error(GL_INVALID_ENUM, false);
1309 }
1310
1311 if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getMaximumRenderTargets())
1312 {
1313 return gl::error(GL_INVALID_OPERATION, false);
1314 }
1315 }
1316 else
1317 {
1318 switch (attachments[i])
1319 {
1320 case GL_DEPTH_ATTACHMENT:
1321 case GL_STENCIL_ATTACHMENT:
1322 case GL_DEPTH_STENCIL_ATTACHMENT:
1323 if (defaultFramebuffer)
1324 {
1325 return gl::error(GL_INVALID_ENUM, false);
1326 }
1327 break;
1328 case GL_COLOR:
1329 case GL_DEPTH:
1330 case GL_STENCIL:
1331 if (!defaultFramebuffer)
1332 {
1333 return gl::error(GL_INVALID_ENUM, false);
1334 }
1335 break;
1336 default:
1337 return gl::error(GL_INVALID_ENUM, false);
1338 }
1339 }
1340 }
1341
1342 return true;
1343}
1344
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001345extern "C"
1346{
1347
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001348// OpenGL ES 2.0 functions
1349
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001350void __stdcall glActiveTexture(GLenum texture)
1351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001352 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001353
1354 try
1355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001357
1358 if (context)
1359 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +00001360 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
1361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001362 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +00001363 }
1364
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001365 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001366 }
1367 }
1368 catch(std::bad_alloc&)
1369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001371 }
1372}
1373
1374void __stdcall glAttachShader(GLuint program, GLuint shader)
1375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001376 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001377
1378 try
1379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001381
1382 if (context)
1383 {
1384 gl::Program *programObject = context->getProgram(program);
1385 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001386
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001387 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001388 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001389 if (context->getShader(program))
1390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001391 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001392 }
1393 else
1394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001395 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001396 }
1397 }
1398
1399 if (!shaderObject)
1400 {
1401 if (context->getProgram(shader))
1402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001403 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001404 }
1405 else
1406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001408 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001409 }
1410
1411 if (!programObject->attachShader(shaderObject))
1412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001414 }
1415 }
1416 }
1417 catch(std::bad_alloc&)
1418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420 }
1421}
1422
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001423void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
1424{
1425 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
1426
1427 try
1428 {
1429 switch (target)
1430 {
1431 case GL_ANY_SAMPLES_PASSED_EXT:
1432 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1433 break;
1434 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001435 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001436 }
1437
1438 if (id == 0)
1439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001440 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001441 }
1442
1443 gl::Context *context = gl::getNonLostContext();
1444
1445 if (context)
1446 {
1447 context->beginQuery(target, id);
1448 }
1449 }
1450 catch(std::bad_alloc&)
1451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001453 }
1454}
1455
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001456void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001458 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459
1460 try
1461 {
1462 if (index >= gl::MAX_VERTEX_ATTRIBS)
1463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465 }
1466
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468
1469 if (context)
1470 {
1471 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001472
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001473 if (!programObject)
1474 {
daniel@transgaming.com98079832010-04-13 03:26:29 +00001475 if (context->getShader(program))
1476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +00001478 }
1479 else
1480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +00001482 }
1483 }
1484
1485 if (strncmp(name, "gl_", 3) == 0)
1486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001487 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001488 }
1489
1490 programObject->bindAttributeLocation(index, name);
1491 }
1492 }
1493 catch(std::bad_alloc&)
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001496 }
1497}
1498
1499void __stdcall glBindBuffer(GLenum target, GLuint buffer)
1500{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001501 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001502
1503 try
1504 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001506
1507 if (context)
1508 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001509 // Check ES3 specific targets
1510 switch (target)
1511 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001512 case GL_COPY_READ_BUFFER:
1513 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001514 case GL_PIXEL_PACK_BUFFER:
1515 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001516 case GL_UNIFORM_BUFFER:
1517 case GL_TRANSFORM_FEEDBACK_BUFFER:
1518 if (context->getClientVersion() < 3)
1519 {
1520 return gl::error(GL_INVALID_ENUM);
1521 }
1522 }
1523
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001524 switch (target)
1525 {
1526 case GL_ARRAY_BUFFER:
1527 context->bindArrayBuffer(buffer);
1528 return;
1529 case GL_ELEMENT_ARRAY_BUFFER:
1530 context->bindElementArrayBuffer(buffer);
1531 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001532 case GL_COPY_READ_BUFFER:
1533 context->bindCopyReadBuffer(buffer);
1534 return;
1535 case GL_COPY_WRITE_BUFFER:
1536 context->bindCopyWriteBuffer(buffer);
1537 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001538 case GL_PIXEL_PACK_BUFFER:
1539 context->bindPixelPackBuffer(buffer);
1540 return;
1541 case GL_PIXEL_UNPACK_BUFFER:
1542 context->bindPixelUnpackBuffer(buffer);
1543 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001544 case GL_UNIFORM_BUFFER:
1545 context->bindGenericUniformBuffer(buffer);
1546 return;
1547 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +00001548 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001549 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001551 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552 }
1553 }
1554 }
1555 catch(std::bad_alloc&)
1556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001557 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558 }
1559}
1560
1561void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
1562{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001563 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564
1565 try
1566 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001567 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001572 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573
1574 if (context)
1575 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001576 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
1577 {
1578 context->bindReadFramebuffer(framebuffer);
1579 }
1580
1581 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
1582 {
1583 context->bindDrawFramebuffer(framebuffer);
1584 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001585 }
1586 }
1587 catch(std::bad_alloc&)
1588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001589 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001590 }
1591}
1592
1593void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
1594{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001595 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596
1597 try
1598 {
1599 if (target != GL_RENDERBUFFER)
1600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001601 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001602 }
1603
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605
1606 if (context)
1607 {
1608 context->bindRenderbuffer(renderbuffer);
1609 }
1610 }
1611 catch(std::bad_alloc&)
1612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001613 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001614 }
1615}
1616
1617void __stdcall glBindTexture(GLenum target, GLuint texture)
1618{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001619 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001620
1621 try
1622 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001623 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001624
1625 if (context)
1626 {
1627 gl::Texture *textureObject = context->getTexture(texture);
1628
1629 if (textureObject && textureObject->getTarget() != target && texture != 0)
1630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001631 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632 }
1633
1634 switch (target)
1635 {
1636 case GL_TEXTURE_2D:
1637 context->bindTexture2D(texture);
1638 return;
1639 case GL_TEXTURE_CUBE_MAP:
1640 context->bindTextureCubeMap(texture);
1641 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00001642 case GL_TEXTURE_3D:
1643 if (context->getClientVersion() < 3)
1644 {
1645 return gl::error(GL_INVALID_ENUM);
1646 }
1647 context->bindTexture3D(texture);
1648 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001649 case GL_TEXTURE_2D_ARRAY:
1650 if (context->getClientVersion() < 3)
1651 {
1652 return gl::error(GL_INVALID_ENUM);
1653 }
1654 context->bindTexture2DArray(texture);
1655 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001656 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001657 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001658 }
1659 }
1660 }
1661 catch(std::bad_alloc&)
1662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001663 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001664 }
1665}
1666
1667void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001669 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001670 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001671
1672 try
1673 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001674 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675
1676 if (context)
1677 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001678 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001679 }
1680 }
1681 catch(std::bad_alloc&)
1682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001683 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001684 }
1685}
1686
1687void __stdcall glBlendEquation(GLenum mode)
1688{
1689 glBlendEquationSeparate(mode, mode);
1690}
1691
1692void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
1693{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001694 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001695
1696 try
1697 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001698 gl::Context *context = gl::getNonLostContext();
1699
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700 switch (modeRGB)
1701 {
1702 case GL_FUNC_ADD:
1703 case GL_FUNC_SUBTRACT:
1704 case GL_FUNC_REVERSE_SUBTRACT:
1705 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001706
1707 case GL_MIN:
1708 case GL_MAX:
1709 if (context && context->getClientVersion() < 3)
1710 {
1711 return gl::error(GL_INVALID_ENUM);
1712 }
1713 break;
1714
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001715 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 }
1718
1719 switch (modeAlpha)
1720 {
1721 case GL_FUNC_ADD:
1722 case GL_FUNC_SUBTRACT:
1723 case GL_FUNC_REVERSE_SUBTRACT:
1724 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001725
1726 case GL_MIN:
1727 case GL_MAX:
1728 if (context && context->getClientVersion() < 3)
1729 {
1730 return gl::error(GL_INVALID_ENUM);
1731 }
1732 break;
1733
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001734 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001735 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001736 }
1737
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001738 if (context)
1739 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001740 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 }
1742 }
1743 catch(std::bad_alloc&)
1744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001746 }
1747}
1748
1749void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1750{
1751 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1752}
1753
1754void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1755{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001756 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 +00001757 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001758
1759 try
1760 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001761 gl::Context *context = gl::getNonLostContext();
1762
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001763 switch (srcRGB)
1764 {
1765 case GL_ZERO:
1766 case GL_ONE:
1767 case GL_SRC_COLOR:
1768 case GL_ONE_MINUS_SRC_COLOR:
1769 case GL_DST_COLOR:
1770 case GL_ONE_MINUS_DST_COLOR:
1771 case GL_SRC_ALPHA:
1772 case GL_ONE_MINUS_SRC_ALPHA:
1773 case GL_DST_ALPHA:
1774 case GL_ONE_MINUS_DST_ALPHA:
1775 case GL_CONSTANT_COLOR:
1776 case GL_ONE_MINUS_CONSTANT_COLOR:
1777 case GL_CONSTANT_ALPHA:
1778 case GL_ONE_MINUS_CONSTANT_ALPHA:
1779 case GL_SRC_ALPHA_SATURATE:
1780 break;
1781 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001782 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783 }
1784
1785 switch (dstRGB)
1786 {
1787 case GL_ZERO:
1788 case GL_ONE:
1789 case GL_SRC_COLOR:
1790 case GL_ONE_MINUS_SRC_COLOR:
1791 case GL_DST_COLOR:
1792 case GL_ONE_MINUS_DST_COLOR:
1793 case GL_SRC_ALPHA:
1794 case GL_ONE_MINUS_SRC_ALPHA:
1795 case GL_DST_ALPHA:
1796 case GL_ONE_MINUS_DST_ALPHA:
1797 case GL_CONSTANT_COLOR:
1798 case GL_ONE_MINUS_CONSTANT_COLOR:
1799 case GL_CONSTANT_ALPHA:
1800 case GL_ONE_MINUS_CONSTANT_ALPHA:
1801 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001802
1803 case GL_SRC_ALPHA_SATURATE:
1804 if (!context || context->getClientVersion() < 3)
1805 {
1806 return gl::error(GL_INVALID_ENUM);
1807 }
1808 break;
1809
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813
1814 switch (srcAlpha)
1815 {
1816 case GL_ZERO:
1817 case GL_ONE:
1818 case GL_SRC_COLOR:
1819 case GL_ONE_MINUS_SRC_COLOR:
1820 case GL_DST_COLOR:
1821 case GL_ONE_MINUS_DST_COLOR:
1822 case GL_SRC_ALPHA:
1823 case GL_ONE_MINUS_SRC_ALPHA:
1824 case GL_DST_ALPHA:
1825 case GL_ONE_MINUS_DST_ALPHA:
1826 case GL_CONSTANT_COLOR:
1827 case GL_ONE_MINUS_CONSTANT_COLOR:
1828 case GL_CONSTANT_ALPHA:
1829 case GL_ONE_MINUS_CONSTANT_ALPHA:
1830 case GL_SRC_ALPHA_SATURATE:
1831 break;
1832 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001833 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834 }
1835
1836 switch (dstAlpha)
1837 {
1838 case GL_ZERO:
1839 case GL_ONE:
1840 case GL_SRC_COLOR:
1841 case GL_ONE_MINUS_SRC_COLOR:
1842 case GL_DST_COLOR:
1843 case GL_ONE_MINUS_DST_COLOR:
1844 case GL_SRC_ALPHA:
1845 case GL_ONE_MINUS_SRC_ALPHA:
1846 case GL_DST_ALPHA:
1847 case GL_ONE_MINUS_DST_ALPHA:
1848 case GL_CONSTANT_COLOR:
1849 case GL_ONE_MINUS_CONSTANT_COLOR:
1850 case GL_CONSTANT_ALPHA:
1851 case GL_ONE_MINUS_CONSTANT_ALPHA:
1852 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001853
1854 case GL_SRC_ALPHA_SATURATE:
1855 if (!context || context->getClientVersion() < 3)
1856 {
1857 return gl::error(GL_INVALID_ENUM);
1858 }
1859 break;
1860
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001861 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001862 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863 }
1864
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001865 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1866 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1867
1868 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1869 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1870
1871 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001873 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001874 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001875 }
1876
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877 if (context)
1878 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001879 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001880 }
1881 }
1882 catch(std::bad_alloc&)
1883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885 }
1886}
1887
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001888void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001890 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 +00001891 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001892
1893 try
1894 {
1895 if (size < 0)
1896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001897 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898 }
1899
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001900 gl::Context *context = gl::getNonLostContext();
1901
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902 switch (usage)
1903 {
1904 case GL_STREAM_DRAW:
1905 case GL_STATIC_DRAW:
1906 case GL_DYNAMIC_DRAW:
1907 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001908
1909 case GL_STREAM_READ:
1910 case GL_STREAM_COPY:
1911 case GL_STATIC_READ:
1912 case GL_STATIC_COPY:
1913 case GL_DYNAMIC_READ:
1914 case GL_DYNAMIC_COPY:
1915 if (context && context->getClientVersion() < 3)
1916 {
1917 return gl::error(GL_INVALID_ENUM);
1918 }
1919 break;
1920
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001922 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001923 }
1924
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925 if (context)
1926 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001927 // Check ES3 specific targets
1928 switch (target)
1929 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001930 case GL_COPY_READ_BUFFER:
1931 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001932 case GL_PIXEL_PACK_BUFFER:
1933 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001934 case GL_UNIFORM_BUFFER:
1935 case GL_TRANSFORM_FEEDBACK_BUFFER:
1936 if (context->getClientVersion() < 3)
1937 {
1938 return gl::error(GL_INVALID_ENUM);
1939 }
1940 }
1941
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001942 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001943
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944 switch (target)
1945 {
1946 case GL_ARRAY_BUFFER:
1947 buffer = context->getArrayBuffer();
1948 break;
1949 case GL_ELEMENT_ARRAY_BUFFER:
1950 buffer = context->getElementArrayBuffer();
1951 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001952 case GL_COPY_READ_BUFFER:
1953 buffer = context->getCopyReadBuffer();
1954 break;
1955 case GL_COPY_WRITE_BUFFER:
1956 buffer = context->getCopyWriteBuffer();
1957 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001958 case GL_PIXEL_PACK_BUFFER:
1959 buffer = context->getPixelPackBuffer();
1960 break;
1961 case GL_PIXEL_UNPACK_BUFFER:
1962 buffer = context->getPixelUnpackBuffer();
1963 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001964 case GL_TRANSFORM_FEEDBACK_BUFFER:
1965 buffer = context->getGenericTransformFeedbackBuffer();
1966 break;
1967 case GL_UNIFORM_BUFFER:
1968 buffer = context->getGenericUniformBuffer();
1969 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001970 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001971 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 }
1973
1974 if (!buffer)
1975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001976 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977 }
1978
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001979 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980 }
1981 }
1982 catch(std::bad_alloc&)
1983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001984 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001985 }
1986}
1987
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001988void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001990 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 +00001991 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992
1993 try
1994 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001995 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001997 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001998 }
1999
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00002000 if (data == NULL)
2001 {
2002 return;
2003 }
2004
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002005 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002006
2007 if (context)
2008 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00002009 // Check ES3 specific targets
2010 switch (target)
2011 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00002012 case GL_COPY_READ_BUFFER:
2013 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00002014 case GL_PIXEL_PACK_BUFFER:
2015 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00002016 case GL_UNIFORM_BUFFER:
2017 case GL_TRANSFORM_FEEDBACK_BUFFER:
2018 if (context->getClientVersion() < 3)
2019 {
2020 return gl::error(GL_INVALID_ENUM);
2021 }
2022 }
2023
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002024 gl::Buffer *buffer;
2025
2026 switch (target)
2027 {
2028 case GL_ARRAY_BUFFER:
2029 buffer = context->getArrayBuffer();
2030 break;
2031 case GL_ELEMENT_ARRAY_BUFFER:
2032 buffer = context->getElementArrayBuffer();
2033 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00002034 case GL_COPY_READ_BUFFER:
2035 buffer = context->getCopyReadBuffer();
2036 break;
2037 case GL_COPY_WRITE_BUFFER:
2038 buffer = context->getCopyWriteBuffer();
2039 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00002040 case GL_PIXEL_PACK_BUFFER:
2041 buffer = context->getPixelPackBuffer();
2042 break;
2043 case GL_PIXEL_UNPACK_BUFFER:
2044 buffer = context->getPixelUnpackBuffer();
2045 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00002046 case GL_TRANSFORM_FEEDBACK_BUFFER:
2047 buffer = context->getGenericTransformFeedbackBuffer();
2048 break;
2049 case GL_UNIFORM_BUFFER:
2050 buffer = context->getGenericUniformBuffer();
2051 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002052 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002053 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002054 }
2055
2056 if (!buffer)
2057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002058 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002059 }
2060
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00002061 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002064 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00002065
2066 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069 catch(std::bad_alloc&)
2070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072 }
2073}
2074
2075GLenum __stdcall glCheckFramebufferStatus(GLenum target)
2076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002077 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078
2079 try
2080 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002081 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002083 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002084 }
2085
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002086 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087
2088 if (context)
2089 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002090 gl::Framebuffer *framebuffer = NULL;
2091 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2092 {
2093 framebuffer = context->getReadFramebuffer();
2094 }
2095 else
2096 {
2097 framebuffer = context->getDrawFramebuffer();
2098 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002099
2100 return framebuffer->completeness();
2101 }
2102 }
2103 catch(std::bad_alloc&)
2104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002105 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002106 }
2107
2108 return 0;
2109}
2110
2111void __stdcall glClear(GLbitfield mask)
2112{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002113 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002114
2115 try
2116 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002117 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002118
2119 if (context)
2120 {
2121 context->clear(mask);
2122 }
2123 }
2124 catch(std::bad_alloc&)
2125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002126 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127 }
2128}
2129
2130void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
2131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002132 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002133 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134
2135 try
2136 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002137 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138
2139 if (context)
2140 {
2141 context->setClearColor(red, green, blue, alpha);
2142 }
2143 }
2144 catch(std::bad_alloc&)
2145 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002146 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002147 }
2148}
2149
2150void __stdcall glClearDepthf(GLclampf depth)
2151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002152 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153
2154 try
2155 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002156 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157
2158 if (context)
2159 {
2160 context->setClearDepth(depth);
2161 }
2162 }
2163 catch(std::bad_alloc&)
2164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002165 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002166 }
2167}
2168
2169void __stdcall glClearStencil(GLint s)
2170{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002171 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172
2173 try
2174 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002175 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002176
2177 if (context)
2178 {
2179 context->setClearStencil(s);
2180 }
2181 }
2182 catch(std::bad_alloc&)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
2188void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
2189{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002190 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002191 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002192
2193 try
2194 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002195 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002196
2197 if (context)
2198 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00002199 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002200 }
2201 }
2202 catch(std::bad_alloc&)
2203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002205 }
2206}
2207
2208void __stdcall glCompileShader(GLuint shader)
2209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002210 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002211
2212 try
2213 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002214 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215
2216 if (context)
2217 {
2218 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002219
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220 if (!shaderObject)
2221 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00002222 if (context->getProgram(shader))
2223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00002225 }
2226 else
2227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002228 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00002229 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 }
2231
2232 shaderObject->compile();
2233 }
2234 }
2235 catch(std::bad_alloc&)
2236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002237 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 }
2239}
2240
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002241void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
2242 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002244 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002245 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246 target, level, internalformat, width, height, border, imageSize, data);
2247
2248 try
2249 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002250 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00002251
2252 if (context)
2253 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002254 if (context->getClientVersion() < 3 &&
2255 !validateES2TexImageParameters(context, target, level, internalformat, true, false,
2256 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
2257 {
2258 return;
2259 }
2260
2261 if (context->getClientVersion() >= 3 &&
2262 !validateES3TexImageParameters(context, target, level, internalformat, true, false,
2263 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE))
2264 {
2265 return;
2266 }
2267
2268 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002271 }
2272
2273 switch (target)
2274 {
2275 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002276 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002277 gl::Texture2D *texture = context->getTexture2D();
2278 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002279 }
2280 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002281
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002282 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2283 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2284 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2285 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2286 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2287 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002288 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002289 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2290 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002291 }
2292 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002293
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002294 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002295 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002296 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00002297 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002298 }
2299 catch(std::bad_alloc&)
2300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002301 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002302 }
2303}
2304
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002305void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
2306 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002308 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002309 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002310 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002311 target, level, xoffset, yoffset, width, height, format, imageSize, data);
2312
2313 try
2314 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002315 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00002316
2317 if (context)
2318 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002319 if (context->getClientVersion() < 3 &&
2320 !validateES2TexImageParameters(context, target, level, GL_NONE, true, true,
2321 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
2322 {
2323 return;
2324 }
2325
2326 if (context->getClientVersion() >= 3 &&
2327 !validateES3TexImageParameters(context, target, level, GL_NONE, true, true,
2328 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE))
2329 {
2330 return;
2331 }
2332
2333 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002335 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002336 }
2337
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002338 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00002339 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002340 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00002341 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002342 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00002343 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00002344 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002345 break;
2346
2347 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2348 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2349 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2350 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2351 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2352 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00002353 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002354 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00002355 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00002356 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002357 break;
2358
2359 default:
2360 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00002361 }
2362 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363 }
2364 catch(std::bad_alloc&)
2365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002367 }
2368}
2369
2370void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
2371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002372 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002373 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374 target, level, internalformat, x, y, width, height, border);
2375
2376 try
2377 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002379
2380 if (context)
2381 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002382 if (context->getClientVersion() < 3 &&
2383 !validateES2CopyTexImageParameters(context, target, level, internalformat, false,
2384 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00002385 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002386 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00002387 }
2388
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002389 if (context->getClientVersion() >= 3 &&
2390 !validateES3CopyTexImageParameters(context, target, level, internalformat, false,
2391 0, 0, 0, x, y, width, height, border))
2392 {
2393 return;
2394 }
2395
2396 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
2397
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002398 switch (target)
2399 {
2400 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002401 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002402 gl::Texture2D *texture = context->getTexture2D();
2403 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002404 }
2405 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002406
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002407 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2408 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2409 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2410 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2411 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2412 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002413 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002414 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2415 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002416 }
2417 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002418
2419 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002421 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002422 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424 catch(std::bad_alloc&)
2425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002426 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427 }
2428}
2429
2430void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
2431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002432 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002433 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 target, level, xoffset, yoffset, x, y, width, height);
2435
2436 try
2437 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002438 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002439
2440 if (context)
2441 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002442 if (context->getClientVersion() < 3 &&
2443 !validateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
2444 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002445 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002446 return;
2447 }
2448
2449 if (context->getClientVersion() >= 3 &&
2450 !validateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
2451 xoffset, yoffset, 0, x, y, width, height, 0))
2452 {
2453 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002454 }
2455
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002456 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002457
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002458 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002459 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002460 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002461 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002462 gl::Texture2D *texture = context->getTexture2D();
2463 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002464 }
2465 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002466
2467 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2468 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2469 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2470 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2471 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2472 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002473 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002474 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2475 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002476 }
2477 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002478
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002479 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002480 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002481 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002482 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002484
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002485 catch(std::bad_alloc&)
2486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002487 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002488 }
2489}
2490
2491GLuint __stdcall glCreateProgram(void)
2492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002493 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002494
2495 try
2496 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002497 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002498
2499 if (context)
2500 {
2501 return context->createProgram();
2502 }
2503 }
2504 catch(std::bad_alloc&)
2505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002506 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002507 }
2508
2509 return 0;
2510}
2511
2512GLuint __stdcall glCreateShader(GLenum type)
2513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002514 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002515
2516 try
2517 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002518 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
2520 if (context)
2521 {
2522 switch (type)
2523 {
2524 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002525 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 return context->createShader(type);
2527 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530 }
2531 }
2532 catch(std::bad_alloc&)
2533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002534 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 }
2536
2537 return 0;
2538}
2539
2540void __stdcall glCullFace(GLenum mode)
2541{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002542 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002543
2544 try
2545 {
2546 switch (mode)
2547 {
2548 case GL_FRONT:
2549 case GL_BACK:
2550 case GL_FRONT_AND_BACK:
2551 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553
2554 if (context)
2555 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002556 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002557 }
2558 }
2559 break;
2560 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002562 }
2563 }
2564 catch(std::bad_alloc&)
2565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567 }
2568}
2569
2570void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002572 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002573
2574 try
2575 {
2576 if (n < 0)
2577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002579 }
2580
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002581 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002582
2583 if (context)
2584 {
2585 for (int i = 0; i < n; i++)
2586 {
2587 context->deleteBuffer(buffers[i]);
2588 }
2589 }
2590 }
2591 catch(std::bad_alloc&)
2592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002593 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002594 }
2595}
2596
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002597void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002599 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002600
2601 try
2602 {
2603 if (n < 0)
2604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002605 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002606 }
2607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002608 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002609
2610 if (context)
2611 {
2612 for (int i = 0; i < n; i++)
2613 {
2614 context->deleteFence(fences[i]);
2615 }
2616 }
2617 }
2618 catch(std::bad_alloc&)
2619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002620 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002621 }
2622}
2623
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002624void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002626 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627
2628 try
2629 {
2630 if (n < 0)
2631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002632 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633 }
2634
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002635 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002636
2637 if (context)
2638 {
2639 for (int i = 0; i < n; i++)
2640 {
2641 if (framebuffers[i] != 0)
2642 {
2643 context->deleteFramebuffer(framebuffers[i]);
2644 }
2645 }
2646 }
2647 }
2648 catch(std::bad_alloc&)
2649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002651 }
2652}
2653
2654void __stdcall glDeleteProgram(GLuint program)
2655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002656 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002657
2658 try
2659 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002660 if (program == 0)
2661 {
2662 return;
2663 }
2664
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002665 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002666
2667 if (context)
2668 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002669 if (!context->getProgram(program))
2670 {
2671 if(context->getShader(program))
2672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002673 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002674 }
2675 else
2676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002678 }
2679 }
2680
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002681 context->deleteProgram(program);
2682 }
2683 }
2684 catch(std::bad_alloc&)
2685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002687 }
2688}
2689
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002690void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2691{
2692 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2693
2694 try
2695 {
2696 if (n < 0)
2697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002698 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002699 }
2700
2701 gl::Context *context = gl::getNonLostContext();
2702
2703 if (context)
2704 {
2705 for (int i = 0; i < n; i++)
2706 {
2707 context->deleteQuery(ids[i]);
2708 }
2709 }
2710 }
2711 catch(std::bad_alloc&)
2712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002713 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002714 }
2715}
2716
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002717void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002719 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002720
2721 try
2722 {
2723 if (n < 0)
2724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002726 }
2727
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002729
2730 if (context)
2731 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002732 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733 {
2734 context->deleteRenderbuffer(renderbuffers[i]);
2735 }
2736 }
2737 }
2738 catch(std::bad_alloc&)
2739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002740 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002741 }
2742}
2743
2744void __stdcall glDeleteShader(GLuint shader)
2745{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002746 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002747
2748 try
2749 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002750 if (shader == 0)
2751 {
2752 return;
2753 }
2754
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002755 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002756
2757 if (context)
2758 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002759 if (!context->getShader(shader))
2760 {
2761 if(context->getProgram(shader))
2762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002763 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002764 }
2765 else
2766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002767 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002768 }
2769 }
2770
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002771 context->deleteShader(shader);
2772 }
2773 }
2774 catch(std::bad_alloc&)
2775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002776 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002777 }
2778}
2779
2780void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2781{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002782 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002783
2784 try
2785 {
2786 if (n < 0)
2787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002788 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002789 }
2790
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002792
2793 if (context)
2794 {
2795 for (int i = 0; i < n; i++)
2796 {
2797 if (textures[i] != 0)
2798 {
2799 context->deleteTexture(textures[i]);
2800 }
2801 }
2802 }
2803 }
2804 catch(std::bad_alloc&)
2805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002806 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002807 }
2808}
2809
2810void __stdcall glDepthFunc(GLenum func)
2811{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002812 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002813
2814 try
2815 {
2816 switch (func)
2817 {
2818 case GL_NEVER:
2819 case GL_ALWAYS:
2820 case GL_LESS:
2821 case GL_LEQUAL:
2822 case GL_EQUAL:
2823 case GL_GREATER:
2824 case GL_GEQUAL:
2825 case GL_NOTEQUAL:
2826 break;
2827 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002828 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002829 }
2830
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002831 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002832
2833 if (context)
2834 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002835 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002836 }
2837 }
2838 catch(std::bad_alloc&)
2839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002841 }
2842}
2843
2844void __stdcall glDepthMask(GLboolean flag)
2845{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002846 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002847
2848 try
2849 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002850 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851
2852 if (context)
2853 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002854 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002855 }
2856 }
2857 catch(std::bad_alloc&)
2858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002860 }
2861}
2862
2863void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002865 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866
2867 try
2868 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002869 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870
2871 if (context)
2872 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002873 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002874 }
2875 }
2876 catch(std::bad_alloc&)
2877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002879 }
2880}
2881
2882void __stdcall glDetachShader(GLuint program, GLuint shader)
2883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002884 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002885
2886 try
2887 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002888 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002889
2890 if (context)
2891 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002892
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002893 gl::Program *programObject = context->getProgram(program);
2894 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002895
2896 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002898 gl::Shader *shaderByProgramHandle;
2899 shaderByProgramHandle = context->getShader(program);
2900 if (!shaderByProgramHandle)
2901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002902 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002903 }
2904 else
2905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002906 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002907 }
2908 }
2909
2910 if (!shaderObject)
2911 {
2912 gl::Program *programByShaderHandle = context->getProgram(shader);
2913 if (!programByShaderHandle)
2914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002915 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002916 }
2917 else
2918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002920 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002921 }
2922
2923 if (!programObject->detachShader(shaderObject))
2924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002925 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002926 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927 }
2928 }
2929 catch(std::bad_alloc&)
2930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002931 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002932 }
2933}
2934
2935void __stdcall glDisable(GLenum cap)
2936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002937 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002938
2939 try
2940 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002941 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002942
2943 if (context)
2944 {
2945 switch (cap)
2946 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002947 case GL_CULL_FACE: context->setCullFace(false); break;
2948 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2949 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2950 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2951 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2952 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2953 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2954 case GL_BLEND: context->setBlend(false); break;
2955 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002957 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958 }
2959 }
2960 }
2961 catch(std::bad_alloc&)
2962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002964 }
2965}
2966
2967void __stdcall glDisableVertexAttribArray(GLuint index)
2968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002969 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002970
2971 try
2972 {
2973 if (index >= gl::MAX_VERTEX_ATTRIBS)
2974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002975 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976 }
2977
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979
2980 if (context)
2981 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002982 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002983 }
2984 }
2985 catch(std::bad_alloc&)
2986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002987 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002988 }
2989}
2990
2991void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002993 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994
2995 try
2996 {
2997 if (count < 0 || first < 0)
2998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002999 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000 }
3001
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003
3004 if (context)
3005 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003006 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003007 }
3008 }
3009 catch(std::bad_alloc&)
3010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 }
3013}
3014
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003015void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
3016{
3017 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
3018
3019 try
3020 {
3021 if (count < 0 || first < 0 || primcount < 0)
3022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003023 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003024 }
3025
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003026 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003027 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003028 gl::Context *context = gl::getNonLostContext();
3029
3030 if (context)
3031 {
3032 context->drawArrays(mode, first, count, primcount);
3033 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003034 }
3035 }
3036 catch(std::bad_alloc&)
3037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003039 }
3040}
3041
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003042void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003043{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003044 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 +00003045 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003046
3047 try
3048 {
3049 if (count < 0)
3050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003051 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003052 }
3053
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003054 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055
3056 if (context)
3057 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00003058 switch (type)
3059 {
3060 case GL_UNSIGNED_BYTE:
3061 case GL_UNSIGNED_SHORT:
3062 break;
3063 case GL_UNSIGNED_INT:
3064 if (!context->supports32bitIndices())
3065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00003067 }
3068 break;
3069 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00003071 }
3072
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003073 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003074 }
3075 }
3076 catch(std::bad_alloc&)
3077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003079 }
3080}
3081
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003082void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
3083{
3084 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
3085 mode, count, type, indices, primcount);
3086
3087 try
3088 {
3089 if (count < 0 || primcount < 0)
3090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003092 }
3093
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003094 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003095 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003096 gl::Context *context = gl::getNonLostContext();
3097
3098 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003099 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003100 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003101 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003102 case GL_UNSIGNED_BYTE:
3103 case GL_UNSIGNED_SHORT:
3104 break;
3105 case GL_UNSIGNED_INT:
3106 if (!context->supports32bitIndices())
3107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003108 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003109 }
3110 break;
3111 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003112 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003113 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003114
3115 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003116 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003117 }
3118 }
3119 catch(std::bad_alloc&)
3120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003121 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003122 }
3123}
3124
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125void __stdcall glEnable(GLenum cap)
3126{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003127 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003128
3129 try
3130 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003131 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003132
3133 if (context)
3134 {
3135 switch (cap)
3136 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003137 case GL_CULL_FACE: context->setCullFace(true); break;
3138 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
3139 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
3140 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
3141 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
3142 case GL_STENCIL_TEST: context->setStencilTest(true); break;
3143 case GL_DEPTH_TEST: context->setDepthTest(true); break;
3144 case GL_BLEND: context->setBlend(true); break;
3145 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003146 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003147 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003148 }
3149 }
3150 }
3151 catch(std::bad_alloc&)
3152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003154 }
3155}
3156
3157void __stdcall glEnableVertexAttribArray(GLuint index)
3158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003159 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003160
3161 try
3162 {
3163 if (index >= gl::MAX_VERTEX_ATTRIBS)
3164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003165 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003166 }
3167
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003168 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169
3170 if (context)
3171 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00003172 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173 }
3174 }
3175 catch(std::bad_alloc&)
3176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003177 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178 }
3179}
3180
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003181void __stdcall glEndQueryEXT(GLenum target)
3182{
3183 EVENT("GLenum target = 0x%X)", target);
3184
3185 try
3186 {
3187 switch (target)
3188 {
3189 case GL_ANY_SAMPLES_PASSED_EXT:
3190 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
3191 break;
3192 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003194 }
3195
3196 gl::Context *context = gl::getNonLostContext();
3197
3198 if (context)
3199 {
3200 context->endQuery(target);
3201 }
3202 }
3203 catch(std::bad_alloc&)
3204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003206 }
3207}
3208
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003209void __stdcall glFinishFenceNV(GLuint fence)
3210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003211 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003212
3213 try
3214 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003215 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003216
3217 if (context)
3218 {
3219 gl::Fence* fenceObject = context->getFence(fence);
3220
3221 if (fenceObject == NULL)
3222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003223 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003224 }
3225
3226 fenceObject->finishFence();
3227 }
3228 }
3229 catch(std::bad_alloc&)
3230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003231 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003232 }
3233}
3234
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003235void __stdcall glFinish(void)
3236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003237 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003238
3239 try
3240 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003242
3243 if (context)
3244 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00003245 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003246 }
3247 }
3248 catch(std::bad_alloc&)
3249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003250 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003251 }
3252}
3253
3254void __stdcall glFlush(void)
3255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003256 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003257
3258 try
3259 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003261
3262 if (context)
3263 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00003264 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003265 }
3266 }
3267 catch(std::bad_alloc&)
3268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 }
3271}
3272
3273void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
3274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003275 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003276 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003277
3278 try
3279 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003280 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003281 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003283 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284 }
3285
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003286 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003287
3288 if (context)
3289 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003290 gl::Framebuffer *framebuffer = NULL;
3291 GLuint framebufferHandle = 0;
3292 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3293 {
3294 framebuffer = context->getReadFramebuffer();
3295 framebufferHandle = context->getReadFramebufferHandle();
3296 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003297 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003298 {
3299 framebuffer = context->getDrawFramebuffer();
3300 framebufferHandle = context->getDrawFramebufferHandle();
3301 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003303 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003305 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306 }
3307
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003308 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003310 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3311
3312 if (colorAttachment >= context->getMaximumRenderTargets())
3313 {
3314 return gl::error(GL_INVALID_VALUE);
3315 }
3316
3317 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
3318 }
3319 else
3320 {
3321 switch (attachment)
3322 {
3323 case GL_DEPTH_ATTACHMENT:
3324 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
3325 break;
3326 case GL_STENCIL_ATTACHMENT:
3327 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
3328 break;
3329 default:
3330 return gl::error(GL_INVALID_ENUM);
3331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332 }
3333 }
3334 }
3335 catch(std::bad_alloc&)
3336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003337 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003338 }
3339}
3340
3341void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
3342{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003343 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003344 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003345
3346 try
3347 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003348 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003350 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
3352
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003353 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354
3355 if (context)
3356 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003357 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
3358 {
3359 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3360
3361 if (colorAttachment >= context->getMaximumRenderTargets())
3362 {
3363 return gl::error(GL_INVALID_VALUE);
3364 }
3365 }
3366 else
3367 {
3368 switch (attachment)
3369 {
3370 case GL_DEPTH_ATTACHMENT:
3371 case GL_STENCIL_ATTACHMENT:
3372 break;
3373 default:
3374 return gl::error(GL_INVALID_ENUM);
3375 }
3376 }
3377
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003378 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003380 textarget = GL_NONE;
3381 }
3382 else
3383 {
3384 gl::Texture *tex = context->getTexture(texture);
3385
3386 if (tex == NULL)
3387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003389 }
3390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391 switch (textarget)
3392 {
3393 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003394 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003395 if (tex->getTarget() != GL_TEXTURE_2D)
3396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003397 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003398 }
3399 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003400 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003402 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003403 }
3404 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003406
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003407 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003408 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003410 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003413 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003414 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003417 }
3418 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003419 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003421 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003422 }
3423 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003424 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003425
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003427 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428 }
3429
3430 if (level != 0)
3431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003432 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003433 }
3434 }
3435
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003436 gl::Framebuffer *framebuffer = NULL;
3437 GLuint framebufferHandle = 0;
3438 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3439 {
3440 framebuffer = context->getReadFramebuffer();
3441 framebufferHandle = context->getReadFramebufferHandle();
3442 }
3443 else
3444 {
3445 framebuffer = context->getDrawFramebuffer();
3446 framebufferHandle = context->getDrawFramebufferHandle();
3447 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003449 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003451 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 }
3453
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003454 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003455 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003456 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3457
3458 if (colorAttachment >= context->getMaximumRenderTargets())
3459 {
3460 return gl::error(GL_INVALID_VALUE);
3461 }
3462
3463 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3464 }
3465 else
3466 {
3467 switch (attachment)
3468 {
3469 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3470 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3471 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003473 }
3474 }
3475 catch(std::bad_alloc&)
3476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003477 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 }
3479}
3480
3481void __stdcall glFrontFace(GLenum mode)
3482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003483 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484
3485 try
3486 {
3487 switch (mode)
3488 {
3489 case GL_CW:
3490 case GL_CCW:
3491 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493
3494 if (context)
3495 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003496 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497 }
3498 }
3499 break;
3500 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003501 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502 }
3503 }
3504 catch(std::bad_alloc&)
3505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 }
3508}
3509
3510void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003512 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003513
3514 try
3515 {
3516 if (n < 0)
3517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003518 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003519 }
3520
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003521 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003522
3523 if (context)
3524 {
3525 for (int i = 0; i < n; i++)
3526 {
3527 buffers[i] = context->createBuffer();
3528 }
3529 }
3530 }
3531 catch(std::bad_alloc&)
3532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003533 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003534 }
3535}
3536
3537void __stdcall glGenerateMipmap(GLenum target)
3538{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003539 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003540
3541 try
3542 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003543 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003544
3545 if (context)
3546 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003547 switch (target)
3548 {
3549 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003550 {
3551 gl::Texture2D *tex2d = context->getTexture2D();
3552
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003553 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003556 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003557 if (tex2d->isDepth(0))
3558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003560 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003561
3562 tex2d->generateMipmaps();
3563 break;
3564 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003565
3566 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003567 {
3568 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3569
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003570 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003573 }
3574
3575 texcube->generateMipmaps();
3576 break;
3577 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003578
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003579 case GL_TEXTURE_3D:
3580 {
3581 if (context->getClientVersion() < 3)
3582 {
3583 return gl::error(GL_INVALID_ENUM);
3584 }
3585
3586 gl::Texture3D *tex3D = context->getTexture3D();
3587 if (tex3D->isCompressed(0))
3588 {
3589 return gl::error(GL_INVALID_OPERATION);
3590 }
3591
3592 tex3D->generateMipmaps();
3593 break;
3594 }
3595
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003596 case GL_TEXTURE_2D_ARRAY:
3597 {
3598 if (context->getClientVersion() < 3)
3599 {
3600 return gl::error(GL_INVALID_ENUM);
3601 }
3602
3603 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3604 if (tex2darr->isCompressed(0))
3605 {
3606 return gl::error(GL_INVALID_OPERATION);
3607 }
3608
3609 tex2darr->generateMipmaps();
3610 break;
3611 }
3612
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003613 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003614 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003615 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003616 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617 }
3618 catch(std::bad_alloc&)
3619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003621 }
3622}
3623
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003624void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003626 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003627
3628 try
3629 {
3630 if (n < 0)
3631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003632 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003633 }
3634
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003635 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003636
3637 if (context)
3638 {
3639 for (int i = 0; i < n; i++)
3640 {
3641 fences[i] = context->createFence();
3642 }
3643 }
3644 }
3645 catch(std::bad_alloc&)
3646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003647 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003648 }
3649}
3650
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3652{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003653 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654
3655 try
3656 {
3657 if (n < 0)
3658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003659 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003660 }
3661
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003662 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663
3664 if (context)
3665 {
3666 for (int i = 0; i < n; i++)
3667 {
3668 framebuffers[i] = context->createFramebuffer();
3669 }
3670 }
3671 }
3672 catch(std::bad_alloc&)
3673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003674 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003675 }
3676}
3677
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003678void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3679{
3680 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3681
3682 try
3683 {
3684 if (n < 0)
3685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003687 }
3688
3689 gl::Context *context = gl::getNonLostContext();
3690
3691 if (context)
3692 {
3693 for (int i = 0; i < n; i++)
3694 {
3695 ids[i] = context->createQuery();
3696 }
3697 }
3698 }
3699 catch(std::bad_alloc&)
3700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003701 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003702 }
3703}
3704
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003705void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3706{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003707 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003708
3709 try
3710 {
3711 if (n < 0)
3712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003713 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003714 }
3715
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003716 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003717
3718 if (context)
3719 {
3720 for (int i = 0; i < n; i++)
3721 {
3722 renderbuffers[i] = context->createRenderbuffer();
3723 }
3724 }
3725 }
3726 catch(std::bad_alloc&)
3727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003729 }
3730}
3731
3732void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3733{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003734 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003735
3736 try
3737 {
3738 if (n < 0)
3739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741 }
3742
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003743 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003744
3745 if (context)
3746 {
3747 for (int i = 0; i < n; i++)
3748 {
3749 textures[i] = context->createTexture();
3750 }
3751 }
3752 }
3753 catch(std::bad_alloc&)
3754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003756 }
3757}
3758
daniel@transgaming.com85423182010-04-22 13:35:27 +00003759void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003761 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003762 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003763 program, index, bufsize, length, size, type, name);
3764
3765 try
3766 {
3767 if (bufsize < 0)
3768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003770 }
3771
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003772 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003773
3774 if (context)
3775 {
3776 gl::Program *programObject = context->getProgram(program);
3777
3778 if (!programObject)
3779 {
3780 if (context->getShader(program))
3781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003782 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003783 }
3784 else
3785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003787 }
3788 }
3789
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003790 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003793 }
3794
3795 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3796 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
3798 catch(std::bad_alloc&)
3799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 }
3802}
3803
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003804void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003806 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003807 "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 +00003808 program, index, bufsize, length, size, type, name);
3809
3810 try
3811 {
3812 if (bufsize < 0)
3813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003815 }
3816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003818
3819 if (context)
3820 {
3821 gl::Program *programObject = context->getProgram(program);
3822
3823 if (!programObject)
3824 {
3825 if (context->getShader(program))
3826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003827 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003828 }
3829 else
3830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003831 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003832 }
3833 }
3834
3835 if (index >= (GLuint)programObject->getActiveUniformCount())
3836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003838 }
3839
3840 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3841 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003842 }
3843 catch(std::bad_alloc&)
3844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003846 }
3847}
3848
3849void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003851 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 +00003852 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003853
3854 try
3855 {
3856 if (maxcount < 0)
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859 }
3860
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003861 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003862
3863 if (context)
3864 {
3865 gl::Program *programObject = context->getProgram(program);
3866
3867 if (!programObject)
3868 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003869 if (context->getShader(program))
3870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003871 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003872 }
3873 else
3874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003876 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003877 }
3878
3879 return programObject->getAttachedShaders(maxcount, count, shaders);
3880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 }
3882 catch(std::bad_alloc&)
3883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885 }
3886}
3887
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003888int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003890 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003891
3892 try
3893 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003894 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003895
3896 if (context)
3897 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003898
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003899 gl::Program *programObject = context->getProgram(program);
3900
3901 if (!programObject)
3902 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003903 if (context->getShader(program))
3904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003905 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003906 }
3907 else
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003910 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003911 }
3912
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003913 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003914 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003916 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003917 }
3918
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003919 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003920 }
3921 }
3922 catch(std::bad_alloc&)
3923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003924 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003925 }
3926
3927 return -1;
3928}
3929
3930void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003932 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003933
3934 try
3935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003937
3938 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003940 if (!(context->getBooleanv(pname, params)))
3941 {
3942 GLenum nativeType;
3943 unsigned int numParams = 0;
3944 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003945 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003946
3947 if (numParams == 0)
3948 return; // it is known that the pname is valid, but there are no parameters to return
3949
3950 if (nativeType == GL_FLOAT)
3951 {
3952 GLfloat *floatParams = NULL;
3953 floatParams = new GLfloat[numParams];
3954
3955 context->getFloatv(pname, floatParams);
3956
3957 for (unsigned int i = 0; i < numParams; ++i)
3958 {
3959 if (floatParams[i] == 0.0f)
3960 params[i] = GL_FALSE;
3961 else
3962 params[i] = GL_TRUE;
3963 }
3964
3965 delete [] floatParams;
3966 }
3967 else if (nativeType == GL_INT)
3968 {
3969 GLint *intParams = NULL;
3970 intParams = new GLint[numParams];
3971
3972 context->getIntegerv(pname, intParams);
3973
3974 for (unsigned int i = 0; i < numParams; ++i)
3975 {
3976 if (intParams[i] == 0)
3977 params[i] = GL_FALSE;
3978 else
3979 params[i] = GL_TRUE;
3980 }
3981
3982 delete [] intParams;
3983 }
3984 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985 }
3986 }
3987 catch(std::bad_alloc&)
3988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003989 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003990 }
3991}
3992
3993void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3994{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003995 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 +00003996
3997 try
3998 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003999 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00004000
4001 if (context)
4002 {
4003 gl::Buffer *buffer;
4004
4005 switch (target)
4006 {
4007 case GL_ARRAY_BUFFER:
4008 buffer = context->getArrayBuffer();
4009 break;
4010 case GL_ELEMENT_ARRAY_BUFFER:
4011 buffer = context->getElementArrayBuffer();
4012 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004013 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00004014 }
4015
4016 if (!buffer)
4017 {
4018 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004019 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00004020 }
4021
4022 switch (pname)
4023 {
4024 case GL_BUFFER_USAGE:
4025 *params = buffer->usage();
4026 break;
4027 case GL_BUFFER_SIZE:
4028 *params = buffer->size();
4029 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004030 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00004031 }
4032 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004033 }
4034 catch(std::bad_alloc&)
4035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004036 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037 }
4038}
4039
4040GLenum __stdcall glGetError(void)
4041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004042 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043
4044 gl::Context *context = gl::getContext();
4045
4046 if (context)
4047 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00004048 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049 }
4050
4051 return GL_NO_ERROR;
4052}
4053
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004054void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
4055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004056 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004057
4058 try
4059 {
4060
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004061 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004062
4063 if (context)
4064 {
4065 gl::Fence *fenceObject = context->getFence(fence);
4066
4067 if (fenceObject == NULL)
4068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004069 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004070 }
4071
4072 fenceObject->getFenceiv(pname, params);
4073 }
4074 }
4075 catch(std::bad_alloc&)
4076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004077 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004078 }
4079}
4080
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004081void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
4082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004083 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084
4085 try
4086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004088
4089 if (context)
4090 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004091 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004092 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004093 GLenum nativeType;
4094 unsigned int numParams = 0;
4095 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004097
4098 if (numParams == 0)
4099 return; // it is known that the pname is valid, but that there are no parameters to return.
4100
4101 if (nativeType == GL_BOOL)
4102 {
4103 GLboolean *boolParams = NULL;
4104 boolParams = new GLboolean[numParams];
4105
4106 context->getBooleanv(pname, boolParams);
4107
4108 for (unsigned int i = 0; i < numParams; ++i)
4109 {
4110 if (boolParams[i] == GL_FALSE)
4111 params[i] = 0.0f;
4112 else
4113 params[i] = 1.0f;
4114 }
4115
4116 delete [] boolParams;
4117 }
4118 else if (nativeType == GL_INT)
4119 {
4120 GLint *intParams = NULL;
4121 intParams = new GLint[numParams];
4122
4123 context->getIntegerv(pname, intParams);
4124
4125 for (unsigned int i = 0; i < numParams; ++i)
4126 {
4127 params[i] = (GLfloat)intParams[i];
4128 }
4129
4130 delete [] intParams;
4131 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004132 }
4133 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134 }
4135 catch(std::bad_alloc&)
4136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004137 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138 }
4139}
4140
4141void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
4142{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004143 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 +00004144 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145
4146 try
4147 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004148 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004149
4150 if (context)
4151 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004152 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004155 }
4156
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004157 gl::Framebuffer *framebuffer = NULL;
4158 if (target == GL_READ_FRAMEBUFFER_ANGLE)
4159 {
4160 if(context->getReadFramebufferHandle() == 0)
4161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004162 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004163 }
4164
4165 framebuffer = context->getReadFramebuffer();
4166 }
4167 else
4168 {
4169 if (context->getDrawFramebufferHandle() == 0)
4170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004171 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004172 }
4173
4174 framebuffer = context->getDrawFramebuffer();
4175 }
4176
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004177 GLenum attachmentType;
4178 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00004179
4180 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004181 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00004182 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
4183
4184 if (colorAttachment >= context->getMaximumRenderTargets())
4185 {
4186 return gl::error(GL_INVALID_ENUM);
4187 }
4188
4189 attachmentType = framebuffer->getColorbufferType(colorAttachment);
4190 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
4191 }
4192 else
4193 {
4194 switch (attachment)
4195 {
4196 case GL_DEPTH_ATTACHMENT:
4197 attachmentType = framebuffer->getDepthbufferType();
4198 attachmentHandle = framebuffer->getDepthbufferHandle();
4199 break;
4200 case GL_STENCIL_ATTACHMENT:
4201 attachmentType = framebuffer->getStencilbufferType();
4202 attachmentHandle = framebuffer->getStencilbufferHandle();
4203 break;
4204 default: return gl::error(GL_INVALID_ENUM);
4205 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004206 }
4207
4208 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00004209 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004210 {
4211 attachmentObjectType = attachmentType;
4212 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00004213 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004214 {
4215 attachmentObjectType = GL_TEXTURE;
4216 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00004217 else
4218 {
4219 UNREACHABLE();
4220 return;
4221 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004222
4223 switch (pname)
4224 {
4225 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
4226 *params = attachmentObjectType;
4227 break;
4228 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
4229 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
4230 {
4231 *params = attachmentHandle;
4232 }
4233 else
4234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004235 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004236 }
4237 break;
4238 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
4239 if (attachmentObjectType == GL_TEXTURE)
4240 {
4241 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
4242 }
4243 else
4244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004245 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004246 }
4247 break;
4248 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
4249 if (attachmentObjectType == GL_TEXTURE)
4250 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00004251 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004252 {
4253 *params = attachmentType;
4254 }
4255 else
4256 {
4257 *params = 0;
4258 }
4259 }
4260 else
4261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004262 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004263 }
4264 break;
4265 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004266 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004267 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268 }
4269 }
4270 catch(std::bad_alloc&)
4271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004272 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 }
4274}
4275
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00004276GLenum __stdcall glGetGraphicsResetStatusEXT(void)
4277{
4278 EVENT("()");
4279
4280 try
4281 {
4282 gl::Context *context = gl::getContext();
4283
4284 if (context)
4285 {
4286 return context->getResetStatus();
4287 }
4288
4289 return GL_NO_ERROR;
4290 }
4291 catch(std::bad_alloc&)
4292 {
4293 return GL_OUT_OF_MEMORY;
4294 }
4295}
4296
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004297void __stdcall glGetIntegerv(GLenum pname, GLint* params)
4298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004299 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
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)
4306 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004307 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004308 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004309 GLenum nativeType;
4310 unsigned int numParams = 0;
4311 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004313
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004314 if (numParams == 0)
4315 return; // it is known that pname is valid, but there are no parameters to return
4316
4317 if (nativeType == GL_BOOL)
4318 {
4319 GLboolean *boolParams = NULL;
4320 boolParams = new GLboolean[numParams];
4321
4322 context->getBooleanv(pname, boolParams);
4323
4324 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004325 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004326 if (boolParams[i] == GL_FALSE)
4327 params[i] = 0;
4328 else
4329 params[i] = 1;
4330 }
4331
4332 delete [] boolParams;
4333 }
4334 else if (nativeType == GL_FLOAT)
4335 {
4336 GLfloat *floatParams = NULL;
4337 floatParams = new GLfloat[numParams];
4338
4339 context->getFloatv(pname, floatParams);
4340
4341 for (unsigned int i = 0; i < numParams; ++i)
4342 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00004343 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 +00004344 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004345 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004346 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004347 else
4348 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 +00004349 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004350
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004351 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353 }
4354 }
4355 }
4356 catch(std::bad_alloc&)
4357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 }
4360}
4361
4362void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
4363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004364 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365
4366 try
4367 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004368 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369
4370 if (context)
4371 {
4372 gl::Program *programObject = context->getProgram(program);
4373
4374 if (!programObject)
4375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377 }
4378
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004379 if (context->getClientVersion() < 3)
4380 {
4381 switch (pname)
4382 {
4383 case GL_ACTIVE_UNIFORM_BLOCKS:
4384 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4385 return gl::error(GL_INVALID_ENUM);
4386 }
4387 }
4388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 switch (pname)
4390 {
4391 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004392 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004393 return;
4394 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004395 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004396 return;
4397 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004398 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004399 return;
4400 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004401 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402 return;
4403 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004404 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004405 return;
4406 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004407 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004408 return;
4409 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004410 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411 return;
4412 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004413 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414 return;
4415 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004416 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004418 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004419 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004420 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004421 case GL_ACTIVE_UNIFORM_BLOCKS:
4422 *params = programObject->getActiveUniformBlockCount();
4423 return;
4424 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4425 *params = programObject->getActiveUniformBlockMaxLength();
4426 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004428 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429 }
4430 }
4431 }
4432 catch(std::bad_alloc&)
4433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004434 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004435 }
4436}
4437
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004438void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004440 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 +00004441 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
4443 try
4444 {
4445 if (bufsize < 0)
4446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448 }
4449
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004451
4452 if (context)
4453 {
4454 gl::Program *programObject = context->getProgram(program);
4455
4456 if (!programObject)
4457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004458 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004459 }
4460
4461 programObject->getInfoLog(bufsize, length, infolog);
4462 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004463 }
4464 catch(std::bad_alloc&)
4465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004466 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004467 }
4468}
4469
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004470void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4471{
4472 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4473
4474 try
4475 {
4476 switch (pname)
4477 {
4478 case GL_CURRENT_QUERY_EXT:
4479 break;
4480 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004481 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004482 }
4483
4484 gl::Context *context = gl::getNonLostContext();
4485
4486 if (context)
4487 {
4488 params[0] = context->getActiveQuery(target);
4489 }
4490 }
4491 catch(std::bad_alloc&)
4492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004493 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004494 }
4495}
4496
4497void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4498{
4499 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4500
4501 try
4502 {
4503 switch (pname)
4504 {
4505 case GL_QUERY_RESULT_EXT:
4506 case GL_QUERY_RESULT_AVAILABLE_EXT:
4507 break;
4508 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004509 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004510 }
4511 gl::Context *context = gl::getNonLostContext();
4512
4513 if (context)
4514 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004515 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4516
4517 if (!queryObject)
4518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004520 }
4521
4522 if (context->getActiveQuery(queryObject->getType()) == id)
4523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004524 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004525 }
4526
4527 switch(pname)
4528 {
4529 case GL_QUERY_RESULT_EXT:
4530 params[0] = queryObject->getResult();
4531 break;
4532 case GL_QUERY_RESULT_AVAILABLE_EXT:
4533 params[0] = queryObject->isResultAvailable();
4534 break;
4535 default:
4536 ASSERT(false);
4537 }
4538 }
4539 }
4540 catch(std::bad_alloc&)
4541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004543 }
4544}
4545
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004546void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004548 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 +00004549
4550 try
4551 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004553
4554 if (context)
4555 {
4556 if (target != GL_RENDERBUFFER)
4557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004558 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004559 }
4560
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004561 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004563 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004564 }
4565
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004566 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004567
4568 switch (pname)
4569 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004570 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4571 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4572 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4573 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4574 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4575 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4576 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4577 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4578 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004579 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004580 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004581 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004582 *params = renderbuffer->getSamples();
4583 }
4584 else
4585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004587 }
4588 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004589 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004590 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004591 }
4592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594 catch(std::bad_alloc&)
4595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 }
4598}
4599
4600void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004602 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603
4604 try
4605 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004607
4608 if (context)
4609 {
4610 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004611
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004612 if (!shaderObject)
4613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004614 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004615 }
4616
4617 switch (pname)
4618 {
4619 case GL_SHADER_TYPE:
4620 *params = shaderObject->getType();
4621 return;
4622 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004623 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004624 return;
4625 case GL_COMPILE_STATUS:
4626 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4627 return;
4628 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004629 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630 return;
4631 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004632 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004634 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4635 *params = shaderObject->getTranslatedSourceLength();
4636 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004638 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 }
4640 }
4641 }
4642 catch(std::bad_alloc&)
4643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 }
4646}
4647
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004648void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004650 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 +00004651 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652
4653 try
4654 {
4655 if (bufsize < 0)
4656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004658 }
4659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004661
4662 if (context)
4663 {
4664 gl::Shader *shaderObject = context->getShader(shader);
4665
4666 if (!shaderObject)
4667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004669 }
4670
4671 shaderObject->getInfoLog(bufsize, length, infolog);
4672 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004673 }
4674 catch(std::bad_alloc&)
4675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 }
4678}
4679
4680void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4681{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004682 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 +00004683 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684
4685 try
4686 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004687 switch (shadertype)
4688 {
4689 case GL_VERTEX_SHADER:
4690 case GL_FRAGMENT_SHADER:
4691 break;
4692 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004693 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004694 }
4695
4696 switch (precisiontype)
4697 {
4698 case GL_LOW_FLOAT:
4699 case GL_MEDIUM_FLOAT:
4700 case GL_HIGH_FLOAT:
4701 // Assume IEEE 754 precision
4702 range[0] = 127;
4703 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004704 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004705 break;
4706 case GL_LOW_INT:
4707 case GL_MEDIUM_INT:
4708 case GL_HIGH_INT:
4709 // Some (most) hardware only supports single-precision floating-point numbers,
4710 // which can accurately represent integers up to +/-16777216
4711 range[0] = 24;
4712 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004713 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004714 break;
4715 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004717 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004718 }
4719 catch(std::bad_alloc&)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722 }
4723}
4724
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004725void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004727 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 +00004728 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729
4730 try
4731 {
4732 if (bufsize < 0)
4733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735 }
4736
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004737 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004738
4739 if (context)
4740 {
4741 gl::Shader *shaderObject = context->getShader(shader);
4742
4743 if (!shaderObject)
4744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004745 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004746 }
4747
4748 shaderObject->getSource(bufsize, length, source);
4749 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750 }
4751 catch(std::bad_alloc&)
4752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754 }
4755}
4756
zmo@google.coma574f782011-10-03 21:45:23 +00004757void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4758{
4759 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4760 shader, bufsize, length, source);
4761
4762 try
4763 {
4764 if (bufsize < 0)
4765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004766 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004767 }
4768
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004769 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004770
4771 if (context)
4772 {
4773 gl::Shader *shaderObject = context->getShader(shader);
4774
4775 if (!shaderObject)
4776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004777 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004778 }
4779
4780 shaderObject->getTranslatedSource(bufsize, length, source);
4781 }
4782 }
4783 catch(std::bad_alloc&)
4784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004785 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004786 }
4787}
4788
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004789const GLubyte* __stdcall glGetString(GLenum name)
4790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004791 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792
4793 try
4794 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004796
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004797 switch (name)
4798 {
4799 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004800 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004801 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004802 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004803 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004804 if (context->getClientVersion() == 2)
4805 {
4806 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4807 }
4808 else
4809 {
4810 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4811 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004813 if (context->getClientVersion() == 2)
4814 {
4815 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4816 }
4817 else
4818 {
4819 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004822 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004823 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004824 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825 }
4826 }
4827 catch(std::bad_alloc&)
4828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004829 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004831}
4832
4833void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004835 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 +00004836
4837 try
4838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004840
4841 if (context)
4842 {
4843 gl::Texture *texture;
4844
4845 switch (target)
4846 {
4847 case GL_TEXTURE_2D:
4848 texture = context->getTexture2D();
4849 break;
4850 case GL_TEXTURE_CUBE_MAP:
4851 texture = context->getTextureCubeMap();
4852 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004853 case GL_TEXTURE_3D:
4854 if (context->getClientVersion() < 3)
4855 {
4856 return gl::error(GL_INVALID_ENUM);
4857 }
4858 texture = context->getTexture3D();
4859 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004860 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004861 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004862 }
4863
4864 switch (pname)
4865 {
4866 case GL_TEXTURE_MAG_FILTER:
4867 *params = (GLfloat)texture->getMagFilter();
4868 break;
4869 case GL_TEXTURE_MIN_FILTER:
4870 *params = (GLfloat)texture->getMinFilter();
4871 break;
4872 case GL_TEXTURE_WRAP_S:
4873 *params = (GLfloat)texture->getWrapS();
4874 break;
4875 case GL_TEXTURE_WRAP_T:
4876 *params = (GLfloat)texture->getWrapT();
4877 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004878 case GL_TEXTURE_WRAP_R:
4879 if (context->getClientVersion() < 3)
4880 {
4881 return gl::error(GL_INVALID_ENUM);
4882 }
4883 *params = (GLfloat)texture->getWrapR();
4884 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004885 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4886 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4887 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004888 case GL_TEXTURE_USAGE_ANGLE:
4889 *params = (GLfloat)texture->getUsage();
4890 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004891 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4892 if (!context->supportsTextureFilterAnisotropy())
4893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004894 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004895 }
4896 *params = (GLfloat)texture->getMaxAnisotropy();
4897 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004898 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004899 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004900 }
4901 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004902 }
4903 catch(std::bad_alloc&)
4904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907}
4908
4909void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004911 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 +00004912
4913 try
4914 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004915 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004916
4917 if (context)
4918 {
4919 gl::Texture *texture;
4920
4921 switch (target)
4922 {
4923 case GL_TEXTURE_2D:
4924 texture = context->getTexture2D();
4925 break;
4926 case GL_TEXTURE_CUBE_MAP:
4927 texture = context->getTextureCubeMap();
4928 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004929 case GL_TEXTURE_3D:
4930 if (context->getClientVersion() < 3)
4931 {
4932 return gl::error(GL_INVALID_ENUM);
4933 }
4934 texture = context->getTexture3D();
4935 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004936 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004937 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004938 }
4939
4940 switch (pname)
4941 {
4942 case GL_TEXTURE_MAG_FILTER:
4943 *params = texture->getMagFilter();
4944 break;
4945 case GL_TEXTURE_MIN_FILTER:
4946 *params = texture->getMinFilter();
4947 break;
4948 case GL_TEXTURE_WRAP_S:
4949 *params = texture->getWrapS();
4950 break;
4951 case GL_TEXTURE_WRAP_T:
4952 *params = texture->getWrapT();
4953 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004954 case GL_TEXTURE_WRAP_R:
4955 if (context->getClientVersion() < 3)
4956 {
4957 return gl::error(GL_INVALID_ENUM);
4958 }
4959 *params = texture->getWrapR();
4960 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004961 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4962 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4963 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004964 case GL_TEXTURE_USAGE_ANGLE:
4965 *params = texture->getUsage();
4966 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004967 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4968 if (!context->supportsTextureFilterAnisotropy())
4969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004970 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004971 }
4972 *params = (GLint)texture->getMaxAnisotropy();
4973 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004974 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004975 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004976 }
4977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004978 }
4979 catch(std::bad_alloc&)
4980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004981 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982 }
4983}
4984
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004985void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4986{
4987 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4988 program, location, bufSize, params);
4989
4990 try
4991 {
4992 if (bufSize < 0)
4993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004995 }
4996
4997 gl::Context *context = gl::getNonLostContext();
4998
4999 if (context)
5000 {
5001 if (program == 0)
5002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005003 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005004 }
5005
5006 gl::Program *programObject = context->getProgram(program);
5007
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005008 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005010 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005011 }
5012
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005013 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
5014 if (!programBinary)
5015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005016 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005017 }
5018
5019 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005021 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005022 }
5023 }
5024 }
5025 catch(std::bad_alloc&)
5026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005027 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005028 }
5029}
5030
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005031void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
5032{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005033 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005034
5035 try
5036 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005037 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005038
5039 if (context)
5040 {
5041 if (program == 0)
5042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005043 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005044 }
5045
5046 gl::Program *programObject = context->getProgram(program);
5047
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005048 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005050 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005051 }
5052
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005053 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
5054 if (!programBinary)
5055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005056 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005057 }
5058
5059 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005061 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005062 }
5063 }
5064 }
5065 catch(std::bad_alloc&)
5066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005068 }
5069}
5070
5071void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
5072{
5073 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
5074 program, location, bufSize, params);
5075
5076 try
5077 {
5078 if (bufSize < 0)
5079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005080 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005081 }
5082
5083 gl::Context *context = gl::getNonLostContext();
5084
5085 if (context)
5086 {
5087 if (program == 0)
5088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005089 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005090 }
5091
5092 gl::Program *programObject = context->getProgram(program);
5093
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005094 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005096 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005097 }
5098
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005099 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
5100 if (!programBinary)
5101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005103 }
5104
5105 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005107 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005108 }
5109 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005110 }
5111 catch(std::bad_alloc&)
5112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 }
5115}
5116
5117void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
5118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005119 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005120
5121 try
5122 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005123 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005124
5125 if (context)
5126 {
5127 if (program == 0)
5128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005129 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005130 }
5131
5132 gl::Program *programObject = context->getProgram(program);
5133
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005134 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005137 }
5138
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005139 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
5140 if (!programBinary)
5141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005142 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005143 }
5144
5145 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005147 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005148 }
5149 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150 }
5151 catch(std::bad_alloc&)
5152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154 }
5155}
5156
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005157int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005159 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160
5161 try
5162 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005164
5165 if (strstr(name, "gl_") == name)
5166 {
5167 return -1;
5168 }
5169
5170 if (context)
5171 {
5172 gl::Program *programObject = context->getProgram(program);
5173
5174 if (!programObject)
5175 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00005176 if (context->getShader(program))
5177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005178 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00005179 }
5180 else
5181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005182 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00005183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005184 }
5185
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005186 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005187 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005189 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005190 }
5191
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005192 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005193 }
5194 }
5195 catch(std::bad_alloc&)
5196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005197 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 }
5199
5200 return -1;
5201}
5202
5203void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
5204{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005205 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206
5207 try
5208 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005209 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210
daniel@transgaming.come0078962010-04-15 20:45:08 +00005211 if (context)
5212 {
5213 if (index >= gl::MAX_VERTEX_ATTRIBS)
5214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005216 }
5217
daniel@transgaming.com83921382011-01-08 05:46:00 +00005218 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005219
daniel@transgaming.come0078962010-04-15 20:45:08 +00005220 switch (pname)
5221 {
5222 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00005223 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005224 break;
5225 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005226 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005227 break;
5228 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005229 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005230 break;
5231 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005232 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005233 break;
5234 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005235 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005236 break;
5237 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005238 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00005239 break;
5240 case GL_CURRENT_VERTEX_ATTRIB:
5241 for (int i = 0; i < 4; ++i)
5242 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00005243 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00005244 }
5245 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00005246 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
5247 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
5248 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005249 *params = (GLfloat)attribState.mDivisor;
5250 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005251 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005252 }
5253 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005254 }
5255 catch(std::bad_alloc&)
5256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005257 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 }
5259}
5260
5261void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
5262{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005263 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005264
5265 try
5266 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268
daniel@transgaming.come0078962010-04-15 20:45:08 +00005269 if (context)
5270 {
5271 if (index >= gl::MAX_VERTEX_ATTRIBS)
5272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005274 }
5275
daniel@transgaming.com83921382011-01-08 05:46:00 +00005276 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005277
daniel@transgaming.come0078962010-04-15 20:45:08 +00005278 switch (pname)
5279 {
5280 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00005281 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005282 break;
5283 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005284 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005285 break;
5286 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005287 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005288 break;
5289 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005290 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005291 break;
5292 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005293 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005294 break;
5295 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005296 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00005297 break;
5298 case GL_CURRENT_VERTEX_ATTRIB:
5299 for (int i = 0; i < 4; ++i)
5300 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00005301 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00005302 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
5303 }
5304 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00005305 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
5306 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
5307 // the same constant.
5308 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005309 *params = (GLint)attribState.mDivisor;
5310 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005311 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005312 }
5313 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005314 }
5315 catch(std::bad_alloc&)
5316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005317 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 }
5319}
5320
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005321void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005323 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324
5325 try
5326 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005328
daniel@transgaming.come0078962010-04-15 20:45:08 +00005329 if (context)
5330 {
5331 if (index >= gl::MAX_VERTEX_ATTRIBS)
5332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005333 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005334 }
5335
5336 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
5337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005338 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005339 }
5340
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005341 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00005342 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005343 }
5344 catch(std::bad_alloc&)
5345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347 }
5348}
5349
5350void __stdcall glHint(GLenum target, GLenum mode)
5351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005352 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353
5354 try
5355 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005356 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005357 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005358 case GL_FASTEST:
5359 case GL_NICEST:
5360 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005361 break;
5362 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005363 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005364 }
5365
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005366 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005367 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005368 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005369 case GL_GENERATE_MIPMAP_HINT:
5370 if (context) context->setGenerateMipmapHint(mode);
5371 break;
5372 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
5373 if (context) context->setFragmentShaderDerivativeHint(mode);
5374 break;
5375 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005376 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005377 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378 }
5379 catch(std::bad_alloc&)
5380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005381 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005382 }
5383}
5384
5385GLboolean __stdcall glIsBuffer(GLuint buffer)
5386{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005387 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388
5389 try
5390 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005391 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005392
5393 if (context && buffer)
5394 {
5395 gl::Buffer *bufferObject = context->getBuffer(buffer);
5396
5397 if (bufferObject)
5398 {
5399 return GL_TRUE;
5400 }
5401 }
5402 }
5403 catch(std::bad_alloc&)
5404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005405 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406 }
5407
5408 return GL_FALSE;
5409}
5410
5411GLboolean __stdcall glIsEnabled(GLenum cap)
5412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005413 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005414
5415 try
5416 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005417 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005418
5419 if (context)
5420 {
5421 switch (cap)
5422 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005423 case GL_CULL_FACE: return context->isCullFaceEnabled();
5424 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5425 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5426 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5427 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5428 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5429 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5430 case GL_BLEND: return context->isBlendEnabled();
5431 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005433 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434 }
5435 }
5436 }
5437 catch(std::bad_alloc&)
5438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005439 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005440 }
5441
5442 return false;
5443}
5444
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005445GLboolean __stdcall glIsFenceNV(GLuint fence)
5446{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005447 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005448
5449 try
5450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005451 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005452
5453 if (context)
5454 {
5455 gl::Fence *fenceObject = context->getFence(fence);
5456
5457 if (fenceObject == NULL)
5458 {
5459 return GL_FALSE;
5460 }
5461
5462 return fenceObject->isFence();
5463 }
5464 }
5465 catch(std::bad_alloc&)
5466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005468 }
5469
5470 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005471}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005472
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005473GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005475 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476
5477 try
5478 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005480
5481 if (context && framebuffer)
5482 {
5483 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5484
5485 if (framebufferObject)
5486 {
5487 return GL_TRUE;
5488 }
5489 }
5490 }
5491 catch(std::bad_alloc&)
5492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005493 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005494 }
5495
5496 return GL_FALSE;
5497}
5498
5499GLboolean __stdcall glIsProgram(GLuint program)
5500{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005501 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005502
5503 try
5504 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005505 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506
5507 if (context && program)
5508 {
5509 gl::Program *programObject = context->getProgram(program);
5510
5511 if (programObject)
5512 {
5513 return GL_TRUE;
5514 }
5515 }
5516 }
5517 catch(std::bad_alloc&)
5518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005519 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 }
5521
5522 return GL_FALSE;
5523}
5524
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005525GLboolean __stdcall glIsQueryEXT(GLuint id)
5526{
5527 EVENT("(GLuint id = %d)", id);
5528
5529 try
5530 {
5531 if (id == 0)
5532 {
5533 return GL_FALSE;
5534 }
5535
5536 gl::Context *context = gl::getNonLostContext();
5537
5538 if (context)
5539 {
5540 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5541
5542 if (queryObject)
5543 {
5544 return GL_TRUE;
5545 }
5546 }
5547 }
5548 catch(std::bad_alloc&)
5549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005550 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005551 }
5552
5553 return GL_FALSE;
5554}
5555
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005556GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005558 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005559
5560 try
5561 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563
5564 if (context && renderbuffer)
5565 {
5566 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5567
5568 if (renderbufferObject)
5569 {
5570 return GL_TRUE;
5571 }
5572 }
5573 }
5574 catch(std::bad_alloc&)
5575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005576 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577 }
5578
5579 return GL_FALSE;
5580}
5581
5582GLboolean __stdcall glIsShader(GLuint shader)
5583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005584 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585
5586 try
5587 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005588 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589
5590 if (context && shader)
5591 {
5592 gl::Shader *shaderObject = context->getShader(shader);
5593
5594 if (shaderObject)
5595 {
5596 return GL_TRUE;
5597 }
5598 }
5599 }
5600 catch(std::bad_alloc&)
5601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005602 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603 }
5604
5605 return GL_FALSE;
5606}
5607
5608GLboolean __stdcall glIsTexture(GLuint texture)
5609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005610 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611
5612 try
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 && texture)
5617 {
5618 gl::Texture *textureObject = context->getTexture(texture);
5619
5620 if (textureObject)
5621 {
5622 return GL_TRUE;
5623 }
5624 }
5625 }
5626 catch(std::bad_alloc&)
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630
5631 return GL_FALSE;
5632}
5633
5634void __stdcall glLineWidth(GLfloat width)
5635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005636 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637
5638 try
5639 {
5640 if (width <= 0.0f)
5641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643 }
5644
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005645 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005646
5647 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005648 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005649 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650 }
5651 }
5652 catch(std::bad_alloc&)
5653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655 }
5656}
5657
5658void __stdcall glLinkProgram(GLuint program)
5659{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005660 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661
5662 try
5663 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665
5666 if (context)
5667 {
5668 gl::Program *programObject = context->getProgram(program);
5669
5670 if (!programObject)
5671 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005672 if (context->getShader(program))
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005675 }
5676 else
5677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005678 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005679 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005680 }
5681
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005682 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005683 }
5684 }
5685 catch(std::bad_alloc&)
5686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 }
5689}
5690
5691void __stdcall glPixelStorei(GLenum pname, GLint param)
5692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005693 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694
5695 try
5696 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005697 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005698
5699 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005701 switch (pname)
5702 {
5703 case GL_UNPACK_ALIGNMENT:
5704 if (param != 1 && param != 2 && param != 4 && param != 8)
5705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005707 }
5708
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005709 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005710 break;
5711
5712 case GL_PACK_ALIGNMENT:
5713 if (param != 1 && param != 2 && param != 4 && param != 8)
5714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005716 }
5717
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005718 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005719 break;
5720
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005721 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5722 context->setPackReverseRowOrder(param != 0);
5723 break;
5724
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005725 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005727 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729 }
5730 catch(std::bad_alloc&)
5731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005732 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005733 }
5734}
5735
5736void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005738 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739
5740 try
5741 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005742 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005743
5744 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005745 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005746 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747 }
5748 }
5749 catch(std::bad_alloc&)
5750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005751 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005752 }
5753}
5754
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005755void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5756 GLenum format, GLenum type, GLsizei bufSize,
5757 GLvoid *data)
5758{
5759 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5760 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5761 x, y, width, height, format, type, bufSize, data);
5762
5763 try
5764 {
5765 if (width < 0 || height < 0 || bufSize < 0)
5766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005767 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005768 }
5769
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005770 gl::Context *context = gl::getNonLostContext();
5771
5772 if (context)
5773 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005774 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005775 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005776
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005777 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5778 // and attempting to read back if that's the case is an error. The error will be registered
5779 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005780 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005781 return;
5782
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005783 bool validReadFormat = (context->getClientVersion() < 3) ? validES2ReadFormatType(format, type) :
5784 validES3ReadFormatType(currentInternalFormat, format, type);
5785
5786 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005788 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005789 }
5790
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005791 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5792 }
5793 }
5794 catch(std::bad_alloc&)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005797 }
5798}
5799
5800void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5801 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005803 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005804 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005805 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005806
5807 try
5808 {
5809 if (width < 0 || height < 0)
5810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812 }
5813
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005814 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005815
5816 if (context)
5817 {
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005818 GLint currentInternalFormat;
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005819 GLenum currentFormat, currentType;
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005820
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005821 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5822 // and attempting to read back if that's the case is an error. The error will be registered
5823 // by getCurrentReadFormat.
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005824 if (!context->getCurrentReadFormatType(&currentInternalFormat, &currentFormat, &currentType))
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005825 return;
5826
shannonwoods@chromium.org44a4f982013-05-30 00:13:49 +00005827 bool validReadFormat = (context->getClientVersion() < 3) ? validES2ReadFormatType(format, type) :
5828 validES3ReadFormatType(currentInternalFormat, format, type);
5829
5830 if (!(currentFormat == format && currentType == type) && !validReadFormat)
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005832 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005833 }
5834
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005835 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836 }
5837 }
5838 catch(std::bad_alloc&)
5839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841 }
5842}
5843
5844void __stdcall glReleaseShaderCompiler(void)
5845{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005846 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847
5848 try
5849 {
5850 gl::Shader::releaseCompiler();
5851 }
5852 catch(std::bad_alloc&)
5853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856}
5857
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005858void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005860 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 +00005861 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862
5863 try
5864 {
5865 switch (target)
5866 {
5867 case GL_RENDERBUFFER:
5868 break;
5869 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005871 }
5872
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005873 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005876 }
5877
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005878 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005879
5880 if (context)
5881 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005882 if (!gl::IsValidInternalFormat(internalformat, context))
5883 {
5884 return gl::error(GL_INVALID_ENUM);
5885 }
5886
5887 if (!gl::IsColorRenderingSupported(internalformat, context) &&
5888 !gl::IsDepthRenderingSupported(internalformat, context) &&
5889 !gl::IsStencilRenderingSupported(internalformat, context))
5890 {
5891 return gl::error(GL_INVALID_ENUM);
5892 }
5893
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005894 if (width > context->getMaximumRenderbufferDimension() ||
5895 height > context->getMaximumRenderbufferDimension() ||
5896 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005898 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005899 }
5900
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005901 GLuint handle = context->getRenderbufferHandle();
5902 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005904 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905 }
5906
5907 switch (internalformat)
5908 {
5909 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910 case GL_RGBA4:
5911 case GL_RGB5_A1:
5912 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005913 case GL_RGB8_OES:
5914 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005915 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005916 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005917 break;
5918 case GL_SRGB8_ALPHA8:
5919 case GL_RGB10_A2:
5920 case GL_RG8:
5921 case GL_R8:
5922 if (context->getClientVersion() < 3)
5923 {
5924 return gl::error(GL_INVALID_ENUM);
5925 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005926 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005927 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005928 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005929 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005930
5931 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932 }
5933 }
5934 catch(std::bad_alloc&)
5935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 }
5938}
5939
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005940void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5941{
5942 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5943}
5944
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005945void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5946{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005947 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005948
5949 try
5950 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005951 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005952
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005953 if (context)
5954 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005955 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005956 }
5957 }
5958 catch(std::bad_alloc&)
5959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005961 }
5962}
5963
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005964void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5965{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005966 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005967
5968 try
5969 {
5970 if (condition != GL_ALL_COMPLETED_NV)
5971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005973 }
5974
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005975 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005976
5977 if (context)
5978 {
5979 gl::Fence *fenceObject = context->getFence(fence);
5980
5981 if (fenceObject == NULL)
5982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005983 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005984 }
5985
5986 fenceObject->setFence(condition);
5987 }
5988 }
5989 catch(std::bad_alloc&)
5990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005992 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005993}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005994
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5996{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005997 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 +00005998
5999 try
6000 {
6001 if (width < 0 || height < 0)
6002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006003 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004 }
6005
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006006 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006007
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006008 if (context)
6009 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006010 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 }
6012 }
6013 catch(std::bad_alloc&)
6014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006016 }
6017}
6018
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006019void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006020{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006021 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006022 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006023 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024
6025 try
6026 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00006027 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006028 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006029 }
6030 catch(std::bad_alloc&)
6031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006032 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033 }
6034}
6035
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00006036void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006038 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 +00006039 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006040
6041 try
6042 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006043 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006045 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046 }
6047
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006048 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006049
6050 if (context)
6051 {
6052 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006053
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006054 if (!shaderObject)
6055 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006056 if (context->getProgram(shader))
6057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006058 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006059 }
6060 else
6061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006062 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006063 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065
6066 shaderObject->setSource(count, string, length);
6067 }
6068 }
6069 catch(std::bad_alloc&)
6070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006072 }
6073}
6074
6075void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
6076{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006077 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006078}
6079
6080void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
6081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006082 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 +00006083
6084 try
6085 {
6086 switch (face)
6087 {
6088 case GL_FRONT:
6089 case GL_BACK:
6090 case GL_FRONT_AND_BACK:
6091 break;
6092 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006093 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006094 }
6095
6096 switch (func)
6097 {
6098 case GL_NEVER:
6099 case GL_ALWAYS:
6100 case GL_LESS:
6101 case GL_LEQUAL:
6102 case GL_EQUAL:
6103 case GL_GEQUAL:
6104 case GL_GREATER:
6105 case GL_NOTEQUAL:
6106 break;
6107 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006108 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006109 }
6110
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006111 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006112
6113 if (context)
6114 {
6115 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
6116 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006117 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118 }
6119
6120 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
6121 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006122 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006123 }
6124 }
6125 }
6126 catch(std::bad_alloc&)
6127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006128 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006129 }
6130}
6131
6132void __stdcall glStencilMask(GLuint mask)
6133{
6134 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6135}
6136
6137void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
6138{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006139 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006140
6141 try
6142 {
6143 switch (face)
6144 {
6145 case GL_FRONT:
6146 case GL_BACK:
6147 case GL_FRONT_AND_BACK:
6148 break;
6149 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006151 }
6152
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154
6155 if (context)
6156 {
6157 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
6158 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006159 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006160 }
6161
6162 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
6163 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006164 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006165 }
6166 }
6167 }
6168 catch(std::bad_alloc&)
6169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006170 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006171 }
6172}
6173
6174void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6175{
6176 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6177}
6178
6179void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
6180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006181 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 +00006182 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006183
6184 try
6185 {
6186 switch (face)
6187 {
6188 case GL_FRONT:
6189 case GL_BACK:
6190 case GL_FRONT_AND_BACK:
6191 break;
6192 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006194 }
6195
6196 switch (fail)
6197 {
6198 case GL_ZERO:
6199 case GL_KEEP:
6200 case GL_REPLACE:
6201 case GL_INCR:
6202 case GL_DECR:
6203 case GL_INVERT:
6204 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006205 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006206 break;
6207 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006208 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006209 }
6210
6211 switch (zfail)
6212 {
6213 case GL_ZERO:
6214 case GL_KEEP:
6215 case GL_REPLACE:
6216 case GL_INCR:
6217 case GL_DECR:
6218 case GL_INVERT:
6219 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006220 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006221 break;
6222 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006223 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006224 }
6225
6226 switch (zpass)
6227 {
6228 case GL_ZERO:
6229 case GL_KEEP:
6230 case GL_REPLACE:
6231 case GL_INCR:
6232 case GL_DECR:
6233 case GL_INVERT:
6234 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006235 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006236 break;
6237 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006239 }
6240
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006242
6243 if (context)
6244 {
6245 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
6246 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006247 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006248 }
6249
6250 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
6251 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006252 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006253 }
6254 }
6255 }
6256 catch(std::bad_alloc&)
6257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006259 }
6260}
6261
daniel@transgaming.comfe208882010-09-01 15:47:57 +00006262GLboolean __stdcall glTestFenceNV(GLuint fence)
6263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006264 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006265
6266 try
6267 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006268 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006269
6270 if (context)
6271 {
6272 gl::Fence *fenceObject = context->getFence(fence);
6273
6274 if (fenceObject == NULL)
6275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006276 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006277 }
6278
6279 return fenceObject->testFence();
6280 }
6281 }
6282 catch(std::bad_alloc&)
6283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006284 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006285 }
6286
6287 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00006288}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006289
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006290void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
6291 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006292{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006293 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 +00006294 "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 +00006295 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006296
6297 try
6298 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006299 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006300
6301 if (context)
6302 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006303 if (context->getClientVersion() < 3 &&
6304 !validateES2TexImageParameters(context, target, level, internalformat, false, false,
6305 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006306 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006307 return;
6308 }
6309
6310 if (context->getClientVersion() >= 3 &&
6311 !validateES3TexImageParameters(context, target, level, internalformat, false, false,
6312 0, 0, 0, width, height, 1, border, format, type))
6313 {
6314 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006315 }
6316
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006317 switch (target)
6318 {
6319 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006320 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006321 gl::Texture2D *texture = context->getTexture2D();
6322 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006323 }
6324 break;
6325 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006326 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006327 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006328 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006329 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006330 break;
6331 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6332 {
6333 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6334 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6335 }
6336 break;
6337 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6338 {
6339 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6340 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6341 }
6342 break;
6343 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6344 {
6345 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6346 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6347 }
6348 break;
6349 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6350 {
6351 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6352 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6353 }
6354 break;
6355 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6356 {
6357 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6358 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6359 }
6360 break;
6361 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006362 }
6363 }
6364 }
6365 catch(std::bad_alloc&)
6366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006368 }
6369}
6370
6371void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6372{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006373 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6374
6375 try
6376 {
6377 gl::Context *context = gl::getNonLostContext();
6378
6379 if (context)
6380 {
6381 gl::Texture *texture;
6382
6383 switch (target)
6384 {
6385 case GL_TEXTURE_2D:
6386 texture = context->getTexture2D();
6387 break;
6388 case GL_TEXTURE_CUBE_MAP:
6389 texture = context->getTextureCubeMap();
6390 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006391 case GL_TEXTURE_3D:
6392 if (context->getClientVersion() < 3)
6393 {
6394 return gl::error(GL_INVALID_ENUM);
6395 }
6396 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006397 case GL_TEXTURE_2D_ARRAY:
6398 if (context->getClientVersion() < 3)
6399 {
6400 return gl::error(GL_INVALID_ENUM);
6401 }
6402 texture = context->getTexture2DArray();
6403 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006404 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006405 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006406 }
6407
6408 switch (pname)
6409 {
6410 case GL_TEXTURE_WRAP_S:
6411 if (!texture->setWrapS((GLenum)param))
6412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006413 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006414 }
6415 break;
6416 case GL_TEXTURE_WRAP_T:
6417 if (!texture->setWrapT((GLenum)param))
6418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006419 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006420 }
6421 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006422 case GL_TEXTURE_WRAP_R:
6423 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6424 {
6425 return gl::error(GL_INVALID_ENUM);
6426 }
6427 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006428 case GL_TEXTURE_MIN_FILTER:
6429 if (!texture->setMinFilter((GLenum)param))
6430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006432 }
6433 break;
6434 case GL_TEXTURE_MAG_FILTER:
6435 if (!texture->setMagFilter((GLenum)param))
6436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006437 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006438 }
6439 break;
6440 case GL_TEXTURE_USAGE_ANGLE:
6441 if (!texture->setUsage((GLenum)param))
6442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006444 }
6445 break;
6446 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6447 if (!context->supportsTextureFilterAnisotropy())
6448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006449 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006450 }
6451 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006453 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006454 }
6455 break;
6456 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006457 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006458 }
6459 }
6460 }
6461 catch(std::bad_alloc&)
6462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006463 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006464 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006465}
6466
6467void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6468{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006469 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006470}
6471
6472void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006474 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006475
6476 try
6477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006479
6480 if (context)
6481 {
6482 gl::Texture *texture;
6483
6484 switch (target)
6485 {
6486 case GL_TEXTURE_2D:
6487 texture = context->getTexture2D();
6488 break;
6489 case GL_TEXTURE_CUBE_MAP:
6490 texture = context->getTextureCubeMap();
6491 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006492 case GL_TEXTURE_3D:
6493 if (context->getClientVersion() < 3)
6494 {
6495 return gl::error(GL_INVALID_ENUM);
6496 }
6497 texture = context->getTexture3D();
6498 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006499 case GL_TEXTURE_2D_ARRAY:
6500 if (context->getClientVersion() < 3)
6501 {
6502 return gl::error(GL_INVALID_ENUM);
6503 }
6504 texture = context->getTexture2DArray();
6505 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006506 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006507 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006508 }
6509
6510 switch (pname)
6511 {
6512 case GL_TEXTURE_WRAP_S:
6513 if (!texture->setWrapS((GLenum)param))
6514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006515 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006516 }
6517 break;
6518 case GL_TEXTURE_WRAP_T:
6519 if (!texture->setWrapT((GLenum)param))
6520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006522 }
6523 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006524 case GL_TEXTURE_WRAP_R:
6525 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6526 {
6527 return gl::error(GL_INVALID_ENUM);
6528 }
6529 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006530 case GL_TEXTURE_MIN_FILTER:
6531 if (!texture->setMinFilter((GLenum)param))
6532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006533 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006534 }
6535 break;
6536 case GL_TEXTURE_MAG_FILTER:
6537 if (!texture->setMagFilter((GLenum)param))
6538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006539 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006540 }
6541 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006542 case GL_TEXTURE_USAGE_ANGLE:
6543 if (!texture->setUsage((GLenum)param))
6544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006545 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006546 }
6547 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006548 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6549 if (!context->supportsTextureFilterAnisotropy())
6550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006551 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006552 }
6553 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006555 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006556 }
6557 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006558 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006559 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006560 }
6561 }
6562 }
6563 catch(std::bad_alloc&)
6564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006565 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006566 }
6567}
6568
6569void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6570{
6571 glTexParameteri(target, pname, *params);
6572}
6573
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006574void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6575{
6576 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6577 target, levels, internalformat, width, height);
6578
6579 try
6580 {
6581 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006584 }
6585
6586 if (width < 1 || height < 1 || levels < 1)
6587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006588 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006589 }
6590
6591 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006593 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006594 }
6595
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006596 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006598 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006599 }
6600
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006601 gl::Context *context = gl::getNonLostContext();
6602
6603 if (context)
6604 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006605 if (!gl::IsValidInternalFormat(internalformat, context))
6606 {
6607 return gl::error(GL_INVALID_ENUM);
6608 }
6609
6610 GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
6611 GLenum type = gl::GetType(internalformat, context->getClientVersion());
6612
6613 if (format == GL_NONE || type == GL_NONE)
6614 {
6615 return gl::error(GL_INVALID_ENUM);
6616 }
6617
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006618 switch (target)
6619 {
6620 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006621 if (width > context->getMaximum2DTextureDimension() ||
6622 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006624 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006625 }
6626 break;
6627 case GL_TEXTURE_CUBE_MAP:
6628 if (width > context->getMaximumCubeTextureDimension() ||
6629 height > context->getMaximumCubeTextureDimension())
6630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006632 }
6633 break;
6634 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006635 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006636 }
6637
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006638 if (levels != 1 && !context->supportsNonPower2Texture())
6639 {
6640 if (!gl::isPow2(width) || !gl::isPow2(height))
6641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006643 }
6644 }
6645
daniel@transgaming.come1077362011-11-11 04:16:50 +00006646 switch (internalformat)
6647 {
6648 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6649 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6650 if (!context->supportsDXT1Textures())
6651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006652 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006653 }
6654 break;
6655 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6656 if (!context->supportsDXT3Textures())
6657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006658 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006659 }
6660 break;
6661 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6662 if (!context->supportsDXT5Textures())
6663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006664 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006665 }
6666 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006667 case GL_RGBA32F_EXT:
6668 case GL_RGB32F_EXT:
6669 case GL_ALPHA32F_EXT:
6670 case GL_LUMINANCE32F_EXT:
6671 case GL_LUMINANCE_ALPHA32F_EXT:
6672 if (!context->supportsFloat32Textures())
6673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006675 }
6676 break;
6677 case GL_RGBA16F_EXT:
6678 case GL_RGB16F_EXT:
6679 case GL_ALPHA16F_EXT:
6680 case GL_LUMINANCE16F_EXT:
6681 case GL_LUMINANCE_ALPHA16F_EXT:
6682 if (!context->supportsFloat16Textures())
6683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006685 }
6686 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006687 case GL_DEPTH_COMPONENT16:
6688 case GL_DEPTH_COMPONENT32_OES:
6689 case GL_DEPTH24_STENCIL8_OES:
6690 if (!context->supportsDepthTextures())
6691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006692 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006693 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006694 if (target != GL_TEXTURE_2D)
6695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006696 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006697 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006698 // ANGLE_depth_texture only supports 1-level textures
6699 if (levels != 1)
6700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006701 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006702 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006703 break;
6704 default:
6705 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006706 }
6707
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006708 if (target == GL_TEXTURE_2D)
6709 {
6710 gl::Texture2D *texture = context->getTexture2D();
6711
6712 if (!texture || texture->id() == 0)
6713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006714 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006715 }
6716
6717 if (texture->isImmutable())
6718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006719 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006720 }
6721
6722 texture->storage(levels, internalformat, width, height);
6723 }
6724 else if (target == GL_TEXTURE_CUBE_MAP)
6725 {
6726 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6727
6728 if (!texture || texture->id() == 0)
6729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006730 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006731 }
6732
6733 if (texture->isImmutable())
6734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006736 }
6737
6738 texture->storage(levels, internalformat, width);
6739 }
6740 else UNREACHABLE();
6741 }
6742 }
6743 catch(std::bad_alloc&)
6744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006746 }
6747}
6748
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006749void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6750 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006751{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006752 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006753 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006754 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006755 target, level, xoffset, yoffset, width, height, format, type, pixels);
6756
6757 try
6758 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006759 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006760
6761 if (context)
6762 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006763 if (context->getClientVersion() < 3 &&
6764 !validateES2TexImageParameters(context, target, level, GL_NONE, false, true,
6765 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006766 {
6767 return;
6768 }
6769
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006770 if (context->getClientVersion() >= 3 &&
6771 !validateES3TexImageParameters(context, target, level, GL_NONE, false, true,
6772 0, 0, 0, width, height, 1, 0, format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006773 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006774 return;
6775 }
6776
6777 switch (target)
6778 {
6779 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006780 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006781 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006782 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006783 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006784 break;
6785
6786 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6787 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6788 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6789 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6790 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6791 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006792 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006793 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006794 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006795 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006796 break;
6797
6798 default:
6799 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006800 }
6801 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006802 }
6803 catch(std::bad_alloc&)
6804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006805 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006806 }
6807}
6808
6809void __stdcall glUniform1f(GLint location, GLfloat x)
6810{
6811 glUniform1fv(location, 1, &x);
6812}
6813
6814void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006816 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006817
6818 try
6819 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820 if (count < 0)
6821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006823 }
6824
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006825 if (location == -1)
6826 {
6827 return;
6828 }
6829
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006830 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831
6832 if (context)
6833 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006834 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006835 if (!programBinary)
6836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006837 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006838 }
6839
6840 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006842 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006843 }
6844 }
6845 }
6846 catch(std::bad_alloc&)
6847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006849 }
6850}
6851
6852void __stdcall glUniform1i(GLint location, GLint x)
6853{
6854 glUniform1iv(location, 1, &x);
6855}
6856
6857void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006859 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006860
6861 try
6862 {
6863 if (count < 0)
6864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006866 }
6867
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006868 if (location == -1)
6869 {
6870 return;
6871 }
6872
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006873 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006874
6875 if (context)
6876 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006877 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006878 if (!programBinary)
6879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006880 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006881 }
6882
6883 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006886 }
6887 }
6888 }
6889 catch(std::bad_alloc&)
6890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006892 }
6893}
6894
6895void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6896{
6897 GLfloat xy[2] = {x, y};
6898
6899 glUniform2fv(location, 1, (GLfloat*)&xy);
6900}
6901
6902void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006904 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006905
6906 try
6907 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006908 if (count < 0)
6909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006911 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006912
6913 if (location == -1)
6914 {
6915 return;
6916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006917
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006919
6920 if (context)
6921 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006922 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006923 if (!programBinary)
6924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006925 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006926 }
6927
6928 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006931 }
6932 }
6933 }
6934 catch(std::bad_alloc&)
6935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006937 }
6938}
6939
6940void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6941{
6942 GLint xy[4] = {x, y};
6943
6944 glUniform2iv(location, 1, (GLint*)&xy);
6945}
6946
6947void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006949 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006950
6951 try
6952 {
6953 if (count < 0)
6954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006955 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006956 }
6957
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006958 if (location == -1)
6959 {
6960 return;
6961 }
6962
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006964
6965 if (context)
6966 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006967 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006968 if (!programBinary)
6969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006970 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006971 }
6972
6973 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006975 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006976 }
6977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006978 }
6979 catch(std::bad_alloc&)
6980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006981 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006982 }
6983}
6984
6985void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6986{
6987 GLfloat xyz[3] = {x, y, z};
6988
6989 glUniform3fv(location, 1, (GLfloat*)&xyz);
6990}
6991
6992void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6993{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006994 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006995
6996 try
6997 {
6998 if (count < 0)
6999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007000 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007001 }
7002
7003 if (location == -1)
7004 {
7005 return;
7006 }
7007
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007009
7010 if (context)
7011 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007012 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007013 if (!programBinary)
7014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007015 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007016 }
7017
7018 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007020 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007021 }
7022 }
7023 }
7024 catch(std::bad_alloc&)
7025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007026 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007027 }
7028}
7029
7030void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
7031{
7032 GLint xyz[3] = {x, y, z};
7033
7034 glUniform3iv(location, 1, (GLint*)&xyz);
7035}
7036
7037void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
7038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007039 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007040
7041 try
7042 {
7043 if (count < 0)
7044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007045 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007046 }
7047
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007048 if (location == -1)
7049 {
7050 return;
7051 }
7052
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007053 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007054
7055 if (context)
7056 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007057 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007058 if (!programBinary)
7059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007060 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007061 }
7062
7063 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007065 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007066 }
7067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007068 }
7069 catch(std::bad_alloc&)
7070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007072 }
7073}
7074
7075void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7076{
7077 GLfloat xyzw[4] = {x, y, z, w};
7078
7079 glUniform4fv(location, 1, (GLfloat*)&xyzw);
7080}
7081
7082void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
7083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007084 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007085
7086 try
7087 {
7088 if (count < 0)
7089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007091 }
7092
7093 if (location == -1)
7094 {
7095 return;
7096 }
7097
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007098 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007099
7100 if (context)
7101 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007102 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007103 if (!programBinary)
7104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007105 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007106 }
7107
7108 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007110 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007111 }
7112 }
7113 }
7114 catch(std::bad_alloc&)
7115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007116 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007117 }
7118}
7119
7120void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
7121{
7122 GLint xyzw[4] = {x, y, z, w};
7123
7124 glUniform4iv(location, 1, (GLint*)&xyzw);
7125}
7126
7127void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
7128{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007129 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007130
7131 try
7132 {
7133 if (count < 0)
7134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007135 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007136 }
7137
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007138 if (location == -1)
7139 {
7140 return;
7141 }
7142
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007144
7145 if (context)
7146 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007147 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007148 if (!programBinary)
7149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007150 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007151 }
7152
7153 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007156 }
7157 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007158 }
7159 catch(std::bad_alloc&)
7160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007162 }
7163}
7164
7165void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7166{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007167 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007168 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007169
7170 try
7171 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007172 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007175 }
7176
7177 if (location == -1)
7178 {
7179 return;
7180 }
7181
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007182 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007183
7184 if (context)
7185 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007186 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7187 {
7188 return gl::error(GL_INVALID_VALUE);
7189 }
7190
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007191 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007192 if (!programBinary)
7193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007194 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007195 }
7196
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007197 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007199 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007200 }
7201 }
7202 }
7203 catch(std::bad_alloc&)
7204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007206 }
7207}
7208
7209void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7210{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007211 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007212 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007213
7214 try
7215 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007216 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007218 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007219 }
7220
7221 if (location == -1)
7222 {
7223 return;
7224 }
7225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007227
7228 if (context)
7229 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007230 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7231 {
7232 return gl::error(GL_INVALID_VALUE);
7233 }
7234
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007235 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007236 if (!programBinary)
7237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007238 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007239 }
7240
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007241 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007243 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007244 }
7245 }
7246 }
7247 catch(std::bad_alloc&)
7248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007249 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007250 }
7251}
7252
7253void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7254{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007255 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007256 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007257
7258 try
7259 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007260 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007262 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007263 }
7264
7265 if (location == -1)
7266 {
7267 return;
7268 }
7269
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007271
7272 if (context)
7273 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007274 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7275 {
7276 return gl::error(GL_INVALID_VALUE);
7277 }
7278
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007279 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007280 if (!programBinary)
7281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007282 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007283 }
7284
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007285 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007287 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007288 }
7289 }
7290 }
7291 catch(std::bad_alloc&)
7292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007294 }
7295}
7296
7297void __stdcall glUseProgram(GLuint program)
7298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007299 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007300
7301 try
7302 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007303 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007304
7305 if (context)
7306 {
7307 gl::Program *programObject = context->getProgram(program);
7308
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007309 if (!programObject && program != 0)
7310 {
7311 if (context->getShader(program))
7312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007313 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007314 }
7315 else
7316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007317 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007318 }
7319 }
7320
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007321 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007323 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007324 }
7325
7326 context->useProgram(program);
7327 }
7328 }
7329 catch(std::bad_alloc&)
7330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007332 }
7333}
7334
7335void __stdcall glValidateProgram(GLuint program)
7336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007337 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007338
7339 try
7340 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007341 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007342
7343 if (context)
7344 {
7345 gl::Program *programObject = context->getProgram(program);
7346
7347 if (!programObject)
7348 {
7349 if (context->getShader(program))
7350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007352 }
7353 else
7354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007355 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007356 }
7357 }
7358
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007359 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007360 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007361 }
7362 catch(std::bad_alloc&)
7363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007365 }
7366}
7367
7368void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7369{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007370 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007371
7372 try
7373 {
7374 if (index >= gl::MAX_VERTEX_ATTRIBS)
7375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007377 }
7378
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007380
7381 if (context)
7382 {
7383 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007384 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007385 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007386 }
7387 catch(std::bad_alloc&)
7388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007389 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007390 }
7391}
7392
7393void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7394{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007395 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007396
7397 try
7398 {
7399 if (index >= gl::MAX_VERTEX_ATTRIBS)
7400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007401 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007402 }
7403
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007405
7406 if (context)
7407 {
7408 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007409 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007410 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007411 }
7412 catch(std::bad_alloc&)
7413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007414 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007415 }
7416}
7417
7418void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007420 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007421
7422 try
7423 {
7424 if (index >= gl::MAX_VERTEX_ATTRIBS)
7425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007427 }
7428
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007429 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007430
7431 if (context)
7432 {
7433 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007434 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007435 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007436 }
7437 catch(std::bad_alloc&)
7438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007439 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007440 }
7441}
7442
7443void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7444{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007445 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007446
7447 try
7448 {
7449 if (index >= gl::MAX_VERTEX_ATTRIBS)
7450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007451 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007452 }
7453
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007455
7456 if (context)
7457 {
7458 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007459 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007461 }
7462 catch(std::bad_alloc&)
7463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007464 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007465 }
7466}
7467
7468void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7469{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007470 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 +00007471
7472 try
7473 {
7474 if (index >= gl::MAX_VERTEX_ATTRIBS)
7475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007476 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007477 }
7478
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007480
7481 if (context)
7482 {
7483 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007484 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007485 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007486 }
7487 catch(std::bad_alloc&)
7488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007490 }
7491}
7492
7493void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7494{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007495 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007496
7497 try
7498 {
7499 if (index >= gl::MAX_VERTEX_ATTRIBS)
7500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007502 }
7503
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007504 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007505
7506 if (context)
7507 {
7508 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007509 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007510 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007511 }
7512 catch(std::bad_alloc&)
7513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007514 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007515 }
7516}
7517
7518void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7519{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007520 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 +00007521
7522 try
7523 {
7524 if (index >= gl::MAX_VERTEX_ATTRIBS)
7525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007526 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007527 }
7528
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007529 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007530
7531 if (context)
7532 {
7533 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007534 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007535 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007536 }
7537 catch(std::bad_alloc&)
7538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007539 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007540 }
7541}
7542
7543void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007545 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007546
7547 try
7548 {
7549 if (index >= gl::MAX_VERTEX_ATTRIBS)
7550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007552 }
7553
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007554 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007555
7556 if (context)
7557 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007558 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007559 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007560 }
7561 catch(std::bad_alloc&)
7562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007563 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007564 }
7565}
7566
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007567void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7568{
7569 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7570
7571 try
7572 {
7573 if (index >= gl::MAX_VERTEX_ATTRIBS)
7574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007576 }
7577
7578 gl::Context *context = gl::getNonLostContext();
7579
7580 if (context)
7581 {
7582 context->setVertexAttribDivisor(index, divisor);
7583 }
7584 }
7585 catch(std::bad_alloc&)
7586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007588 }
7589}
7590
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007591void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007593 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007594 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007595 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007596
7597 try
7598 {
7599 if (index >= gl::MAX_VERTEX_ATTRIBS)
7600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007601 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007602 }
7603
7604 if (size < 1 || size > 4)
7605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007606 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007607 }
7608
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007609 gl::Context *context = gl::getNonLostContext();
7610
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007611 switch (type)
7612 {
7613 case GL_BYTE:
7614 case GL_UNSIGNED_BYTE:
7615 case GL_SHORT:
7616 case GL_UNSIGNED_SHORT:
7617 case GL_FIXED:
7618 case GL_FLOAT:
7619 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007620 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007621 case GL_INT:
7622 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007623 case GL_INT_2_10_10_10_REV:
7624 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007625 if (context && context->getClientVersion() < 3)
7626 {
7627 return gl::error(GL_INVALID_ENUM);
7628 }
7629 else
7630 {
7631 break;
7632 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007633 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007635 }
7636
7637 if (stride < 0)
7638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007640 }
7641
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007642 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7643 {
7644 return gl::error(GL_INVALID_OPERATION);
7645 }
7646
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007647 if (context)
7648 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007649 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7650 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007651 }
7652 }
7653 catch(std::bad_alloc&)
7654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007656 }
7657}
7658
7659void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007661 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 +00007662
7663 try
7664 {
7665 if (width < 0 || height < 0)
7666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007667 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007668 }
7669
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007670 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007671
7672 if (context)
7673 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007674 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007675 }
7676 }
7677 catch(std::bad_alloc&)
7678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007680 }
7681}
7682
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007683// OpenGL ES 3.0 functions
7684
7685void __stdcall glReadBuffer(GLenum mode)
7686{
7687 EVENT("(GLenum mode = 0x%X)", mode);
7688
7689 try
7690 {
7691 gl::Context *context = gl::getNonLostContext();
7692
7693 if (context)
7694 {
7695 if (context->getClientVersion() < 3)
7696 {
7697 return gl::error(GL_INVALID_OPERATION);
7698 }
7699 }
7700
7701 UNIMPLEMENTED();
7702 }
7703 catch(std::bad_alloc&)
7704 {
7705 return gl::error(GL_OUT_OF_MEMORY);
7706 }
7707}
7708
7709void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7710{
7711 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7712 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7713
7714 try
7715 {
7716 gl::Context *context = gl::getNonLostContext();
7717
7718 if (context)
7719 {
7720 if (context->getClientVersion() < 3)
7721 {
7722 return gl::error(GL_INVALID_OPERATION);
7723 }
7724 }
7725
7726 UNIMPLEMENTED();
7727 }
7728 catch(std::bad_alloc&)
7729 {
7730 return gl::error(GL_OUT_OF_MEMORY);
7731 }
7732}
7733
7734void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7735{
7736 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7737 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7738 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7739 target, level, internalformat, width, height, depth, border, format, type, pixels);
7740
7741 try
7742 {
7743 gl::Context *context = gl::getNonLostContext();
7744
7745 if (context)
7746 {
7747 if (context->getClientVersion() < 3)
7748 {
7749 return gl::error(GL_INVALID_OPERATION);
7750 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007751
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007752 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007753 if (!validateES3TexImageParameters(context, target, level, internalformat, false, false,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007754 0, 0, 0, width, height, depth, border, format, type))
7755 {
7756 return;
7757 }
7758
7759 switch(target)
7760 {
7761 case GL_TEXTURE_3D:
7762 {
7763 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007764 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007765 }
7766 break;
7767
7768 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007769 {
7770 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007771 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007772 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007773 break;
7774
7775 default:
7776 return gl::error(GL_INVALID_ENUM);
7777 }
7778 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007779 }
7780 catch(std::bad_alloc&)
7781 {
7782 return gl::error(GL_OUT_OF_MEMORY);
7783 }
7784}
7785
7786void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
7787{
7788 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7789 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7790 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7791 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7792
7793 try
7794 {
7795 gl::Context *context = gl::getNonLostContext();
7796
7797 if (context)
7798 {
7799 if (context->getClientVersion() < 3)
7800 {
7801 return gl::error(GL_INVALID_OPERATION);
7802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007803
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007804 if (!pixels)
7805 {
7806 return gl::error(GL_INVALID_VALUE);
7807 }
7808
7809 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007810 if (!validateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007811 xoffset, yoffset, zoffset, width, height, depth, 0,
7812 format, type))
7813 {
7814 return;
7815 }
7816
7817 switch(target)
7818 {
7819 case GL_TEXTURE_3D:
7820 {
7821 gl::Texture3D *texture = context->getTexture3D();
7822 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7823 }
7824 break;
7825
7826 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007827 {
7828 gl::Texture2DArray *texture = context->getTexture2DArray();
7829 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7830 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007831 break;
7832
7833 default:
7834 return gl::error(GL_INVALID_ENUM);
7835 }
7836 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007837 }
7838 catch(std::bad_alloc&)
7839 {
7840 return gl::error(GL_OUT_OF_MEMORY);
7841 }
7842}
7843
7844void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7845{
7846 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7847 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7848 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7849
7850 try
7851 {
7852 gl::Context *context = gl::getNonLostContext();
7853
7854 if (context)
7855 {
7856 if (context->getClientVersion() < 3)
7857 {
7858 return gl::error(GL_INVALID_OPERATION);
7859 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007860
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007861 if (!validateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
7862 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007863 {
7864 return;
7865 }
7866
7867 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7868 gl::Texture *texture = NULL;
7869 switch (target)
7870 {
7871 case GL_TEXTURE_3D:
7872 texture = context->getTexture3D();
7873 break;
7874
7875 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007876 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007877 break;
7878
7879 default:
7880 return gl::error(GL_INVALID_ENUM);
7881 }
7882
7883 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007885 }
7886 catch(std::bad_alloc&)
7887 {
7888 return gl::error(GL_OUT_OF_MEMORY);
7889 }
7890}
7891
7892void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7893{
7894 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7895 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7896 "const GLvoid* data = 0x%0.8p)",
7897 target, level, internalformat, width, height, depth, border, imageSize, data);
7898
7899 try
7900 {
7901 gl::Context *context = gl::getNonLostContext();
7902
7903 if (context)
7904 {
7905 if (context->getClientVersion() < 3)
7906 {
7907 return gl::error(GL_INVALID_OPERATION);
7908 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007909
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007910 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007911 {
7912 return gl::error(GL_INVALID_VALUE);
7913 }
7914
7915 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007916 if (!validateES3TexImageParameters(context, target, level, internalformat, true, false,
7917 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007918 {
7919 return;
7920 }
7921
7922 switch(target)
7923 {
7924 case GL_TEXTURE_3D:
7925 {
7926 gl::Texture3D *texture = context->getTexture3D();
7927 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7928 }
7929 break;
7930
7931 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007932 {
7933 gl::Texture2DArray *texture = context->getTexture2DArray();
7934 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7935 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007936 break;
7937
7938 default:
7939 return gl::error(GL_INVALID_ENUM);
7940 }
7941 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007942 }
7943 catch(std::bad_alloc&)
7944 {
7945 return gl::error(GL_OUT_OF_MEMORY);
7946 }
7947}
7948
7949void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
7950{
7951 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7952 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7953 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7954 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7955
7956 try
7957 {
7958 gl::Context *context = gl::getNonLostContext();
7959
7960 if (context)
7961 {
7962 if (context->getClientVersion() < 3)
7963 {
7964 return gl::error(GL_INVALID_OPERATION);
7965 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007966
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007967 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007968 {
7969 return gl::error(GL_INVALID_VALUE);
7970 }
7971
7972 if (!data)
7973 {
7974 return gl::error(GL_INVALID_VALUE);
7975 }
7976
7977 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007978 if (!validateES3TexImageParameters(context, target, level, GL_NONE, true, true,
7979 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007980 {
7981 return;
7982 }
7983
7984 switch(target)
7985 {
7986 case GL_TEXTURE_3D:
7987 {
7988 gl::Texture3D *texture = context->getTexture3D();
7989 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7990 format, imageSize, data);
7991 }
7992 break;
7993
7994 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007995 {
7996 gl::Texture2DArray *texture = context->getTexture2DArray();
7997 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7998 format, imageSize, data);
7999 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00008000 break;
8001
8002 default:
8003 return gl::error(GL_INVALID_ENUM);
8004 }
8005 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008006 }
8007 catch(std::bad_alloc&)
8008 {
8009 return gl::error(GL_OUT_OF_MEMORY);
8010 }
8011}
8012
8013void __stdcall glGenQueries(GLsizei n, GLuint* ids)
8014{
8015 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
8016
8017 try
8018 {
8019 gl::Context *context = gl::getNonLostContext();
8020
8021 if (context)
8022 {
8023 if (context->getClientVersion() < 3)
8024 {
8025 return gl::error(GL_INVALID_OPERATION);
8026 }
8027 }
8028
8029 UNIMPLEMENTED();
8030 }
8031 catch(std::bad_alloc&)
8032 {
8033 return gl::error(GL_OUT_OF_MEMORY);
8034 }
8035}
8036
8037void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
8038{
8039 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
8040
8041 try
8042 {
8043 gl::Context *context = gl::getNonLostContext();
8044
8045 if (context)
8046 {
8047 if (context->getClientVersion() < 3)
8048 {
8049 return gl::error(GL_INVALID_OPERATION);
8050 }
8051 }
8052
8053 UNIMPLEMENTED();
8054 }
8055 catch(std::bad_alloc&)
8056 {
8057 return gl::error(GL_OUT_OF_MEMORY);
8058 }
8059}
8060
8061GLboolean __stdcall glIsQuery(GLuint id)
8062{
8063 EVENT("(GLuint id = %u)", id);
8064
8065 try
8066 {
8067 gl::Context *context = gl::getNonLostContext();
8068
8069 if (context)
8070 {
8071 if (context->getClientVersion() < 3)
8072 {
8073 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8074 }
8075 }
8076
8077 UNIMPLEMENTED();
8078 }
8079 catch(std::bad_alloc&)
8080 {
8081 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8082 }
8083
8084 return GL_FALSE;
8085}
8086
8087void __stdcall glBeginQuery(GLenum target, GLuint id)
8088{
8089 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
8090
8091 try
8092 {
8093 gl::Context *context = gl::getNonLostContext();
8094
8095 if (context)
8096 {
8097 if (context->getClientVersion() < 3)
8098 {
8099 return gl::error(GL_INVALID_OPERATION);
8100 }
8101 }
8102
8103 UNIMPLEMENTED();
8104 }
8105 catch(std::bad_alloc&)
8106 {
8107 return gl::error(GL_OUT_OF_MEMORY);
8108 }
8109}
8110
8111void __stdcall glEndQuery(GLenum target)
8112{
8113 EVENT("(GLenum target = 0x%X)", target);
8114
8115 try
8116 {
8117 gl::Context *context = gl::getNonLostContext();
8118
8119 if (context)
8120 {
8121 if (context->getClientVersion() < 3)
8122 {
8123 return gl::error(GL_INVALID_OPERATION);
8124 }
8125 }
8126
8127 UNIMPLEMENTED();
8128 }
8129 catch(std::bad_alloc&)
8130 {
8131 return gl::error(GL_OUT_OF_MEMORY);
8132 }
8133}
8134
8135void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
8136{
8137 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
8138
8139 try
8140 {
8141 gl::Context *context = gl::getNonLostContext();
8142
8143 if (context)
8144 {
8145 if (context->getClientVersion() < 3)
8146 {
8147 return gl::error(GL_INVALID_OPERATION);
8148 }
8149 }
8150
8151 UNIMPLEMENTED();
8152 }
8153 catch(std::bad_alloc&)
8154 {
8155 return gl::error(GL_OUT_OF_MEMORY);
8156 }
8157}
8158
8159void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
8160{
8161 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
8162
8163 try
8164 {
8165 gl::Context *context = gl::getNonLostContext();
8166
8167 if (context)
8168 {
8169 if (context->getClientVersion() < 3)
8170 {
8171 return gl::error(GL_INVALID_OPERATION);
8172 }
8173 }
8174
8175 UNIMPLEMENTED();
8176 }
8177 catch(std::bad_alloc&)
8178 {
8179 return gl::error(GL_OUT_OF_MEMORY);
8180 }
8181}
8182
8183GLboolean __stdcall glUnmapBuffer(GLenum target)
8184{
8185 EVENT("(GLenum target = 0x%X)", target);
8186
8187 try
8188 {
8189 gl::Context *context = gl::getNonLostContext();
8190
8191 if (context)
8192 {
8193 if (context->getClientVersion() < 3)
8194 {
8195 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8196 }
8197 }
8198
8199 UNIMPLEMENTED();
8200 }
8201 catch(std::bad_alloc&)
8202 {
8203 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8204 }
8205
8206 return GL_FALSE;
8207}
8208
8209void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8210{
8211 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8212
8213 try
8214 {
8215 gl::Context *context = gl::getNonLostContext();
8216
8217 if (context)
8218 {
8219 if (context->getClientVersion() < 3)
8220 {
8221 return gl::error(GL_INVALID_OPERATION);
8222 }
8223 }
8224
8225 UNIMPLEMENTED();
8226 }
8227 catch(std::bad_alloc&)
8228 {
8229 return gl::error(GL_OUT_OF_MEMORY);
8230 }
8231}
8232
8233void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8234{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008235 try
8236 {
8237 gl::Context *context = gl::getNonLostContext();
8238
8239 if (context)
8240 {
8241 if (context->getClientVersion() < 3)
8242 {
8243 return gl::error(GL_INVALID_OPERATION);
8244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008245
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008246 glDrawBuffersEXT(n, bufs);
8247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008248 }
8249 catch(std::bad_alloc&)
8250 {
8251 return gl::error(GL_OUT_OF_MEMORY);
8252 }
8253}
8254
8255void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8256{
8257 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8258 location, count, transpose, value);
8259
8260 try
8261 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008262 if (count < 0)
8263 {
8264 return gl::error(GL_INVALID_VALUE);
8265 }
8266
8267 if (location == -1)
8268 {
8269 return;
8270 }
8271
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008272 gl::Context *context = gl::getNonLostContext();
8273
8274 if (context)
8275 {
8276 if (context->getClientVersion() < 3)
8277 {
8278 return gl::error(GL_INVALID_OPERATION);
8279 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008280
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008281 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8282 if (!programBinary)
8283 {
8284 return gl::error(GL_INVALID_OPERATION);
8285 }
8286
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008287 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008288 {
8289 return gl::error(GL_INVALID_OPERATION);
8290 }
8291 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008292 }
8293 catch(std::bad_alloc&)
8294 {
8295 return gl::error(GL_OUT_OF_MEMORY);
8296 }
8297}
8298
8299void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8300{
8301 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8302 location, count, transpose, value);
8303
8304 try
8305 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008306 if (count < 0)
8307 {
8308 return gl::error(GL_INVALID_VALUE);
8309 }
8310
8311 if (location == -1)
8312 {
8313 return;
8314 }
8315
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008316 gl::Context *context = gl::getNonLostContext();
8317
8318 if (context)
8319 {
8320 if (context->getClientVersion() < 3)
8321 {
8322 return gl::error(GL_INVALID_OPERATION);
8323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008324
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008325 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8326 if (!programBinary)
8327 {
8328 return gl::error(GL_INVALID_OPERATION);
8329 }
8330
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008331 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008332 {
8333 return gl::error(GL_INVALID_OPERATION);
8334 }
8335 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008336 }
8337 catch(std::bad_alloc&)
8338 {
8339 return gl::error(GL_OUT_OF_MEMORY);
8340 }
8341}
8342
8343void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8344{
8345 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8346 location, count, transpose, value);
8347
8348 try
8349 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008350 if (count < 0)
8351 {
8352 return gl::error(GL_INVALID_VALUE);
8353 }
8354
8355 if (location == -1)
8356 {
8357 return;
8358 }
8359
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008360 gl::Context *context = gl::getNonLostContext();
8361
8362 if (context)
8363 {
8364 if (context->getClientVersion() < 3)
8365 {
8366 return gl::error(GL_INVALID_OPERATION);
8367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008368
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008369 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8370 if (!programBinary)
8371 {
8372 return gl::error(GL_INVALID_OPERATION);
8373 }
8374
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008375 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008376 {
8377 return gl::error(GL_INVALID_OPERATION);
8378 }
8379 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008380 }
8381 catch(std::bad_alloc&)
8382 {
8383 return gl::error(GL_OUT_OF_MEMORY);
8384 }
8385}
8386
8387void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8388{
8389 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8390 location, count, transpose, value);
8391
8392 try
8393 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008394 if (count < 0)
8395 {
8396 return gl::error(GL_INVALID_VALUE);
8397 }
8398
8399 if (location == -1)
8400 {
8401 return;
8402 }
8403
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008404 gl::Context *context = gl::getNonLostContext();
8405
8406 if (context)
8407 {
8408 if (context->getClientVersion() < 3)
8409 {
8410 return gl::error(GL_INVALID_OPERATION);
8411 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008412
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008413 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8414 if (!programBinary)
8415 {
8416 return gl::error(GL_INVALID_OPERATION);
8417 }
8418
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008419 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008420 {
8421 return gl::error(GL_INVALID_OPERATION);
8422 }
8423 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008424 }
8425 catch(std::bad_alloc&)
8426 {
8427 return gl::error(GL_OUT_OF_MEMORY);
8428 }
8429}
8430
8431void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8432{
8433 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8434 location, count, transpose, value);
8435
8436 try
8437 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008438 if (count < 0)
8439 {
8440 return gl::error(GL_INVALID_VALUE);
8441 }
8442
8443 if (location == -1)
8444 {
8445 return;
8446 }
8447
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008448 gl::Context *context = gl::getNonLostContext();
8449
8450 if (context)
8451 {
8452 if (context->getClientVersion() < 3)
8453 {
8454 return gl::error(GL_INVALID_OPERATION);
8455 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008456
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008457 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8458 if (!programBinary)
8459 {
8460 return gl::error(GL_INVALID_OPERATION);
8461 }
8462
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008463 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008464 {
8465 return gl::error(GL_INVALID_OPERATION);
8466 }
8467 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008468 }
8469 catch(std::bad_alloc&)
8470 {
8471 return gl::error(GL_OUT_OF_MEMORY);
8472 }
8473}
8474
8475void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8476{
8477 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8478 location, count, transpose, value);
8479
8480 try
8481 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008482 if (count < 0)
8483 {
8484 return gl::error(GL_INVALID_VALUE);
8485 }
8486
8487 if (location == -1)
8488 {
8489 return;
8490 }
8491
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008492 gl::Context *context = gl::getNonLostContext();
8493
8494 if (context)
8495 {
8496 if (context->getClientVersion() < 3)
8497 {
8498 return gl::error(GL_INVALID_OPERATION);
8499 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008500
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008501 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8502 if (!programBinary)
8503 {
8504 return gl::error(GL_INVALID_OPERATION);
8505 }
8506
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008507 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008508 {
8509 return gl::error(GL_INVALID_OPERATION);
8510 }
8511 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008512 }
8513 catch(std::bad_alloc&)
8514 {
8515 return gl::error(GL_OUT_OF_MEMORY);
8516 }
8517}
8518
8519void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8520{
8521 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8522 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8523 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8524
8525 try
8526 {
8527 gl::Context *context = gl::getNonLostContext();
8528
8529 if (context)
8530 {
8531 if (context->getClientVersion() < 3)
8532 {
8533 return gl::error(GL_INVALID_OPERATION);
8534 }
8535 }
8536
8537 UNIMPLEMENTED();
8538 }
8539 catch(std::bad_alloc&)
8540 {
8541 return gl::error(GL_OUT_OF_MEMORY);
8542 }
8543}
8544
8545void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8546{
8547 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8548 target, samples, internalformat, width, height);
8549
8550 try
8551 {
8552 gl::Context *context = gl::getNonLostContext();
8553
8554 if (context)
8555 {
8556 if (context->getClientVersion() < 3)
8557 {
8558 return gl::error(GL_INVALID_OPERATION);
8559 }
8560 }
8561
8562 UNIMPLEMENTED();
8563 }
8564 catch(std::bad_alloc&)
8565 {
8566 return gl::error(GL_OUT_OF_MEMORY);
8567 }
8568}
8569
8570void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8571{
8572 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8573 target, attachment, texture, level, layer);
8574
8575 try
8576 {
8577 gl::Context *context = gl::getNonLostContext();
8578
8579 if (context)
8580 {
8581 if (context->getClientVersion() < 3)
8582 {
8583 return gl::error(GL_INVALID_OPERATION);
8584 }
8585 }
8586
8587 UNIMPLEMENTED();
8588 }
8589 catch(std::bad_alloc&)
8590 {
8591 return gl::error(GL_OUT_OF_MEMORY);
8592 }
8593}
8594
8595GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8596{
8597 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8598 target, offset, length, access);
8599
8600 try
8601 {
8602 gl::Context *context = gl::getNonLostContext();
8603
8604 if (context)
8605 {
8606 if (context->getClientVersion() < 3)
8607 {
8608 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8609 }
8610 }
8611
8612 UNIMPLEMENTED();
8613 }
8614 catch(std::bad_alloc&)
8615 {
8616 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8617 }
8618
8619 return NULL;
8620}
8621
8622void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8623{
8624 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8625
8626 try
8627 {
8628 gl::Context *context = gl::getNonLostContext();
8629
8630 if (context)
8631 {
8632 if (context->getClientVersion() < 3)
8633 {
8634 return gl::error(GL_INVALID_OPERATION);
8635 }
8636 }
8637
8638 UNIMPLEMENTED();
8639 }
8640 catch(std::bad_alloc&)
8641 {
8642 return gl::error(GL_OUT_OF_MEMORY);
8643 }
8644}
8645
8646void __stdcall glBindVertexArray(GLuint array)
8647{
8648 EVENT("(GLuint array = %u)", array);
8649
8650 try
8651 {
8652 gl::Context *context = gl::getNonLostContext();
8653
8654 if (context)
8655 {
8656 if (context->getClientVersion() < 3)
8657 {
8658 return gl::error(GL_INVALID_OPERATION);
8659 }
8660 }
8661
8662 UNIMPLEMENTED();
8663 }
8664 catch(std::bad_alloc&)
8665 {
8666 return gl::error(GL_OUT_OF_MEMORY);
8667 }
8668}
8669
8670void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8671{
8672 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8673
8674 try
8675 {
8676 gl::Context *context = gl::getNonLostContext();
8677
8678 if (context)
8679 {
8680 if (context->getClientVersion() < 3)
8681 {
8682 return gl::error(GL_INVALID_OPERATION);
8683 }
8684 }
8685
8686 UNIMPLEMENTED();
8687 }
8688 catch(std::bad_alloc&)
8689 {
8690 return gl::error(GL_OUT_OF_MEMORY);
8691 }
8692}
8693
8694void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8695{
8696 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8697
8698 try
8699 {
8700 gl::Context *context = gl::getNonLostContext();
8701
8702 if (context)
8703 {
8704 if (context->getClientVersion() < 3)
8705 {
8706 return gl::error(GL_INVALID_OPERATION);
8707 }
8708 }
8709
8710 UNIMPLEMENTED();
8711 }
8712 catch(std::bad_alloc&)
8713 {
8714 return gl::error(GL_OUT_OF_MEMORY);
8715 }
8716}
8717
8718GLboolean __stdcall glIsVertexArray(GLuint array)
8719{
8720 EVENT("(GLuint array = %u)", array);
8721
8722 try
8723 {
8724 gl::Context *context = gl::getNonLostContext();
8725
8726 if (context)
8727 {
8728 if (context->getClientVersion() < 3)
8729 {
8730 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8731 }
8732 }
8733
8734 UNIMPLEMENTED();
8735 }
8736 catch(std::bad_alloc&)
8737 {
8738 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8739 }
8740
8741 return GL_FALSE;
8742}
8743
8744void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8745{
8746 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8747 target, index, data);
8748
8749 try
8750 {
8751 gl::Context *context = gl::getNonLostContext();
8752
8753 if (context)
8754 {
8755 if (context->getClientVersion() < 3)
8756 {
8757 return gl::error(GL_INVALID_OPERATION);
8758 }
8759 }
8760
8761 UNIMPLEMENTED();
8762 }
8763 catch(std::bad_alloc&)
8764 {
8765 return gl::error(GL_OUT_OF_MEMORY);
8766 }
8767}
8768
8769void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8770{
8771 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8772
8773 try
8774 {
8775 gl::Context *context = gl::getNonLostContext();
8776
8777 if (context)
8778 {
8779 if (context->getClientVersion() < 3)
8780 {
8781 return gl::error(GL_INVALID_OPERATION);
8782 }
8783 }
8784
8785 UNIMPLEMENTED();
8786 }
8787 catch(std::bad_alloc&)
8788 {
8789 return gl::error(GL_OUT_OF_MEMORY);
8790 }
8791}
8792
8793void __stdcall glEndTransformFeedback(void)
8794{
8795 EVENT("(void)");
8796
8797 try
8798 {
8799 gl::Context *context = gl::getNonLostContext();
8800
8801 if (context)
8802 {
8803 if (context->getClientVersion() < 3)
8804 {
8805 return gl::error(GL_INVALID_OPERATION);
8806 }
8807 }
8808
8809 UNIMPLEMENTED();
8810 }
8811 catch(std::bad_alloc&)
8812 {
8813 return gl::error(GL_OUT_OF_MEMORY);
8814 }
8815}
8816
8817void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8818{
8819 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8820 target, index, buffer, offset, size);
8821
8822 try
8823 {
8824 gl::Context *context = gl::getNonLostContext();
8825
8826 if (context)
8827 {
8828 if (context->getClientVersion() < 3)
8829 {
8830 return gl::error(GL_INVALID_OPERATION);
8831 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008832
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008833 switch (target)
8834 {
8835 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008836 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008837 {
8838 return gl::error(GL_INVALID_VALUE);
8839 }
8840 break;
8841
8842 case GL_UNIFORM_BUFFER:
8843 if (index >= context->getMaximumCombinedUniformBufferBindings())
8844 {
8845 return gl::error(GL_INVALID_VALUE);
8846 }
8847 break;
8848
8849 default:
8850 return gl::error(GL_INVALID_ENUM);
8851 }
8852
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008853 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008854 {
8855 return gl::error(GL_INVALID_VALUE);
8856 }
8857
8858 switch (target)
8859 {
8860 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008861
8862 // size and offset must be a multiple of 4
8863 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8864 {
8865 return gl::error(GL_INVALID_VALUE);
8866 }
8867
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008868 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8869 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008870 break;
8871
8872 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008873
8874 // it is an error to bind an offset not a multiple of the alignment
8875 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8876 {
8877 return gl::error(GL_INVALID_VALUE);
8878 }
8879
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008880 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8881 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008882 break;
8883
8884 default:
8885 UNREACHABLE();
8886 }
8887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008888 }
8889 catch(std::bad_alloc&)
8890 {
8891 return gl::error(GL_OUT_OF_MEMORY);
8892 }
8893}
8894
8895void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8896{
8897 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8898 target, index, buffer);
8899
8900 try
8901 {
8902 gl::Context *context = gl::getNonLostContext();
8903
8904 if (context)
8905 {
8906 if (context->getClientVersion() < 3)
8907 {
8908 return gl::error(GL_INVALID_OPERATION);
8909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008910
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008911 switch (target)
8912 {
8913 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008914 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008915 {
8916 return gl::error(GL_INVALID_VALUE);
8917 }
8918 break;
8919
8920 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008921 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008922 {
8923 return gl::error(GL_INVALID_VALUE);
8924 }
8925 break;
8926
8927 default:
8928 return gl::error(GL_INVALID_ENUM);
8929 }
8930
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008931 switch (target)
8932 {
8933 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008934 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008935 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008936 break;
8937
8938 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008939 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008940 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008941 break;
8942
8943 default:
8944 UNREACHABLE();
8945 }
8946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008947 }
8948 catch(std::bad_alloc&)
8949 {
8950 return gl::error(GL_OUT_OF_MEMORY);
8951 }
8952}
8953
8954void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8955{
8956 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8957 program, count, varyings, bufferMode);
8958
8959 try
8960 {
8961 gl::Context *context = gl::getNonLostContext();
8962
8963 if (context)
8964 {
8965 if (context->getClientVersion() < 3)
8966 {
8967 return gl::error(GL_INVALID_OPERATION);
8968 }
8969 }
8970
8971 UNIMPLEMENTED();
8972 }
8973 catch(std::bad_alloc&)
8974 {
8975 return gl::error(GL_OUT_OF_MEMORY);
8976 }
8977}
8978
8979void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8980{
8981 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8982 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8983 program, index, bufSize, length, size, type, name);
8984
8985 try
8986 {
8987 gl::Context *context = gl::getNonLostContext();
8988
8989 if (context)
8990 {
8991 if (context->getClientVersion() < 3)
8992 {
8993 return gl::error(GL_INVALID_OPERATION);
8994 }
8995 }
8996
8997 UNIMPLEMENTED();
8998 }
8999 catch(std::bad_alloc&)
9000 {
9001 return gl::error(GL_OUT_OF_MEMORY);
9002 }
9003}
9004
9005void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
9006{
9007 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
9008 index, size, type, stride, pointer);
9009
9010 try
9011 {
9012 gl::Context *context = gl::getNonLostContext();
9013
9014 if (context)
9015 {
9016 if (context->getClientVersion() < 3)
9017 {
9018 return gl::error(GL_INVALID_OPERATION);
9019 }
9020 }
9021
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009022 if (index >= gl::MAX_VERTEX_ATTRIBS)
9023 {
9024 return gl::error(GL_INVALID_VALUE);
9025 }
9026
9027 if (size < 1 || size > 4)
9028 {
9029 return gl::error(GL_INVALID_VALUE);
9030 }
9031
9032 switch (type)
9033 {
9034 case GL_BYTE:
9035 case GL_UNSIGNED_BYTE:
9036 case GL_SHORT:
9037 case GL_UNSIGNED_SHORT:
9038 case GL_INT:
9039 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00009040 case GL_INT_2_10_10_10_REV:
9041 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009042 break;
9043 default:
9044 return gl::error(GL_INVALID_ENUM);
9045 }
9046
9047 if (stride < 0)
9048 {
9049 return gl::error(GL_INVALID_VALUE);
9050 }
9051
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00009052 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
9053 {
9054 return gl::error(GL_INVALID_OPERATION);
9055 }
9056
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009057 if (context)
9058 {
9059 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
9060 stride, pointer);
9061 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009062 }
9063 catch(std::bad_alloc&)
9064 {
9065 return gl::error(GL_OUT_OF_MEMORY);
9066 }
9067}
9068
9069void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
9070{
9071 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9072 index, pname, params);
9073
9074 try
9075 {
9076 gl::Context *context = gl::getNonLostContext();
9077
9078 if (context)
9079 {
9080 if (context->getClientVersion() < 3)
9081 {
9082 return gl::error(GL_INVALID_OPERATION);
9083 }
9084 }
9085
9086 UNIMPLEMENTED();
9087 }
9088 catch(std::bad_alloc&)
9089 {
9090 return gl::error(GL_OUT_OF_MEMORY);
9091 }
9092}
9093
9094void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
9095{
9096 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
9097 index, pname, params);
9098
9099 try
9100 {
9101 gl::Context *context = gl::getNonLostContext();
9102
9103 if (context)
9104 {
9105 if (context->getClientVersion() < 3)
9106 {
9107 return gl::error(GL_INVALID_OPERATION);
9108 }
9109 }
9110
9111 UNIMPLEMENTED();
9112 }
9113 catch(std::bad_alloc&)
9114 {
9115 return gl::error(GL_OUT_OF_MEMORY);
9116 }
9117}
9118
9119void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
9120{
9121 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
9122 index, x, y, z, w);
9123
9124 try
9125 {
9126 gl::Context *context = gl::getNonLostContext();
9127
9128 if (context)
9129 {
9130 if (context->getClientVersion() < 3)
9131 {
9132 return gl::error(GL_INVALID_OPERATION);
9133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009134
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009135 if (index >= gl::MAX_VERTEX_ATTRIBS)
9136 {
9137 return gl::error(GL_INVALID_VALUE);
9138 }
9139
9140 GLint vals[4] = { x, y, z, w };
9141 context->setVertexAttribi(index, vals);
9142 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009143 }
9144 catch(std::bad_alloc&)
9145 {
9146 return gl::error(GL_OUT_OF_MEMORY);
9147 }
9148}
9149
9150void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
9151{
9152 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
9153 index, x, y, z, w);
9154
9155 try
9156 {
9157 gl::Context *context = gl::getNonLostContext();
9158
9159 if (context)
9160 {
9161 if (context->getClientVersion() < 3)
9162 {
9163 return gl::error(GL_INVALID_OPERATION);
9164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009165
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009166 if (index >= gl::MAX_VERTEX_ATTRIBS)
9167 {
9168 return gl::error(GL_INVALID_VALUE);
9169 }
9170
9171 GLuint vals[4] = { x, y, z, w };
9172 context->setVertexAttribu(index, vals);
9173 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009174 }
9175 catch(std::bad_alloc&)
9176 {
9177 return gl::error(GL_OUT_OF_MEMORY);
9178 }
9179}
9180
9181void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9182{
9183 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9184
9185 try
9186 {
9187 gl::Context *context = gl::getNonLostContext();
9188
9189 if (context)
9190 {
9191 if (context->getClientVersion() < 3)
9192 {
9193 return gl::error(GL_INVALID_OPERATION);
9194 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009195
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009196 if (index >= gl::MAX_VERTEX_ATTRIBS)
9197 {
9198 return gl::error(GL_INVALID_VALUE);
9199 }
9200
9201 context->setVertexAttribi(index, v);
9202 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009203 }
9204 catch(std::bad_alloc&)
9205 {
9206 return gl::error(GL_OUT_OF_MEMORY);
9207 }
9208}
9209
9210void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9211{
9212 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9213
9214 try
9215 {
9216 gl::Context *context = gl::getNonLostContext();
9217
9218 if (context)
9219 {
9220 if (context->getClientVersion() < 3)
9221 {
9222 return gl::error(GL_INVALID_OPERATION);
9223 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009224
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009225 if (index >= gl::MAX_VERTEX_ATTRIBS)
9226 {
9227 return gl::error(GL_INVALID_VALUE);
9228 }
9229
9230 context->setVertexAttribu(index, v);
9231 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009232 }
9233 catch(std::bad_alloc&)
9234 {
9235 return gl::error(GL_OUT_OF_MEMORY);
9236 }
9237}
9238
9239void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9240{
9241 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9242 program, location, params);
9243
9244 try
9245 {
9246 gl::Context *context = gl::getNonLostContext();
9247
9248 if (context)
9249 {
9250 if (context->getClientVersion() < 3)
9251 {
9252 return gl::error(GL_INVALID_OPERATION);
9253 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009254
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009255 if (program == 0)
9256 {
9257 return gl::error(GL_INVALID_VALUE);
9258 }
9259
9260 gl::Program *programObject = context->getProgram(program);
9261
9262 if (!programObject || !programObject->isLinked())
9263 {
9264 return gl::error(GL_INVALID_OPERATION);
9265 }
9266
9267 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9268 if (!programBinary)
9269 {
9270 return gl::error(GL_INVALID_OPERATION);
9271 }
9272
9273 if (!programBinary->getUniformuiv(location, NULL, params))
9274 {
9275 return gl::error(GL_INVALID_OPERATION);
9276 }
9277 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009278 }
9279 catch(std::bad_alloc&)
9280 {
9281 return gl::error(GL_OUT_OF_MEMORY);
9282 }
9283}
9284
9285GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9286{
9287 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9288 program, name);
9289
9290 try
9291 {
9292 gl::Context *context = gl::getNonLostContext();
9293
9294 if (context)
9295 {
9296 if (context->getClientVersion() < 3)
9297 {
9298 return gl::error(GL_INVALID_OPERATION, 0);
9299 }
9300 }
9301
9302 UNIMPLEMENTED();
9303 }
9304 catch(std::bad_alloc&)
9305 {
9306 return gl::error(GL_OUT_OF_MEMORY, 0);
9307 }
9308
9309 return 0;
9310}
9311
9312void __stdcall glUniform1ui(GLint location, GLuint v0)
9313{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009314 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009315}
9316
9317void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9318{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009319 const GLuint xy[] = { v0, v1 };
9320 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009321}
9322
9323void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9324{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009325 const GLuint xyz[] = { v0, v1, v2 };
9326 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009327}
9328
9329void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9330{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009331 const GLuint xyzw[] = { v0, v1, v2, v3 };
9332 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009333}
9334
9335void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9336{
9337 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9338 location, count, value);
9339
9340 try
9341 {
9342 gl::Context *context = gl::getNonLostContext();
9343
9344 if (context)
9345 {
9346 if (context->getClientVersion() < 3)
9347 {
9348 return gl::error(GL_INVALID_OPERATION);
9349 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009350
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009351 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9352 if (!programBinary)
9353 {
9354 return gl::error(GL_INVALID_OPERATION);
9355 }
9356
9357 if (!programBinary->setUniform1uiv(location, count, value))
9358 {
9359 return gl::error(GL_INVALID_OPERATION);
9360 }
9361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009362 }
9363 catch(std::bad_alloc&)
9364 {
9365 return gl::error(GL_OUT_OF_MEMORY);
9366 }
9367}
9368
9369void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9370{
9371 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9372 location, count, value);
9373
9374 try
9375 {
9376 gl::Context *context = gl::getNonLostContext();
9377
9378 if (context)
9379 {
9380 if (context->getClientVersion() < 3)
9381 {
9382 return gl::error(GL_INVALID_OPERATION);
9383 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009384
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009385 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9386 if (!programBinary)
9387 {
9388 return gl::error(GL_INVALID_OPERATION);
9389 }
9390
9391 if (!programBinary->setUniform2uiv(location, count, value))
9392 {
9393 return gl::error(GL_INVALID_OPERATION);
9394 }
9395 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009396 }
9397 catch(std::bad_alloc&)
9398 {
9399 return gl::error(GL_OUT_OF_MEMORY);
9400 }
9401}
9402
9403void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9404{
9405 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9406 location, count, value);
9407
9408 try
9409 {
9410 gl::Context *context = gl::getNonLostContext();
9411
9412 if (context)
9413 {
9414 if (context->getClientVersion() < 3)
9415 {
9416 return gl::error(GL_INVALID_OPERATION);
9417 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009418
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009419 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9420 if (!programBinary)
9421 {
9422 return gl::error(GL_INVALID_OPERATION);
9423 }
9424
9425 if (!programBinary->setUniform3uiv(location, count, value))
9426 {
9427 return gl::error(GL_INVALID_OPERATION);
9428 }
9429 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009430 }
9431 catch(std::bad_alloc&)
9432 {
9433 return gl::error(GL_OUT_OF_MEMORY);
9434 }
9435}
9436
9437void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9438{
9439 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9440 location, count, value);
9441
9442 try
9443 {
9444 gl::Context *context = gl::getNonLostContext();
9445
9446 if (context)
9447 {
9448 if (context->getClientVersion() < 3)
9449 {
9450 return gl::error(GL_INVALID_OPERATION);
9451 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009452
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009453 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9454 if (!programBinary)
9455 {
9456 return gl::error(GL_INVALID_OPERATION);
9457 }
9458
9459 if (!programBinary->setUniform4uiv(location, count, value))
9460 {
9461 return gl::error(GL_INVALID_OPERATION);
9462 }
9463 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009464 }
9465 catch(std::bad_alloc&)
9466 {
9467 return gl::error(GL_OUT_OF_MEMORY);
9468 }
9469}
9470
9471void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9472{
9473 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9474 buffer, drawbuffer, value);
9475
9476 try
9477 {
9478 gl::Context *context = gl::getNonLostContext();
9479
9480 if (context)
9481 {
9482 if (context->getClientVersion() < 3)
9483 {
9484 return gl::error(GL_INVALID_OPERATION);
9485 }
9486 }
9487
9488 UNIMPLEMENTED();
9489 }
9490 catch(std::bad_alloc&)
9491 {
9492 return gl::error(GL_OUT_OF_MEMORY);
9493 }
9494}
9495
9496void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9497{
9498 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9499 buffer, drawbuffer, value);
9500
9501 try
9502 {
9503 gl::Context *context = gl::getNonLostContext();
9504
9505 if (context)
9506 {
9507 if (context->getClientVersion() < 3)
9508 {
9509 return gl::error(GL_INVALID_OPERATION);
9510 }
9511 }
9512
9513 UNIMPLEMENTED();
9514 }
9515 catch(std::bad_alloc&)
9516 {
9517 return gl::error(GL_OUT_OF_MEMORY);
9518 }
9519}
9520
9521void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9522{
9523 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9524 buffer, drawbuffer, value);
9525
9526 try
9527 {
9528 gl::Context *context = gl::getNonLostContext();
9529
9530 if (context)
9531 {
9532 if (context->getClientVersion() < 3)
9533 {
9534 return gl::error(GL_INVALID_OPERATION);
9535 }
9536 }
9537
9538 UNIMPLEMENTED();
9539 }
9540 catch(std::bad_alloc&)
9541 {
9542 return gl::error(GL_OUT_OF_MEMORY);
9543 }
9544}
9545
9546void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9547{
9548 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9549 buffer, drawbuffer, depth, stencil);
9550
9551 try
9552 {
9553 gl::Context *context = gl::getNonLostContext();
9554
9555 if (context)
9556 {
9557 if (context->getClientVersion() < 3)
9558 {
9559 return gl::error(GL_INVALID_OPERATION);
9560 }
9561 }
9562
9563 UNIMPLEMENTED();
9564 }
9565 catch(std::bad_alloc&)
9566 {
9567 return gl::error(GL_OUT_OF_MEMORY);
9568 }
9569}
9570
9571const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9572{
9573 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9574
9575 try
9576 {
9577 gl::Context *context = gl::getNonLostContext();
9578
9579 if (context)
9580 {
9581 if (context->getClientVersion() < 3)
9582 {
9583 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9584 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009585
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009586 if (name != GL_EXTENSIONS)
9587 {
9588 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9589 }
9590
9591 if (index >= context->getNumExtensions())
9592 {
9593 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9594 }
9595
9596 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9597 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009598 }
9599 catch(std::bad_alloc&)
9600 {
9601 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9602 }
9603
9604 return NULL;
9605}
9606
9607void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9608{
9609 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9610 readTarget, writeTarget, readOffset, writeOffset, size);
9611
9612 try
9613 {
9614 gl::Context *context = gl::getNonLostContext();
9615
9616 if (context)
9617 {
9618 if (context->getClientVersion() < 3)
9619 {
9620 return gl::error(GL_INVALID_OPERATION);
9621 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009622
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009623 gl::Buffer *readBuffer = NULL;
9624 switch (readTarget)
9625 {
9626 case GL_ARRAY_BUFFER:
9627 readBuffer = context->getArrayBuffer();
9628 break;
9629 case GL_COPY_READ_BUFFER:
9630 readBuffer = context->getCopyReadBuffer();
9631 break;
9632 case GL_COPY_WRITE_BUFFER:
9633 readBuffer = context->getCopyWriteBuffer();
9634 break;
9635 case GL_ELEMENT_ARRAY_BUFFER:
9636 readBuffer = context->getElementArrayBuffer();
9637 break;
9638 case GL_PIXEL_PACK_BUFFER:
9639 readBuffer = context->getPixelPackBuffer();
9640 break;
9641 case GL_PIXEL_UNPACK_BUFFER:
9642 readBuffer = context->getPixelUnpackBuffer();
9643 break;
9644 case GL_TRANSFORM_FEEDBACK_BUFFER:
9645 readBuffer = context->getGenericTransformFeedbackBuffer();
9646 break;
9647 case GL_UNIFORM_BUFFER:
9648 readBuffer = context->getGenericUniformBuffer();
9649 break;
9650 default:
9651 return gl::error(GL_INVALID_ENUM);
9652 }
9653
9654 gl::Buffer *writeBuffer = NULL;
9655 switch (writeTarget)
9656 {
9657 case GL_ARRAY_BUFFER:
9658 writeBuffer = context->getArrayBuffer();
9659 break;
9660 case GL_COPY_READ_BUFFER:
9661 writeBuffer = context->getCopyReadBuffer();
9662 break;
9663 case GL_COPY_WRITE_BUFFER:
9664 writeBuffer = context->getCopyWriteBuffer();
9665 break;
9666 case GL_ELEMENT_ARRAY_BUFFER:
9667 writeBuffer = context->getElementArrayBuffer();
9668 break;
9669 case GL_PIXEL_PACK_BUFFER:
9670 writeBuffer = context->getPixelPackBuffer();
9671 break;
9672 case GL_PIXEL_UNPACK_BUFFER:
9673 writeBuffer = context->getPixelUnpackBuffer();
9674 break;
9675 case GL_TRANSFORM_FEEDBACK_BUFFER:
9676 writeBuffer = context->getGenericTransformFeedbackBuffer();
9677 break;
9678 case GL_UNIFORM_BUFFER:
9679 writeBuffer = context->getGenericUniformBuffer();
9680 break;
9681 default:
9682 return gl::error(GL_INVALID_ENUM);
9683 }
9684
9685 if (!readBuffer || !writeBuffer)
9686 {
9687 return gl::error(GL_INVALID_OPERATION);
9688 }
9689
9690 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9691 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9692 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9693 {
9694 return gl::error(GL_INVALID_VALUE);
9695 }
9696
9697 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9698 {
9699 return gl::error(GL_INVALID_VALUE);
9700 }
9701
9702 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9703
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009704 // if size is zero, the copy is a successful no-op
9705 if (size > 0)
9706 {
9707 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9708 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009709 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009710 }
9711 catch(std::bad_alloc&)
9712 {
9713 return gl::error(GL_OUT_OF_MEMORY);
9714 }
9715}
9716
9717void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9718{
9719 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9720 program, uniformCount, uniformNames, uniformIndices);
9721
9722 try
9723 {
9724 gl::Context *context = gl::getNonLostContext();
9725
9726 if (context)
9727 {
9728 if (context->getClientVersion() < 3)
9729 {
9730 return gl::error(GL_INVALID_OPERATION);
9731 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009732
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009733 if (uniformCount < 0)
9734 {
9735 return gl::error(GL_INVALID_VALUE);
9736 }
9737
9738 gl::Program *programObject = context->getProgram(program);
9739
9740 if (!programObject)
9741 {
9742 if (context->getShader(program))
9743 {
9744 return gl::error(GL_INVALID_OPERATION);
9745 }
9746 else
9747 {
9748 return gl::error(GL_INVALID_VALUE);
9749 }
9750 }
9751
9752 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9753 if (!programObject->isLinked() || !programBinary)
9754 {
9755 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9756 {
9757 uniformIndices[uniformId] = GL_INVALID_INDEX;
9758 }
9759 }
9760 else
9761 {
9762 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9763 {
9764 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9765 }
9766 }
9767 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009768 }
9769 catch(std::bad_alloc&)
9770 {
9771 return gl::error(GL_OUT_OF_MEMORY);
9772 }
9773}
9774
9775void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9776{
9777 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9778 program, uniformCount, uniformIndices, pname, params);
9779
9780 try
9781 {
9782 gl::Context *context = gl::getNonLostContext();
9783
9784 if (context)
9785 {
9786 if (context->getClientVersion() < 3)
9787 {
9788 return gl::error(GL_INVALID_OPERATION);
9789 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009790
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009791 if (uniformCount < 0)
9792 {
9793 return gl::error(GL_INVALID_VALUE);
9794 }
9795
9796 gl::Program *programObject = context->getProgram(program);
9797
9798 if (!programObject)
9799 {
9800 if (context->getShader(program))
9801 {
9802 return gl::error(GL_INVALID_OPERATION);
9803 }
9804 else
9805 {
9806 return gl::error(GL_INVALID_VALUE);
9807 }
9808 }
9809
9810 switch (pname)
9811 {
9812 case GL_UNIFORM_TYPE:
9813 case GL_UNIFORM_SIZE:
9814 case GL_UNIFORM_NAME_LENGTH:
9815 case GL_UNIFORM_BLOCK_INDEX:
9816 case GL_UNIFORM_OFFSET:
9817 case GL_UNIFORM_ARRAY_STRIDE:
9818 case GL_UNIFORM_MATRIX_STRIDE:
9819 case GL_UNIFORM_IS_ROW_MAJOR:
9820 break;
9821 default:
9822 return gl::error(GL_INVALID_ENUM);
9823 }
9824
9825 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9826
9827 if (!programBinary && uniformCount > 0)
9828 {
9829 return gl::error(GL_INVALID_VALUE);
9830 }
9831
9832 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9833 {
9834 const GLuint index = uniformIndices[uniformId];
9835
9836 if (index >= (GLuint)programBinary->getActiveUniformCount())
9837 {
9838 return gl::error(GL_INVALID_VALUE);
9839 }
9840 }
9841
9842 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9843 {
9844 const GLuint index = uniformIndices[uniformId];
9845 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9846 }
9847 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009848 }
9849 catch(std::bad_alloc&)
9850 {
9851 return gl::error(GL_OUT_OF_MEMORY);
9852 }
9853}
9854
9855GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9856{
9857 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9858
9859 try
9860 {
9861 gl::Context *context = gl::getNonLostContext();
9862
9863 if (context)
9864 {
9865 if (context->getClientVersion() < 3)
9866 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009867 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009869
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009870 gl::Program *programObject = context->getProgram(program);
9871
9872 if (!programObject)
9873 {
9874 if (context->getShader(program))
9875 {
9876 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9877 }
9878 else
9879 {
9880 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9881 }
9882 }
9883
9884 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9885 if (!programBinary)
9886 {
9887 return GL_INVALID_INDEX;
9888 }
9889
9890 return programBinary->getUniformBlockIndex(uniformBlockName);
9891 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009892 }
9893 catch(std::bad_alloc&)
9894 {
9895 return gl::error(GL_OUT_OF_MEMORY, 0);
9896 }
9897
9898 return 0;
9899}
9900
9901void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9902{
9903 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9904 program, uniformBlockIndex, pname, params);
9905
9906 try
9907 {
9908 gl::Context *context = gl::getNonLostContext();
9909
9910 if (context)
9911 {
9912 if (context->getClientVersion() < 3)
9913 {
9914 return gl::error(GL_INVALID_OPERATION);
9915 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009916 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009917
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009918 if (!programObject)
9919 {
9920 if (context->getShader(program))
9921 {
9922 return gl::error(GL_INVALID_OPERATION);
9923 }
9924 else
9925 {
9926 return gl::error(GL_INVALID_VALUE);
9927 }
9928 }
9929
9930 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9931
9932 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9933 {
9934 return gl::error(GL_INVALID_VALUE);
9935 }
9936
9937 switch (pname)
9938 {
9939 case GL_UNIFORM_BLOCK_BINDING:
9940 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9941 break;
9942
9943 case GL_UNIFORM_BLOCK_DATA_SIZE:
9944 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9945 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9946 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9947 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9948 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9949 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9950 break;
9951
9952 default:
9953 return gl::error(GL_INVALID_ENUM);
9954 }
9955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009956 }
9957 catch(std::bad_alloc&)
9958 {
9959 return gl::error(GL_OUT_OF_MEMORY);
9960 }
9961}
9962
9963void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9964{
9965 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9966 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9967
9968 try
9969 {
9970 gl::Context *context = gl::getNonLostContext();
9971
9972 if (context)
9973 {
9974 if (context->getClientVersion() < 3)
9975 {
9976 return gl::error(GL_INVALID_OPERATION);
9977 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009978
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009979 gl::Program *programObject = context->getProgram(program);
9980
9981 if (!programObject)
9982 {
9983 if (context->getShader(program))
9984 {
9985 return gl::error(GL_INVALID_OPERATION);
9986 }
9987 else
9988 {
9989 return gl::error(GL_INVALID_VALUE);
9990 }
9991 }
9992
9993 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9994
9995 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9996 {
9997 return gl::error(GL_INVALID_VALUE);
9998 }
9999
10000 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
10001 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010002 }
10003 catch(std::bad_alloc&)
10004 {
10005 return gl::error(GL_OUT_OF_MEMORY);
10006 }
10007}
10008
10009void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
10010{
10011 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
10012 program, uniformBlockIndex, uniformBlockBinding);
10013
10014 try
10015 {
10016 gl::Context *context = gl::getNonLostContext();
10017
10018 if (context)
10019 {
10020 if (context->getClientVersion() < 3)
10021 {
10022 return gl::error(GL_INVALID_OPERATION);
10023 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010024
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +000010025 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
10026 {
10027 return gl::error(GL_INVALID_VALUE);
10028 }
10029
10030 gl::Program *programObject = context->getProgram(program);
10031
10032 if (!programObject)
10033 {
10034 if (context->getShader(program))
10035 {
10036 return gl::error(GL_INVALID_OPERATION);
10037 }
10038 else
10039 {
10040 return gl::error(GL_INVALID_VALUE);
10041 }
10042 }
10043
10044 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10045
10046 // if never linked, there won't be any uniform blocks
10047 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
10048 {
10049 return gl::error(GL_INVALID_VALUE);
10050 }
10051
10052 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
10053 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010054 }
10055 catch(std::bad_alloc&)
10056 {
10057 return gl::error(GL_OUT_OF_MEMORY);
10058 }
10059}
10060
10061void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
10062{
10063 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
10064 mode, first, count, instanceCount);
10065
10066 try
10067 {
10068 gl::Context *context = gl::getNonLostContext();
10069
10070 if (context)
10071 {
10072 if (context->getClientVersion() < 3)
10073 {
10074 return gl::error(GL_INVALID_OPERATION);
10075 }
10076 }
10077
10078 UNIMPLEMENTED();
10079 }
10080 catch(std::bad_alloc&)
10081 {
10082 return gl::error(GL_OUT_OF_MEMORY);
10083 }
10084}
10085
10086void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
10087{
10088 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
10089 mode, count, type, indices, instanceCount);
10090
10091 try
10092 {
10093 gl::Context *context = gl::getNonLostContext();
10094
10095 if (context)
10096 {
10097 if (context->getClientVersion() < 3)
10098 {
10099 return gl::error(GL_INVALID_OPERATION);
10100 }
10101 }
10102
10103 UNIMPLEMENTED();
10104 }
10105 catch(std::bad_alloc&)
10106 {
10107 return gl::error(GL_OUT_OF_MEMORY);
10108 }
10109}
10110
10111GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
10112{
10113 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
10114
10115 try
10116 {
10117 gl::Context *context = gl::getNonLostContext();
10118
10119 if (context)
10120 {
10121 if (context->getClientVersion() < 3)
10122 {
10123 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
10124 }
10125 }
10126
10127 UNIMPLEMENTED();
10128 }
10129 catch(std::bad_alloc&)
10130 {
10131 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
10132 }
10133
10134 return NULL;
10135}
10136
10137GLboolean __stdcall glIsSync(GLsync sync)
10138{
10139 EVENT("(GLsync sync = 0x%0.8p)", sync);
10140
10141 try
10142 {
10143 gl::Context *context = gl::getNonLostContext();
10144
10145 if (context)
10146 {
10147 if (context->getClientVersion() < 3)
10148 {
10149 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10150 }
10151 }
10152
10153 UNIMPLEMENTED();
10154 }
10155 catch(std::bad_alloc&)
10156 {
10157 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10158 }
10159
10160 return GL_FALSE;
10161}
10162
10163void __stdcall glDeleteSync(GLsync sync)
10164{
10165 EVENT("(GLsync sync = 0x%0.8p)", sync);
10166
10167 try
10168 {
10169 gl::Context *context = gl::getNonLostContext();
10170
10171 if (context)
10172 {
10173 if (context->getClientVersion() < 3)
10174 {
10175 return gl::error(GL_INVALID_OPERATION);
10176 }
10177 }
10178
10179 UNIMPLEMENTED();
10180 }
10181 catch(std::bad_alloc&)
10182 {
10183 return gl::error(GL_OUT_OF_MEMORY);
10184 }
10185}
10186
10187GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10188{
10189 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10190 sync, flags, timeout);
10191
10192 try
10193 {
10194 gl::Context *context = gl::getNonLostContext();
10195
10196 if (context)
10197 {
10198 if (context->getClientVersion() < 3)
10199 {
10200 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10201 }
10202 }
10203
10204 UNIMPLEMENTED();
10205 }
10206 catch(std::bad_alloc&)
10207 {
10208 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10209 }
10210
10211 return GL_FALSE;
10212}
10213
10214void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10215{
10216 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10217 sync, flags, timeout);
10218
10219 try
10220 {
10221 gl::Context *context = gl::getNonLostContext();
10222
10223 if (context)
10224 {
10225 if (context->getClientVersion() < 3)
10226 {
10227 return gl::error(GL_INVALID_OPERATION);
10228 }
10229 }
10230
10231 UNIMPLEMENTED();
10232 }
10233 catch(std::bad_alloc&)
10234 {
10235 return gl::error(GL_OUT_OF_MEMORY);
10236 }
10237}
10238
10239void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10240{
10241 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10242 pname, params);
10243
10244 try
10245 {
10246 gl::Context *context = gl::getNonLostContext();
10247
10248 if (context)
10249 {
10250 if (context->getClientVersion() < 3)
10251 {
10252 return gl::error(GL_INVALID_OPERATION);
10253 }
10254 }
10255
10256 UNIMPLEMENTED();
10257 }
10258 catch(std::bad_alloc&)
10259 {
10260 return gl::error(GL_OUT_OF_MEMORY);
10261 }
10262}
10263
10264void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10265{
10266 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10267 sync, pname, bufSize, length, values);
10268
10269 try
10270 {
10271 gl::Context *context = gl::getNonLostContext();
10272
10273 if (context)
10274 {
10275 if (context->getClientVersion() < 3)
10276 {
10277 return gl::error(GL_INVALID_OPERATION);
10278 }
10279 }
10280
10281 UNIMPLEMENTED();
10282 }
10283 catch(std::bad_alloc&)
10284 {
10285 return gl::error(GL_OUT_OF_MEMORY);
10286 }
10287}
10288
10289void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10290{
10291 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10292 target, index, data);
10293
10294 try
10295 {
10296 gl::Context *context = gl::getNonLostContext();
10297
10298 if (context)
10299 {
10300 if (context->getClientVersion() < 3)
10301 {
10302 return gl::error(GL_INVALID_OPERATION);
10303 }
10304 }
10305
10306 UNIMPLEMENTED();
10307 }
10308 catch(std::bad_alloc&)
10309 {
10310 return gl::error(GL_OUT_OF_MEMORY);
10311 }
10312}
10313
10314void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10315{
10316 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10317 target, pname, params);
10318
10319 try
10320 {
10321 gl::Context *context = gl::getNonLostContext();
10322
10323 if (context)
10324 {
10325 if (context->getClientVersion() < 3)
10326 {
10327 return gl::error(GL_INVALID_OPERATION);
10328 }
10329 }
10330
10331 UNIMPLEMENTED();
10332 }
10333 catch(std::bad_alloc&)
10334 {
10335 return gl::error(GL_OUT_OF_MEMORY);
10336 }
10337}
10338
10339void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10340{
10341 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10342
10343 try
10344 {
10345 gl::Context *context = gl::getNonLostContext();
10346
10347 if (context)
10348 {
10349 if (context->getClientVersion() < 3)
10350 {
10351 return gl::error(GL_INVALID_OPERATION);
10352 }
10353 }
10354
10355 UNIMPLEMENTED();
10356 }
10357 catch(std::bad_alloc&)
10358 {
10359 return gl::error(GL_OUT_OF_MEMORY);
10360 }
10361}
10362
10363void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10364{
10365 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10366
10367 try
10368 {
10369 gl::Context *context = gl::getNonLostContext();
10370
10371 if (context)
10372 {
10373 if (context->getClientVersion() < 3)
10374 {
10375 return gl::error(GL_INVALID_OPERATION);
10376 }
10377 }
10378
10379 UNIMPLEMENTED();
10380 }
10381 catch(std::bad_alloc&)
10382 {
10383 return gl::error(GL_OUT_OF_MEMORY);
10384 }
10385}
10386
10387GLboolean __stdcall glIsSampler(GLuint sampler)
10388{
10389 EVENT("(GLuint sampler = %u)", sampler);
10390
10391 try
10392 {
10393 gl::Context *context = gl::getNonLostContext();
10394
10395 if (context)
10396 {
10397 if (context->getClientVersion() < 3)
10398 {
10399 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10400 }
10401 }
10402
10403 UNIMPLEMENTED();
10404 }
10405 catch(std::bad_alloc&)
10406 {
10407 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10408 }
10409
10410 return GL_FALSE;
10411}
10412
10413void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10414{
10415 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10416
10417 try
10418 {
10419 gl::Context *context = gl::getNonLostContext();
10420
10421 if (context)
10422 {
10423 if (context->getClientVersion() < 3)
10424 {
10425 return gl::error(GL_INVALID_OPERATION);
10426 }
10427 }
10428
10429 UNIMPLEMENTED();
10430 }
10431 catch(std::bad_alloc&)
10432 {
10433 return gl::error(GL_OUT_OF_MEMORY);
10434 }
10435}
10436
10437void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10438{
10439 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10440
10441 try
10442 {
10443 gl::Context *context = gl::getNonLostContext();
10444
10445 if (context)
10446 {
10447 if (context->getClientVersion() < 3)
10448 {
10449 return gl::error(GL_INVALID_OPERATION);
10450 }
10451 }
10452
10453 UNIMPLEMENTED();
10454 }
10455 catch(std::bad_alloc&)
10456 {
10457 return gl::error(GL_OUT_OF_MEMORY);
10458 }
10459}
10460
10461void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10462{
10463 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10464 sampler, pname, param);
10465
10466 try
10467 {
10468 gl::Context *context = gl::getNonLostContext();
10469
10470 if (context)
10471 {
10472 if (context->getClientVersion() < 3)
10473 {
10474 return gl::error(GL_INVALID_OPERATION);
10475 }
10476 }
10477
10478 UNIMPLEMENTED();
10479 }
10480 catch(std::bad_alloc&)
10481 {
10482 return gl::error(GL_OUT_OF_MEMORY);
10483 }
10484}
10485
10486void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10487{
10488 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10489
10490 try
10491 {
10492 gl::Context *context = gl::getNonLostContext();
10493
10494 if (context)
10495 {
10496 if (context->getClientVersion() < 3)
10497 {
10498 return gl::error(GL_INVALID_OPERATION);
10499 }
10500 }
10501
10502 UNIMPLEMENTED();
10503 }
10504 catch(std::bad_alloc&)
10505 {
10506 return gl::error(GL_OUT_OF_MEMORY);
10507 }
10508}
10509
10510void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10511{
10512 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10513
10514 try
10515 {
10516 gl::Context *context = gl::getNonLostContext();
10517
10518 if (context)
10519 {
10520 if (context->getClientVersion() < 3)
10521 {
10522 return gl::error(GL_INVALID_OPERATION);
10523 }
10524 }
10525
10526 UNIMPLEMENTED();
10527 }
10528 catch(std::bad_alloc&)
10529 {
10530 return gl::error(GL_OUT_OF_MEMORY);
10531 }
10532}
10533
10534void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10535{
10536 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10537
10538 try
10539 {
10540 gl::Context *context = gl::getNonLostContext();
10541
10542 if (context)
10543 {
10544 if (context->getClientVersion() < 3)
10545 {
10546 return gl::error(GL_INVALID_OPERATION);
10547 }
10548 }
10549
10550 UNIMPLEMENTED();
10551 }
10552 catch(std::bad_alloc&)
10553 {
10554 return gl::error(GL_OUT_OF_MEMORY);
10555 }
10556}
10557
10558void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10559{
10560 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10561
10562 try
10563 {
10564 gl::Context *context = gl::getNonLostContext();
10565
10566 if (context)
10567 {
10568 if (context->getClientVersion() < 3)
10569 {
10570 return gl::error(GL_INVALID_OPERATION);
10571 }
10572 }
10573
10574 UNIMPLEMENTED();
10575 }
10576 catch(std::bad_alloc&)
10577 {
10578 return gl::error(GL_OUT_OF_MEMORY);
10579 }
10580}
10581
10582void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10583{
10584 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10585
10586 try
10587 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010588 if (index >= gl::MAX_VERTEX_ATTRIBS)
10589 {
10590 return gl::error(GL_INVALID_VALUE);
10591 }
10592
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010593 gl::Context *context = gl::getNonLostContext();
10594
10595 if (context)
10596 {
10597 if (context->getClientVersion() < 3)
10598 {
10599 return gl::error(GL_INVALID_OPERATION);
10600 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010601
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010602 context->setVertexAttribDivisor(index, divisor);
10603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010604 }
10605 catch(std::bad_alloc&)
10606 {
10607 return gl::error(GL_OUT_OF_MEMORY);
10608 }
10609}
10610
10611void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10612{
10613 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10614
10615 try
10616 {
10617 gl::Context *context = gl::getNonLostContext();
10618
10619 if (context)
10620 {
10621 if (context->getClientVersion() < 3)
10622 {
10623 return gl::error(GL_INVALID_OPERATION);
10624 }
10625 }
10626
10627 UNIMPLEMENTED();
10628 }
10629 catch(std::bad_alloc&)
10630 {
10631 return gl::error(GL_OUT_OF_MEMORY);
10632 }
10633}
10634
10635void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10636{
10637 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10638
10639 try
10640 {
10641 gl::Context *context = gl::getNonLostContext();
10642
10643 if (context)
10644 {
10645 if (context->getClientVersion() < 3)
10646 {
10647 return gl::error(GL_INVALID_OPERATION);
10648 }
10649 }
10650
10651 UNIMPLEMENTED();
10652 }
10653 catch(std::bad_alloc&)
10654 {
10655 return gl::error(GL_OUT_OF_MEMORY);
10656 }
10657}
10658
10659void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10660{
10661 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10662
10663 try
10664 {
10665 gl::Context *context = gl::getNonLostContext();
10666
10667 if (context)
10668 {
10669 if (context->getClientVersion() < 3)
10670 {
10671 return gl::error(GL_INVALID_OPERATION);
10672 }
10673 }
10674
10675 UNIMPLEMENTED();
10676 }
10677 catch(std::bad_alloc&)
10678 {
10679 return gl::error(GL_OUT_OF_MEMORY);
10680 }
10681}
10682
10683GLboolean __stdcall glIsTransformFeedback(GLuint id)
10684{
10685 EVENT("(GLuint id = %u)", id);
10686
10687 try
10688 {
10689 gl::Context *context = gl::getNonLostContext();
10690
10691 if (context)
10692 {
10693 if (context->getClientVersion() < 3)
10694 {
10695 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10696 }
10697 }
10698
10699 UNIMPLEMENTED();
10700 }
10701 catch(std::bad_alloc&)
10702 {
10703 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10704 }
10705
10706 return GL_FALSE;
10707}
10708
10709void __stdcall glPauseTransformFeedback(void)
10710{
10711 EVENT("(void)");
10712
10713 try
10714 {
10715 gl::Context *context = gl::getNonLostContext();
10716
10717 if (context)
10718 {
10719 if (context->getClientVersion() < 3)
10720 {
10721 return gl::error(GL_INVALID_OPERATION);
10722 }
10723 }
10724
10725 UNIMPLEMENTED();
10726 }
10727 catch(std::bad_alloc&)
10728 {
10729 return gl::error(GL_OUT_OF_MEMORY);
10730 }
10731}
10732
10733void __stdcall glResumeTransformFeedback(void)
10734{
10735 EVENT("(void)");
10736
10737 try
10738 {
10739 gl::Context *context = gl::getNonLostContext();
10740
10741 if (context)
10742 {
10743 if (context->getClientVersion() < 3)
10744 {
10745 return gl::error(GL_INVALID_OPERATION);
10746 }
10747 }
10748
10749 UNIMPLEMENTED();
10750 }
10751 catch(std::bad_alloc&)
10752 {
10753 return gl::error(GL_OUT_OF_MEMORY);
10754 }
10755}
10756
10757void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10758{
10759 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10760 program, bufSize, length, binaryFormat, binary);
10761
10762 try
10763 {
10764 gl::Context *context = gl::getNonLostContext();
10765
10766 if (context)
10767 {
10768 if (context->getClientVersion() < 3)
10769 {
10770 return gl::error(GL_INVALID_OPERATION);
10771 }
10772 }
10773
10774 UNIMPLEMENTED();
10775 }
10776 catch(std::bad_alloc&)
10777 {
10778 return gl::error(GL_OUT_OF_MEMORY);
10779 }
10780}
10781
10782void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10783{
10784 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10785 program, binaryFormat, binary, length);
10786
10787 try
10788 {
10789 gl::Context *context = gl::getNonLostContext();
10790
10791 if (context)
10792 {
10793 if (context->getClientVersion() < 3)
10794 {
10795 return gl::error(GL_INVALID_OPERATION);
10796 }
10797 }
10798
10799 UNIMPLEMENTED();
10800 }
10801 catch(std::bad_alloc&)
10802 {
10803 return gl::error(GL_OUT_OF_MEMORY);
10804 }
10805}
10806
10807void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10808{
10809 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10810 program, pname, value);
10811
10812 try
10813 {
10814 gl::Context *context = gl::getNonLostContext();
10815
10816 if (context)
10817 {
10818 if (context->getClientVersion() < 3)
10819 {
10820 return gl::error(GL_INVALID_OPERATION);
10821 }
10822 }
10823
10824 UNIMPLEMENTED();
10825 }
10826 catch(std::bad_alloc&)
10827 {
10828 return gl::error(GL_OUT_OF_MEMORY);
10829 }
10830}
10831
10832void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10833{
10834 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10835 target, numAttachments, attachments);
10836
10837 try
10838 {
10839 gl::Context *context = gl::getNonLostContext();
10840
10841 if (context)
10842 {
10843 if (context->getClientVersion() < 3)
10844 {
10845 return gl::error(GL_INVALID_OPERATION);
10846 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010847
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010848 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10849 {
10850 return;
10851 }
10852
10853 int maxDimension = context->getMaximumRenderbufferDimension();
10854 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010856 }
10857 catch(std::bad_alloc&)
10858 {
10859 return gl::error(GL_OUT_OF_MEMORY);
10860 }
10861}
10862
10863void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10864{
10865 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10866 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10867 target, numAttachments, attachments, x, y, width, height);
10868
10869 try
10870 {
10871 gl::Context *context = gl::getNonLostContext();
10872
10873 if (context)
10874 {
10875 if (context->getClientVersion() < 3)
10876 {
10877 return gl::error(GL_INVALID_OPERATION);
10878 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010879
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010880 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10881 {
10882 return;
10883 }
10884
10885 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10886 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010887 }
10888 catch(std::bad_alloc&)
10889 {
10890 return gl::error(GL_OUT_OF_MEMORY);
10891 }
10892}
10893
10894void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10895{
10896 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10897 target, levels, internalformat, width, height);
10898
10899 try
10900 {
10901 gl::Context *context = gl::getNonLostContext();
10902
10903 if (context)
10904 {
10905 if (context->getClientVersion() < 3)
10906 {
10907 return gl::error(GL_INVALID_OPERATION);
10908 }
10909 }
10910
10911 UNIMPLEMENTED();
10912 }
10913 catch(std::bad_alloc&)
10914 {
10915 return gl::error(GL_OUT_OF_MEMORY);
10916 }
10917}
10918
10919void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10920{
10921 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10922 "GLsizei height = %d, GLsizei depth = %d)",
10923 target, levels, internalformat, width, height, depth);
10924
10925 try
10926 {
10927 gl::Context *context = gl::getNonLostContext();
10928
10929 if (context)
10930 {
10931 if (context->getClientVersion() < 3)
10932 {
10933 return gl::error(GL_INVALID_OPERATION);
10934 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010936 }
10937 catch(std::bad_alloc&)
10938 {
10939 return gl::error(GL_OUT_OF_MEMORY);
10940 }
10941}
10942
10943void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10944{
10945 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10946 "GLint* params = 0x%0.8p)",
10947 target, internalformat, pname, bufSize, params);
10948
10949 try
10950 {
10951 gl::Context *context = gl::getNonLostContext();
10952
10953 if (context)
10954 {
10955 if (context->getClientVersion() < 3)
10956 {
10957 return gl::error(GL_INVALID_OPERATION);
10958 }
10959 }
10960
10961 UNIMPLEMENTED();
10962 }
10963 catch(std::bad_alloc&)
10964 {
10965 return gl::error(GL_OUT_OF_MEMORY);
10966 }
10967}
10968
10969// Extension functions
10970
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010971void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10972 GLbitfield mask, GLenum filter)
10973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010974 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010975 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10976 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10977 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10978
10979 try
10980 {
10981 switch (filter)
10982 {
10983 case GL_NEAREST:
10984 break;
10985 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010986 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010987 }
10988
10989 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010992 }
10993
10994 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10995 {
10996 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010997 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010998 }
10999
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011000 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000011001
11002 if (context)
11003 {
11004 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
11005 {
11006 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011007 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000011008 }
11009
11010 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
11011 }
11012 }
11013 catch(std::bad_alloc&)
11014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000011016 }
11017}
11018
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000011019void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
11020 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000011022 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000011023 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000011024 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011025 target, level, internalformat, width, height, depth, border, format, type, pixels);
11026
11027 try
11028 {
11029 UNIMPLEMENTED(); // FIXME
11030 }
11031 catch(std::bad_alloc&)
11032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011033 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011034 }
11035}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011036
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011037void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
11038 GLenum *binaryFormat, void *binary)
11039{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011040 EVENT("(GLenum program = 0x%X, bufSize = %d, length = 0x%0.8p, binaryFormat = 0x%0.8p, binary = 0x%0.8p)",
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011041 program, bufSize, length, binaryFormat, binary);
11042
11043 try
11044 {
11045 gl::Context *context = gl::getNonLostContext();
11046
11047 if (context)
11048 {
11049 gl::Program *programObject = context->getProgram(program);
11050
daniel@transgaming.com716056c2012-07-24 18:38:59 +000011051 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011053 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011054 }
11055
11056 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
11057
11058 if (!programBinary)
11059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011060 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011061 }
11062
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011063 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011065 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011066 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011067
11068 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011069 }
11070 }
11071 catch(std::bad_alloc&)
11072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011073 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011074 }
11075}
11076
11077void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
11078 const void *binary, GLint length)
11079{
11080 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
11081 program, binaryFormat, binary, length);
11082
11083 try
11084 {
11085 gl::Context *context = gl::getNonLostContext();
11086
11087 if (context)
11088 {
11089 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
11090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011091 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011092 }
11093
11094 gl::Program *programObject = context->getProgram(program);
11095
11096 if (!programObject)
11097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011098 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011099 }
11100
daniel@transgaming.com95d29422012-07-24 18:36:10 +000011101 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011102 }
11103 }
11104 catch(std::bad_alloc&)
11105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011106 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011107 }
11108}
11109
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011110void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
11111{
11112 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
11113
11114 try
11115 {
11116 gl::Context *context = gl::getNonLostContext();
11117
11118 if (context)
11119 {
11120 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
11121 {
11122 return gl::error(GL_INVALID_VALUE);
11123 }
11124
11125 if (context->getDrawFramebufferHandle() == 0)
11126 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011127 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011128 {
11129 return gl::error(GL_INVALID_OPERATION);
11130 }
11131
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011132 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011133 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011134 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011135 }
11136 }
11137 else
11138 {
11139 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11140 {
11141 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
11142 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
11143 {
11144 return gl::error(GL_INVALID_OPERATION);
11145 }
11146 }
11147 }
11148
11149 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
11150
11151 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11152 {
11153 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
11154 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011155
11156 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
11157 {
11158 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
11159 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011160 }
11161 }
11162 catch (std::bad_alloc&)
11163 {
11164 return gl::error(GL_OUT_OF_MEMORY);
11165 }
11166}
11167
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011168__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
11169{
11170 struct Extension
11171 {
11172 const char *name;
11173 __eglMustCastToProperFunctionPointerType address;
11174 };
11175
11176 static const Extension glExtensions[] =
11177 {
11178 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011179 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011180 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011181 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11182 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11183 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11184 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11185 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11186 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11187 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011188 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011189 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011190 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11191 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11192 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11193 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011194 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11195 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11196 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11197 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11198 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11199 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11200 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011201 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011202 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11203 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11204 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011205 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11206 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011207
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011208 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011209 {
11210 if (strcmp(procname, glExtensions[ext].name) == 0)
11211 {
11212 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11213 }
11214 }
11215
11216 return NULL;
11217}
11218
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011219// Non-public functions used by EGL
11220
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011221bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011222{
11223 EVENT("(egl::Surface* surface = 0x%0.8p)",
11224 surface);
11225
11226 try
11227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011228 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011229
11230 if (context)
11231 {
11232 gl::Texture2D *textureObject = context->getTexture2D();
11233
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011234 if (textureObject->isImmutable())
11235 {
11236 return false;
11237 }
11238
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011239 if (textureObject)
11240 {
11241 textureObject->bindTexImage(surface);
11242 }
11243 }
11244 }
11245 catch(std::bad_alloc&)
11246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011247 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011248 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011249
11250 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011251}
11252
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011253}