blob: a615c164f2dce58e23801a3e1eddb15062dc6382 [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
1208bool validReadFormatType(GLenum format, GLenum type)
1209{
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.orgd63ef892013-05-30 00:10:56 +00001238bool validateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
1239 const GLenum* attachments)
1240{
1241 bool defaultFramebuffer = false;
1242
1243 switch (target)
1244 {
1245 case GL_DRAW_FRAMEBUFFER:
1246 case GL_FRAMEBUFFER:
1247 defaultFramebuffer = context->getDrawFramebufferHandle() == 0;
1248 break;
1249 case GL_READ_FRAMEBUFFER:
1250 defaultFramebuffer = context->getReadFramebufferHandle() == 0;
1251 break;
1252 default:
1253 return gl::error(GL_INVALID_ENUM, false);
1254 }
1255
1256 for (int i = 0; i < numAttachments; ++i)
1257 {
1258 if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
1259 {
1260 if (defaultFramebuffer)
1261 {
1262 return gl::error(GL_INVALID_ENUM, false);
1263 }
1264
1265 if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getMaximumRenderTargets())
1266 {
1267 return gl::error(GL_INVALID_OPERATION, false);
1268 }
1269 }
1270 else
1271 {
1272 switch (attachments[i])
1273 {
1274 case GL_DEPTH_ATTACHMENT:
1275 case GL_STENCIL_ATTACHMENT:
1276 case GL_DEPTH_STENCIL_ATTACHMENT:
1277 if (defaultFramebuffer)
1278 {
1279 return gl::error(GL_INVALID_ENUM, false);
1280 }
1281 break;
1282 case GL_COLOR:
1283 case GL_DEPTH:
1284 case GL_STENCIL:
1285 if (!defaultFramebuffer)
1286 {
1287 return gl::error(GL_INVALID_ENUM, false);
1288 }
1289 break;
1290 default:
1291 return gl::error(GL_INVALID_ENUM, false);
1292 }
1293 }
1294 }
1295
1296 return true;
1297}
1298
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001299extern "C"
1300{
1301
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001302// OpenGL ES 2.0 functions
1303
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001304void __stdcall glActiveTexture(GLenum texture)
1305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001306 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307
1308 try
1309 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001311
1312 if (context)
1313 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +00001314 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
1315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +00001317 }
1318
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001319 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001320 }
1321 }
1322 catch(std::bad_alloc&)
1323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001324 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001325 }
1326}
1327
1328void __stdcall glAttachShader(GLuint program, GLuint shader)
1329{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001330 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001331
1332 try
1333 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001335
1336 if (context)
1337 {
1338 gl::Program *programObject = context->getProgram(program);
1339 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001340
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001341 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001343 if (context->getShader(program))
1344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001345 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001346 }
1347 else
1348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001350 }
1351 }
1352
1353 if (!shaderObject)
1354 {
1355 if (context->getProgram(shader))
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001358 }
1359 else
1360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001361 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +00001362 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001363 }
1364
1365 if (!programObject->attachShader(shaderObject))
1366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001368 }
1369 }
1370 }
1371 catch(std::bad_alloc&)
1372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001373 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001374 }
1375}
1376
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001377void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
1378{
1379 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
1380
1381 try
1382 {
1383 switch (target)
1384 {
1385 case GL_ANY_SAMPLES_PASSED_EXT:
1386 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1387 break;
1388 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001389 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001390 }
1391
1392 if (id == 0)
1393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001394 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001395 }
1396
1397 gl::Context *context = gl::getNonLostContext();
1398
1399 if (context)
1400 {
1401 context->beginQuery(target, id);
1402 }
1403 }
1404 catch(std::bad_alloc&)
1405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001407 }
1408}
1409
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001410void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001412 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001413
1414 try
1415 {
1416 if (index >= gl::MAX_VERTEX_ATTRIBS)
1417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001418 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419 }
1420
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001422
1423 if (context)
1424 {
1425 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001426
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427 if (!programObject)
1428 {
daniel@transgaming.com98079832010-04-13 03:26:29 +00001429 if (context->getShader(program))
1430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001431 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +00001432 }
1433 else
1434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +00001436 }
1437 }
1438
1439 if (strncmp(name, "gl_", 3) == 0)
1440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001441 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442 }
1443
1444 programObject->bindAttributeLocation(index, name);
1445 }
1446 }
1447 catch(std::bad_alloc&)
1448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001449 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450 }
1451}
1452
1453void __stdcall glBindBuffer(GLenum target, GLuint buffer)
1454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001455 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001463 // Check ES3 specific targets
1464 switch (target)
1465 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001466 case GL_COPY_READ_BUFFER:
1467 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001468 case GL_PIXEL_PACK_BUFFER:
1469 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001470 case GL_UNIFORM_BUFFER:
1471 case GL_TRANSFORM_FEEDBACK_BUFFER:
1472 if (context->getClientVersion() < 3)
1473 {
1474 return gl::error(GL_INVALID_ENUM);
1475 }
1476 }
1477
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478 switch (target)
1479 {
1480 case GL_ARRAY_BUFFER:
1481 context->bindArrayBuffer(buffer);
1482 return;
1483 case GL_ELEMENT_ARRAY_BUFFER:
1484 context->bindElementArrayBuffer(buffer);
1485 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001486 case GL_COPY_READ_BUFFER:
1487 context->bindCopyReadBuffer(buffer);
1488 return;
1489 case GL_COPY_WRITE_BUFFER:
1490 context->bindCopyWriteBuffer(buffer);
1491 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001492 case GL_PIXEL_PACK_BUFFER:
1493 context->bindPixelPackBuffer(buffer);
1494 return;
1495 case GL_PIXEL_UNPACK_BUFFER:
1496 context->bindPixelUnpackBuffer(buffer);
1497 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001498 case GL_UNIFORM_BUFFER:
1499 context->bindGenericUniformBuffer(buffer);
1500 return;
1501 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +00001502 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001503 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001504 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001506 }
1507 }
1508 }
1509 catch(std::bad_alloc&)
1510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001512 }
1513}
1514
1515void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
1516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001517 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001518
1519 try
1520 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001521 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001524 }
1525
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001526 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001527
1528 if (context)
1529 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001530 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
1531 {
1532 context->bindReadFramebuffer(framebuffer);
1533 }
1534
1535 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
1536 {
1537 context->bindDrawFramebuffer(framebuffer);
1538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539 }
1540 }
1541 catch(std::bad_alloc&)
1542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544 }
1545}
1546
1547void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
1548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001549 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001550
1551 try
1552 {
1553 if (target != GL_RENDERBUFFER)
1554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001556 }
1557
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559
1560 if (context)
1561 {
1562 context->bindRenderbuffer(renderbuffer);
1563 }
1564 }
1565 catch(std::bad_alloc&)
1566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001567 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 }
1569}
1570
1571void __stdcall glBindTexture(GLenum target, GLuint texture)
1572{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001573 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574
1575 try
1576 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001577 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001578
1579 if (context)
1580 {
1581 gl::Texture *textureObject = context->getTexture(texture);
1582
1583 if (textureObject && textureObject->getTarget() != target && texture != 0)
1584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001585 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586 }
1587
1588 switch (target)
1589 {
1590 case GL_TEXTURE_2D:
1591 context->bindTexture2D(texture);
1592 return;
1593 case GL_TEXTURE_CUBE_MAP:
1594 context->bindTextureCubeMap(texture);
1595 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00001596 case GL_TEXTURE_3D:
1597 if (context->getClientVersion() < 3)
1598 {
1599 return gl::error(GL_INVALID_ENUM);
1600 }
1601 context->bindTexture3D(texture);
1602 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001603 case GL_TEXTURE_2D_ARRAY:
1604 if (context->getClientVersion() < 3)
1605 {
1606 return gl::error(GL_INVALID_ENUM);
1607 }
1608 context->bindTexture2DArray(texture);
1609 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001610 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001611 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612 }
1613 }
1614 }
1615 catch(std::bad_alloc&)
1616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001617 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001618 }
1619}
1620
1621void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1622{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001623 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001624 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001625
1626 try
1627 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001628 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001629
1630 if (context)
1631 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001632 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001633 }
1634 }
1635 catch(std::bad_alloc&)
1636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001638 }
1639}
1640
1641void __stdcall glBlendEquation(GLenum mode)
1642{
1643 glBlendEquationSeparate(mode, mode);
1644}
1645
1646void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
1647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001648 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001649
1650 try
1651 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001652 gl::Context *context = gl::getNonLostContext();
1653
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001654 switch (modeRGB)
1655 {
1656 case GL_FUNC_ADD:
1657 case GL_FUNC_SUBTRACT:
1658 case GL_FUNC_REVERSE_SUBTRACT:
1659 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001660
1661 case GL_MIN:
1662 case GL_MAX:
1663 if (context && context->getClientVersion() < 3)
1664 {
1665 return gl::error(GL_INVALID_ENUM);
1666 }
1667 break;
1668
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001669 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001671 }
1672
1673 switch (modeAlpha)
1674 {
1675 case GL_FUNC_ADD:
1676 case GL_FUNC_SUBTRACT:
1677 case GL_FUNC_REVERSE_SUBTRACT:
1678 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001679
1680 case GL_MIN:
1681 case GL_MAX:
1682 if (context && context->getClientVersion() < 3)
1683 {
1684 return gl::error(GL_INVALID_ENUM);
1685 }
1686 break;
1687
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001688 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001689 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001690 }
1691
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001692 if (context)
1693 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001694 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001695 }
1696 }
1697 catch(std::bad_alloc&)
1698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001700 }
1701}
1702
1703void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1704{
1705 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1706}
1707
1708void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1709{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001710 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 +00001711 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001712
1713 try
1714 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001715 gl::Context *context = gl::getNonLostContext();
1716
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717 switch (srcRGB)
1718 {
1719 case GL_ZERO:
1720 case GL_ONE:
1721 case GL_SRC_COLOR:
1722 case GL_ONE_MINUS_SRC_COLOR:
1723 case GL_DST_COLOR:
1724 case GL_ONE_MINUS_DST_COLOR:
1725 case GL_SRC_ALPHA:
1726 case GL_ONE_MINUS_SRC_ALPHA:
1727 case GL_DST_ALPHA:
1728 case GL_ONE_MINUS_DST_ALPHA:
1729 case GL_CONSTANT_COLOR:
1730 case GL_ONE_MINUS_CONSTANT_COLOR:
1731 case GL_CONSTANT_ALPHA:
1732 case GL_ONE_MINUS_CONSTANT_ALPHA:
1733 case GL_SRC_ALPHA_SATURATE:
1734 break;
1735 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001737 }
1738
1739 switch (dstRGB)
1740 {
1741 case GL_ZERO:
1742 case GL_ONE:
1743 case GL_SRC_COLOR:
1744 case GL_ONE_MINUS_SRC_COLOR:
1745 case GL_DST_COLOR:
1746 case GL_ONE_MINUS_DST_COLOR:
1747 case GL_SRC_ALPHA:
1748 case GL_ONE_MINUS_SRC_ALPHA:
1749 case GL_DST_ALPHA:
1750 case GL_ONE_MINUS_DST_ALPHA:
1751 case GL_CONSTANT_COLOR:
1752 case GL_ONE_MINUS_CONSTANT_COLOR:
1753 case GL_CONSTANT_ALPHA:
1754 case GL_ONE_MINUS_CONSTANT_ALPHA:
1755 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001756
1757 case GL_SRC_ALPHA_SATURATE:
1758 if (!context || context->getClientVersion() < 3)
1759 {
1760 return gl::error(GL_INVALID_ENUM);
1761 }
1762 break;
1763
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001764 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001765 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001766 }
1767
1768 switch (srcAlpha)
1769 {
1770 case GL_ZERO:
1771 case GL_ONE:
1772 case GL_SRC_COLOR:
1773 case GL_ONE_MINUS_SRC_COLOR:
1774 case GL_DST_COLOR:
1775 case GL_ONE_MINUS_DST_COLOR:
1776 case GL_SRC_ALPHA:
1777 case GL_ONE_MINUS_SRC_ALPHA:
1778 case GL_DST_ALPHA:
1779 case GL_ONE_MINUS_DST_ALPHA:
1780 case GL_CONSTANT_COLOR:
1781 case GL_ONE_MINUS_CONSTANT_COLOR:
1782 case GL_CONSTANT_ALPHA:
1783 case GL_ONE_MINUS_CONSTANT_ALPHA:
1784 case GL_SRC_ALPHA_SATURATE:
1785 break;
1786 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001788 }
1789
1790 switch (dstAlpha)
1791 {
1792 case GL_ZERO:
1793 case GL_ONE:
1794 case GL_SRC_COLOR:
1795 case GL_ONE_MINUS_SRC_COLOR:
1796 case GL_DST_COLOR:
1797 case GL_ONE_MINUS_DST_COLOR:
1798 case GL_SRC_ALPHA:
1799 case GL_ONE_MINUS_SRC_ALPHA:
1800 case GL_DST_ALPHA:
1801 case GL_ONE_MINUS_DST_ALPHA:
1802 case GL_CONSTANT_COLOR:
1803 case GL_ONE_MINUS_CONSTANT_COLOR:
1804 case GL_CONSTANT_ALPHA:
1805 case GL_ONE_MINUS_CONSTANT_ALPHA:
1806 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001807
1808 case GL_SRC_ALPHA_SATURATE:
1809 if (!context || context->getClientVersion() < 3)
1810 {
1811 return gl::error(GL_INVALID_ENUM);
1812 }
1813 break;
1814
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001815 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001816 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001817 }
1818
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001819 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1820 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1821
1822 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1823 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1824
1825 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001826 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001827 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 +00001828 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001829 }
1830
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001831 if (context)
1832 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001833 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834 }
1835 }
1836 catch(std::bad_alloc&)
1837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839 }
1840}
1841
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001842void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001844 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 +00001845 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001846
1847 try
1848 {
1849 if (size < 0)
1850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852 }
1853
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001854 gl::Context *context = gl::getNonLostContext();
1855
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856 switch (usage)
1857 {
1858 case GL_STREAM_DRAW:
1859 case GL_STATIC_DRAW:
1860 case GL_DYNAMIC_DRAW:
1861 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001862
1863 case GL_STREAM_READ:
1864 case GL_STREAM_COPY:
1865 case GL_STATIC_READ:
1866 case GL_STATIC_COPY:
1867 case GL_DYNAMIC_READ:
1868 case GL_DYNAMIC_COPY:
1869 if (context && context->getClientVersion() < 3)
1870 {
1871 return gl::error(GL_INVALID_ENUM);
1872 }
1873 break;
1874
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001875 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001876 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001877 }
1878
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001879 if (context)
1880 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001881 // Check ES3 specific targets
1882 switch (target)
1883 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001884 case GL_COPY_READ_BUFFER:
1885 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001886 case GL_PIXEL_PACK_BUFFER:
1887 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001888 case GL_UNIFORM_BUFFER:
1889 case GL_TRANSFORM_FEEDBACK_BUFFER:
1890 if (context->getClientVersion() < 3)
1891 {
1892 return gl::error(GL_INVALID_ENUM);
1893 }
1894 }
1895
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001897
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001898 switch (target)
1899 {
1900 case GL_ARRAY_BUFFER:
1901 buffer = context->getArrayBuffer();
1902 break;
1903 case GL_ELEMENT_ARRAY_BUFFER:
1904 buffer = context->getElementArrayBuffer();
1905 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001906 case GL_COPY_READ_BUFFER:
1907 buffer = context->getCopyReadBuffer();
1908 break;
1909 case GL_COPY_WRITE_BUFFER:
1910 buffer = context->getCopyWriteBuffer();
1911 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001912 case GL_PIXEL_PACK_BUFFER:
1913 buffer = context->getPixelPackBuffer();
1914 break;
1915 case GL_PIXEL_UNPACK_BUFFER:
1916 buffer = context->getPixelUnpackBuffer();
1917 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001918 case GL_TRANSFORM_FEEDBACK_BUFFER:
1919 buffer = context->getGenericTransformFeedbackBuffer();
1920 break;
1921 case GL_UNIFORM_BUFFER:
1922 buffer = context->getGenericUniformBuffer();
1923 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001925 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001926 }
1927
1928 if (!buffer)
1929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931 }
1932
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001933 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934 }
1935 }
1936 catch(std::bad_alloc&)
1937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001939 }
1940}
1941
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001942void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001944 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 +00001945 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001946
1947 try
1948 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001949 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001951 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952 }
1953
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001954 if (data == NULL)
1955 {
1956 return;
1957 }
1958
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001960
1961 if (context)
1962 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001963 // Check ES3 specific targets
1964 switch (target)
1965 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001966 case GL_COPY_READ_BUFFER:
1967 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001968 case GL_PIXEL_PACK_BUFFER:
1969 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001970 case GL_UNIFORM_BUFFER:
1971 case GL_TRANSFORM_FEEDBACK_BUFFER:
1972 if (context->getClientVersion() < 3)
1973 {
1974 return gl::error(GL_INVALID_ENUM);
1975 }
1976 }
1977
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001978 gl::Buffer *buffer;
1979
1980 switch (target)
1981 {
1982 case GL_ARRAY_BUFFER:
1983 buffer = context->getArrayBuffer();
1984 break;
1985 case GL_ELEMENT_ARRAY_BUFFER:
1986 buffer = context->getElementArrayBuffer();
1987 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001988 case GL_COPY_READ_BUFFER:
1989 buffer = context->getCopyReadBuffer();
1990 break;
1991 case GL_COPY_WRITE_BUFFER:
1992 buffer = context->getCopyWriteBuffer();
1993 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001994 case GL_PIXEL_PACK_BUFFER:
1995 buffer = context->getPixelPackBuffer();
1996 break;
1997 case GL_PIXEL_UNPACK_BUFFER:
1998 buffer = context->getPixelUnpackBuffer();
1999 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00002000 case GL_TRANSFORM_FEEDBACK_BUFFER:
2001 buffer = context->getGenericTransformFeedbackBuffer();
2002 break;
2003 case GL_UNIFORM_BUFFER:
2004 buffer = context->getGenericUniformBuffer();
2005 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002006 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002007 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002008 }
2009
2010 if (!buffer)
2011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002012 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002013 }
2014
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00002015 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002018 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00002019
2020 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00002021 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002022 }
2023 catch(std::bad_alloc&)
2024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002025 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002026 }
2027}
2028
2029GLenum __stdcall glCheckFramebufferStatus(GLenum target)
2030{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002031 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032
2033 try
2034 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002035 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002037 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002038 }
2039
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002040 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041
2042 if (context)
2043 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002044 gl::Framebuffer *framebuffer = NULL;
2045 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2046 {
2047 framebuffer = context->getReadFramebuffer();
2048 }
2049 else
2050 {
2051 framebuffer = context->getDrawFramebuffer();
2052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053
2054 return framebuffer->completeness();
2055 }
2056 }
2057 catch(std::bad_alloc&)
2058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002059 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002060 }
2061
2062 return 0;
2063}
2064
2065void __stdcall glClear(GLbitfield mask)
2066{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002067 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068
2069 try
2070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072
2073 if (context)
2074 {
2075 context->clear(mask);
2076 }
2077 }
2078 catch(std::bad_alloc&)
2079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002081 }
2082}
2083
2084void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
2085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002086 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002087 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002088
2089 try
2090 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092
2093 if (context)
2094 {
2095 context->setClearColor(red, green, blue, alpha);
2096 }
2097 }
2098 catch(std::bad_alloc&)
2099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002100 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002101 }
2102}
2103
2104void __stdcall glClearDepthf(GLclampf depth)
2105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002106 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002107
2108 try
2109 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002111
2112 if (context)
2113 {
2114 context->setClearDepth(depth);
2115 }
2116 }
2117 catch(std::bad_alloc&)
2118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002120 }
2121}
2122
2123void __stdcall glClearStencil(GLint s)
2124{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002125 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126
2127 try
2128 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002129 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002130
2131 if (context)
2132 {
2133 context->setClearStencil(s);
2134 }
2135 }
2136 catch(std::bad_alloc&)
2137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002138 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002139 }
2140}
2141
2142void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
2143{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002144 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002145 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002146
2147 try
2148 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002149 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002150
2151 if (context)
2152 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00002153 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002154 }
2155 }
2156 catch(std::bad_alloc&)
2157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002158 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159 }
2160}
2161
2162void __stdcall glCompileShader(GLuint shader)
2163{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002164 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165
2166 try
2167 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002168 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002169
2170 if (context)
2171 {
2172 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002173
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174 if (!shaderObject)
2175 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00002176 if (context->getProgram(shader))
2177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002178 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00002179 }
2180 else
2181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002182 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00002183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 }
2185
2186 shaderObject->compile();
2187 }
2188 }
2189 catch(std::bad_alloc&)
2190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002191 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002192 }
2193}
2194
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002195void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
2196 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002198 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002199 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002200 target, level, internalformat, width, height, border, imageSize, data);
2201
2202 try
2203 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002204 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00002205
2206 if (context)
2207 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002208 if (context->getClientVersion() < 3 &&
2209 !validateES2TexImageParameters(context, target, level, internalformat, true, false,
2210 0, 0, width, height, 0, GL_NONE, GL_NONE, data))
2211 {
2212 return;
2213 }
2214
2215 if (context->getClientVersion() >= 3 &&
2216 !validateES3TexImageParameters(context, target, level, internalformat, true, false,
2217 0, 0, 0, width, height, 1, 0, GL_NONE, GL_NONE))
2218 {
2219 return;
2220 }
2221
2222 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002225 }
2226
2227 switch (target)
2228 {
2229 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002230 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002231 gl::Texture2D *texture = context->getTexture2D();
2232 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002233 }
2234 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002235
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002236 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2237 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2238 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2239 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2240 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2241 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002242 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002243 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2244 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002245 }
2246 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002247
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002248 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002249 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002250 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00002251 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252 }
2253 catch(std::bad_alloc&)
2254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002255 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002256 }
2257}
2258
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002259void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
2260 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002261{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002262 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002263 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002264 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265 target, level, xoffset, yoffset, width, height, format, imageSize, data);
2266
2267 try
2268 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00002270
2271 if (context)
2272 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002273 if (context->getClientVersion() < 3 &&
2274 !validateES2TexImageParameters(context, target, level, GL_NONE, true, true,
2275 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
2276 {
2277 return;
2278 }
2279
2280 if (context->getClientVersion() >= 3 &&
2281 !validateES3TexImageParameters(context, target, level, GL_NONE, true, true,
2282 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE))
2283 {
2284 return;
2285 }
2286
2287 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002290 }
2291
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002292 switch (target)
daniel@transgaming.com01868132010-08-24 19:21:17 +00002293 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002294 case GL_TEXTURE_2D:
daniel@transgaming.com01868132010-08-24 19:21:17 +00002295 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002296 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00002297 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00002298 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002299 break;
2300
2301 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2302 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2303 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2304 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2305 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2306 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com01868132010-08-24 19:21:17 +00002307 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002308 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00002309 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00002310 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002311 break;
2312
2313 default:
2314 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00002315 }
2316 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002317 }
2318 catch(std::bad_alloc&)
2319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002320 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321 }
2322}
2323
2324void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
2325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002326 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002327 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328 target, level, internalformat, x, y, width, height, border);
2329
2330 try
2331 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002332 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002333
2334 if (context)
2335 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002336 if (context->getClientVersion() < 3 &&
2337 !validateES2CopyTexImageParameters(context, target, level, internalformat, false,
2338 0, 0, x, y, width, height, border))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00002339 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002340 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00002341 }
2342
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002343 if (context->getClientVersion() >= 3 &&
2344 !validateES3CopyTexImageParameters(context, target, level, internalformat, false,
2345 0, 0, 0, x, y, width, height, border))
2346 {
2347 return;
2348 }
2349
2350 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
2351
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002352 switch (target)
2353 {
2354 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002355 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002356 gl::Texture2D *texture = context->getTexture2D();
2357 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002358 }
2359 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002360
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002361 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2362 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2363 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2364 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2365 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2366 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002367 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002368 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2369 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002370 }
2371 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002372
2373 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002374 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002375 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002376 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 }
2378 catch(std::bad_alloc&)
2379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002381 }
2382}
2383
2384void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
2385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002386 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002387 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388 target, level, xoffset, yoffset, x, y, width, height);
2389
2390 try
2391 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002392 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002393
2394 if (context)
2395 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002396 if (context->getClientVersion() < 3 &&
2397 !validateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
2398 xoffset, yoffset, x, y, width, height, 0))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002399 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002400 return;
2401 }
2402
2403 if (context->getClientVersion() >= 3 &&
2404 !validateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
2405 xoffset, yoffset, 0, x, y, width, height, 0))
2406 {
2407 return;
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002408 }
2409
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002410 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002411
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002412 switch (target)
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002413 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002414 case GL_TEXTURE_2D:
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002415 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002416 gl::Texture2D *texture = context->getTexture2D();
2417 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002418 }
2419 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002420
2421 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2422 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2423 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2424 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2425 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2426 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002427 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002428 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2429 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002430 }
2431 break;
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002432
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002433 default:
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00002434 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002435 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002436 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002438
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439 catch(std::bad_alloc&)
2440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002441 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002442 }
2443}
2444
2445GLuint __stdcall glCreateProgram(void)
2446{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002447 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002448
2449 try
2450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452
2453 if (context)
2454 {
2455 return context->createProgram();
2456 }
2457 }
2458 catch(std::bad_alloc&)
2459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002460 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002461 }
2462
2463 return 0;
2464}
2465
2466GLuint __stdcall glCreateShader(GLenum type)
2467{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002468 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469
2470 try
2471 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002472 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002473
2474 if (context)
2475 {
2476 switch (type)
2477 {
2478 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002479 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480 return context->createShader(type);
2481 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002482 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 }
2484 }
2485 }
2486 catch(std::bad_alloc&)
2487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002488 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489 }
2490
2491 return 0;
2492}
2493
2494void __stdcall glCullFace(GLenum mode)
2495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002496 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497
2498 try
2499 {
2500 switch (mode)
2501 {
2502 case GL_FRONT:
2503 case GL_BACK:
2504 case GL_FRONT_AND_BACK:
2505 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002507
2508 if (context)
2509 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002510 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002511 }
2512 }
2513 break;
2514 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002515 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516 }
2517 }
2518 catch(std::bad_alloc&)
2519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521 }
2522}
2523
2524void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002526 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527
2528 try
2529 {
2530 if (n < 0)
2531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002532 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 }
2534
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002535 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536
2537 if (context)
2538 {
2539 for (int i = 0; i < n; i++)
2540 {
2541 context->deleteBuffer(buffers[i]);
2542 }
2543 }
2544 }
2545 catch(std::bad_alloc&)
2546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002547 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549}
2550
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002551void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2552{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002553 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002554
2555 try
2556 {
2557 if (n < 0)
2558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002559 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002560 }
2561
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002562 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002563
2564 if (context)
2565 {
2566 for (int i = 0; i < n; i++)
2567 {
2568 context->deleteFence(fences[i]);
2569 }
2570 }
2571 }
2572 catch(std::bad_alloc&)
2573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002574 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002575 }
2576}
2577
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2579{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002580 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581
2582 try
2583 {
2584 if (n < 0)
2585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587 }
2588
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590
2591 if (context)
2592 {
2593 for (int i = 0; i < n; i++)
2594 {
2595 if (framebuffers[i] != 0)
2596 {
2597 context->deleteFramebuffer(framebuffers[i]);
2598 }
2599 }
2600 }
2601 }
2602 catch(std::bad_alloc&)
2603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002605 }
2606}
2607
2608void __stdcall glDeleteProgram(GLuint program)
2609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002610 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002611
2612 try
2613 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002614 if (program == 0)
2615 {
2616 return;
2617 }
2618
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002619 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620
2621 if (context)
2622 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002623 if (!context->getProgram(program))
2624 {
2625 if(context->getShader(program))
2626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002627 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002628 }
2629 else
2630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002632 }
2633 }
2634
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635 context->deleteProgram(program);
2636 }
2637 }
2638 catch(std::bad_alloc&)
2639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002641 }
2642}
2643
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002644void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2645{
2646 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2647
2648 try
2649 {
2650 if (n < 0)
2651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002653 }
2654
2655 gl::Context *context = gl::getNonLostContext();
2656
2657 if (context)
2658 {
2659 for (int i = 0; i < n; i++)
2660 {
2661 context->deleteQuery(ids[i]);
2662 }
2663 }
2664 }
2665 catch(std::bad_alloc&)
2666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002667 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002668 }
2669}
2670
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002671void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2672{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002673 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674
2675 try
2676 {
2677 if (n < 0)
2678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680 }
2681
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002683
2684 if (context)
2685 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002686 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002687 {
2688 context->deleteRenderbuffer(renderbuffers[i]);
2689 }
2690 }
2691 }
2692 catch(std::bad_alloc&)
2693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002695 }
2696}
2697
2698void __stdcall glDeleteShader(GLuint shader)
2699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002700 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002701
2702 try
2703 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002704 if (shader == 0)
2705 {
2706 return;
2707 }
2708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002710
2711 if (context)
2712 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002713 if (!context->getShader(shader))
2714 {
2715 if(context->getProgram(shader))
2716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002717 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002718 }
2719 else
2720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002722 }
2723 }
2724
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725 context->deleteShader(shader);
2726 }
2727 }
2728 catch(std::bad_alloc&)
2729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731 }
2732}
2733
2734void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2735{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002736 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002737
2738 try
2739 {
2740 if (n < 0)
2741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002742 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743 }
2744
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002745 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002746
2747 if (context)
2748 {
2749 for (int i = 0; i < n; i++)
2750 {
2751 if (textures[i] != 0)
2752 {
2753 context->deleteTexture(textures[i]);
2754 }
2755 }
2756 }
2757 }
2758 catch(std::bad_alloc&)
2759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002760 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002761 }
2762}
2763
2764void __stdcall glDepthFunc(GLenum func)
2765{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002766 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767
2768 try
2769 {
2770 switch (func)
2771 {
2772 case GL_NEVER:
2773 case GL_ALWAYS:
2774 case GL_LESS:
2775 case GL_LEQUAL:
2776 case GL_EQUAL:
2777 case GL_GREATER:
2778 case GL_GEQUAL:
2779 case GL_NOTEQUAL:
2780 break;
2781 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002782 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002783 }
2784
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002786
2787 if (context)
2788 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002789 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002790 }
2791 }
2792 catch(std::bad_alloc&)
2793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002795 }
2796}
2797
2798void __stdcall glDepthMask(GLboolean flag)
2799{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002800 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002801
2802 try
2803 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002804 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002805
2806 if (context)
2807 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002808 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002809 }
2810 }
2811 catch(std::bad_alloc&)
2812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002814 }
2815}
2816
2817void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002819 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002820
2821 try
2822 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002823 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824
2825 if (context)
2826 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002827 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002828 }
2829 }
2830 catch(std::bad_alloc&)
2831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002833 }
2834}
2835
2836void __stdcall glDetachShader(GLuint program, GLuint shader)
2837{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002838 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002839
2840 try
2841 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002843
2844 if (context)
2845 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002846
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002847 gl::Program *programObject = context->getProgram(program);
2848 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002849
2850 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002852 gl::Shader *shaderByProgramHandle;
2853 shaderByProgramHandle = context->getShader(program);
2854 if (!shaderByProgramHandle)
2855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002856 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002857 }
2858 else
2859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002860 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002861 }
2862 }
2863
2864 if (!shaderObject)
2865 {
2866 gl::Program *programByShaderHandle = context->getProgram(shader);
2867 if (!programByShaderHandle)
2868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002869 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002870 }
2871 else
2872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002873 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002874 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002875 }
2876
2877 if (!programObject->detachShader(shaderObject))
2878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002879 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881 }
2882 }
2883 catch(std::bad_alloc&)
2884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002885 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002886 }
2887}
2888
2889void __stdcall glDisable(GLenum cap)
2890{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002891 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002892
2893 try
2894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002896
2897 if (context)
2898 {
2899 switch (cap)
2900 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002901 case GL_CULL_FACE: context->setCullFace(false); break;
2902 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2903 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2904 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2905 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2906 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2907 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2908 case GL_BLEND: context->setBlend(false); break;
2909 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002910 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002911 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912 }
2913 }
2914 }
2915 catch(std::bad_alloc&)
2916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919}
2920
2921void __stdcall glDisableVertexAttribArray(GLuint index)
2922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002923 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924
2925 try
2926 {
2927 if (index >= gl::MAX_VERTEX_ATTRIBS)
2928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002930 }
2931
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002932 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933
2934 if (context)
2935 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002936 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937 }
2938 }
2939 catch(std::bad_alloc&)
2940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002941 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002942 }
2943}
2944
2945void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2946{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002947 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948
2949 try
2950 {
2951 if (count < 0 || first < 0)
2952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002953 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954 }
2955
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957
2958 if (context)
2959 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002960 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002961 }
2962 }
2963 catch(std::bad_alloc&)
2964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002965 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002966 }
2967}
2968
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002969void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2970{
2971 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2972
2973 try
2974 {
2975 if (count < 0 || first < 0 || primcount < 0)
2976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002978 }
2979
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002980 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002981 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002982 gl::Context *context = gl::getNonLostContext();
2983
2984 if (context)
2985 {
2986 context->drawArrays(mode, first, count, primcount);
2987 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002988 }
2989 }
2990 catch(std::bad_alloc&)
2991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002992 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002993 }
2994}
2995
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002996void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002997{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002998 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 +00002999 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000
3001 try
3002 {
3003 if (count < 0)
3004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003005 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003006 }
3007
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003008 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003009
3010 if (context)
3011 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00003012 switch (type)
3013 {
3014 case GL_UNSIGNED_BYTE:
3015 case GL_UNSIGNED_SHORT:
3016 break;
3017 case GL_UNSIGNED_INT:
3018 if (!context->supports32bitIndices())
3019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003020 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00003021 }
3022 break;
3023 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00003025 }
3026
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003027 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 }
3029 }
3030 catch(std::bad_alloc&)
3031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003032 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003033 }
3034}
3035
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003036void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
3037{
3038 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
3039 mode, count, type, indices, primcount);
3040
3041 try
3042 {
3043 if (count < 0 || primcount < 0)
3044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003045 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003046 }
3047
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003048 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003049 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003050 gl::Context *context = gl::getNonLostContext();
3051
3052 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003053 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003054 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003055 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003056 case GL_UNSIGNED_BYTE:
3057 case GL_UNSIGNED_SHORT:
3058 break;
3059 case GL_UNSIGNED_INT:
3060 if (!context->supports32bitIndices())
3061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003062 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003063 }
3064 break;
3065 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003067 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003068
3069 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003070 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003071 }
3072 }
3073 catch(std::bad_alloc&)
3074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00003076 }
3077}
3078
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003079void __stdcall glEnable(GLenum cap)
3080{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003081 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082
3083 try
3084 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086
3087 if (context)
3088 {
3089 switch (cap)
3090 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003091 case GL_CULL_FACE: context->setCullFace(true); break;
3092 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
3093 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
3094 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
3095 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
3096 case GL_STENCIL_TEST: context->setStencilTest(true); break;
3097 case GL_DEPTH_TEST: context->setDepthTest(true); break;
3098 case GL_BLEND: context->setBlend(true); break;
3099 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003100 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003101 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102 }
3103 }
3104 }
3105 catch(std::bad_alloc&)
3106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108 }
3109}
3110
3111void __stdcall glEnableVertexAttribArray(GLuint index)
3112{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003113 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003114
3115 try
3116 {
3117 if (index >= gl::MAX_VERTEX_ATTRIBS)
3118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003119 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003120 }
3121
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003122 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123
3124 if (context)
3125 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00003126 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003127 }
3128 }
3129 catch(std::bad_alloc&)
3130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003132 }
3133}
3134
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003135void __stdcall glEndQueryEXT(GLenum target)
3136{
3137 EVENT("GLenum target = 0x%X)", target);
3138
3139 try
3140 {
3141 switch (target)
3142 {
3143 case GL_ANY_SAMPLES_PASSED_EXT:
3144 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
3145 break;
3146 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003147 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003148 }
3149
3150 gl::Context *context = gl::getNonLostContext();
3151
3152 if (context)
3153 {
3154 context->endQuery(target);
3155 }
3156 }
3157 catch(std::bad_alloc&)
3158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003159 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003160 }
3161}
3162
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003163void __stdcall glFinishFenceNV(GLuint fence)
3164{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003165 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003166
3167 try
3168 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003169 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003170
3171 if (context)
3172 {
3173 gl::Fence* fenceObject = context->getFence(fence);
3174
3175 if (fenceObject == NULL)
3176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003177 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003178 }
3179
3180 fenceObject->finishFence();
3181 }
3182 }
3183 catch(std::bad_alloc&)
3184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003185 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003186 }
3187}
3188
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189void __stdcall glFinish(void)
3190{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003191 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003192
3193 try
3194 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003195 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196
3197 if (context)
3198 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00003199 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003200 }
3201 }
3202 catch(std::bad_alloc&)
3203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205 }
3206}
3207
3208void __stdcall glFlush(void)
3209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003210 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003211
3212 try
3213 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003214 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215
3216 if (context)
3217 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00003218 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219 }
3220 }
3221 catch(std::bad_alloc&)
3222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003223 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003224 }
3225}
3226
3227void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
3228{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003229 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003230 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231
3232 try
3233 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003234 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003235 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003238 }
3239
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003241
3242 if (context)
3243 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003244 gl::Framebuffer *framebuffer = NULL;
3245 GLuint framebufferHandle = 0;
3246 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3247 {
3248 framebuffer = context->getReadFramebuffer();
3249 framebufferHandle = context->getReadFramebufferHandle();
3250 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003251 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003252 {
3253 framebuffer = context->getDrawFramebuffer();
3254 framebufferHandle = context->getDrawFramebufferHandle();
3255 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003256
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003257 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003259 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003260 }
3261
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003262 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003263 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003264 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3265
3266 if (colorAttachment >= context->getMaximumRenderTargets())
3267 {
3268 return gl::error(GL_INVALID_VALUE);
3269 }
3270
3271 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
3272 }
3273 else
3274 {
3275 switch (attachment)
3276 {
3277 case GL_DEPTH_ATTACHMENT:
3278 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
3279 break;
3280 case GL_STENCIL_ATTACHMENT:
3281 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
3282 break;
3283 default:
3284 return gl::error(GL_INVALID_ENUM);
3285 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003286 }
3287 }
3288 }
3289 catch(std::bad_alloc&)
3290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003292 }
3293}
3294
3295void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
3296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003297 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003298 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299
3300 try
3301 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003302 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003304 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003305 }
3306
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308
3309 if (context)
3310 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003311 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
3312 {
3313 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3314
3315 if (colorAttachment >= context->getMaximumRenderTargets())
3316 {
3317 return gl::error(GL_INVALID_VALUE);
3318 }
3319 }
3320 else
3321 {
3322 switch (attachment)
3323 {
3324 case GL_DEPTH_ATTACHMENT:
3325 case GL_STENCIL_ATTACHMENT:
3326 break;
3327 default:
3328 return gl::error(GL_INVALID_ENUM);
3329 }
3330 }
3331
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003332 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003333 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003334 textarget = GL_NONE;
3335 }
3336 else
3337 {
3338 gl::Texture *tex = context->getTexture(texture);
3339
3340 if (tex == NULL)
3341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003342 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003343 }
3344
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003345 switch (textarget)
3346 {
3347 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003349 if (tex->getTarget() != GL_TEXTURE_2D)
3350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003352 }
3353 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003354 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003356 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003357 }
3358 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003360
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003361 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003362 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003363 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003365 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003366 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003367 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003368 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003371 }
3372 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003373 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003376 }
3377 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003378 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003379
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003380 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003381 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382 }
3383
3384 if (level != 0)
3385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003386 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003387 }
3388 }
3389
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003390 gl::Framebuffer *framebuffer = NULL;
3391 GLuint framebufferHandle = 0;
3392 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3393 {
3394 framebuffer = context->getReadFramebuffer();
3395 framebufferHandle = context->getReadFramebufferHandle();
3396 }
3397 else
3398 {
3399 framebuffer = context->getDrawFramebuffer();
3400 framebufferHandle = context->getDrawFramebufferHandle();
3401 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003402
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003403 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003405 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 }
3407
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003408 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003409 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003410 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3411
3412 if (colorAttachment >= context->getMaximumRenderTargets())
3413 {
3414 return gl::error(GL_INVALID_VALUE);
3415 }
3416
3417 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3418 }
3419 else
3420 {
3421 switch (attachment)
3422 {
3423 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3424 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3425 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003426 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427 }
3428 }
3429 catch(std::bad_alloc&)
3430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 }
3433}
3434
3435void __stdcall glFrontFace(GLenum mode)
3436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003437 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438
3439 try
3440 {
3441 switch (mode)
3442 {
3443 case GL_CW:
3444 case GL_CCW:
3445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447
3448 if (context)
3449 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003450 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 }
3452 }
3453 break;
3454 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003455 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456 }
3457 }
3458 catch(std::bad_alloc&)
3459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003460 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 }
3462}
3463
3464void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003466 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003467
3468 try
3469 {
3470 if (n < 0)
3471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003472 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003473 }
3474
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003475 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003476
3477 if (context)
3478 {
3479 for (int i = 0; i < n; i++)
3480 {
3481 buffers[i] = context->createBuffer();
3482 }
3483 }
3484 }
3485 catch(std::bad_alloc&)
3486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003487 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003488 }
3489}
3490
3491void __stdcall glGenerateMipmap(GLenum target)
3492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003493 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003494
3495 try
3496 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003497 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003498
3499 if (context)
3500 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003501 switch (target)
3502 {
3503 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003504 {
3505 gl::Texture2D *tex2d = context->getTexture2D();
3506
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003507 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003510 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003511 if (tex2d->isDepth(0))
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003514 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003515
3516 tex2d->generateMipmaps();
3517 break;
3518 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003519
3520 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003521 {
3522 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3523
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003524 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003527 }
3528
3529 texcube->generateMipmaps();
3530 break;
3531 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003532
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003533 case GL_TEXTURE_3D:
3534 {
3535 if (context->getClientVersion() < 3)
3536 {
3537 return gl::error(GL_INVALID_ENUM);
3538 }
3539
3540 gl::Texture3D *tex3D = context->getTexture3D();
3541 if (tex3D->isCompressed(0))
3542 {
3543 return gl::error(GL_INVALID_OPERATION);
3544 }
3545
3546 tex3D->generateMipmaps();
3547 break;
3548 }
3549
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003550 case GL_TEXTURE_2D_ARRAY:
3551 {
3552 if (context->getClientVersion() < 3)
3553 {
3554 return gl::error(GL_INVALID_ENUM);
3555 }
3556
3557 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3558 if (tex2darr->isCompressed(0))
3559 {
3560 return gl::error(GL_INVALID_OPERATION);
3561 }
3562
3563 tex2darr->generateMipmaps();
3564 break;
3565 }
3566
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003567 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003568 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003569 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003571 }
3572 catch(std::bad_alloc&)
3573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003574 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003575 }
3576}
3577
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003578void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3579{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003580 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003581
3582 try
3583 {
3584 if (n < 0)
3585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003586 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003587 }
3588
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003589 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003590
3591 if (context)
3592 {
3593 for (int i = 0; i < n; i++)
3594 {
3595 fences[i] = context->createFence();
3596 }
3597 }
3598 }
3599 catch(std::bad_alloc&)
3600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003601 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003602 }
3603}
3604
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003605void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003607 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608
3609 try
3610 {
3611 if (n < 0)
3612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003614 }
3615
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003616 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617
3618 if (context)
3619 {
3620 for (int i = 0; i < n; i++)
3621 {
3622 framebuffers[i] = context->createFramebuffer();
3623 }
3624 }
3625 }
3626 catch(std::bad_alloc&)
3627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629 }
3630}
3631
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003632void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3633{
3634 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3635
3636 try
3637 {
3638 if (n < 0)
3639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003640 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003641 }
3642
3643 gl::Context *context = gl::getNonLostContext();
3644
3645 if (context)
3646 {
3647 for (int i = 0; i < n; i++)
3648 {
3649 ids[i] = context->createQuery();
3650 }
3651 }
3652 }
3653 catch(std::bad_alloc&)
3654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003656 }
3657}
3658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003659void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003661 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003662
3663 try
3664 {
3665 if (n < 0)
3666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003667 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003668 }
3669
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003670 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003671
3672 if (context)
3673 {
3674 for (int i = 0; i < n; i++)
3675 {
3676 renderbuffers[i] = context->createRenderbuffer();
3677 }
3678 }
3679 }
3680 catch(std::bad_alloc&)
3681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003682 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683 }
3684}
3685
3686void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3687{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003688 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003689
3690 try
3691 {
3692 if (n < 0)
3693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003694 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003695 }
3696
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003697 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003698
3699 if (context)
3700 {
3701 for (int i = 0; i < n; i++)
3702 {
3703 textures[i] = context->createTexture();
3704 }
3705 }
3706 }
3707 catch(std::bad_alloc&)
3708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003709 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003710 }
3711}
3712
daniel@transgaming.com85423182010-04-22 13:35:27 +00003713void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003715 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003716 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003717 program, index, bufsize, length, size, type, name);
3718
3719 try
3720 {
3721 if (bufsize < 0)
3722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003723 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003724 }
3725
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003726 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003727
3728 if (context)
3729 {
3730 gl::Program *programObject = context->getProgram(program);
3731
3732 if (!programObject)
3733 {
3734 if (context->getShader(program))
3735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003736 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003737 }
3738 else
3739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003741 }
3742 }
3743
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003744 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003747 }
3748
3749 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3750 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003751 }
3752 catch(std::bad_alloc&)
3753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003754 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003755 }
3756}
3757
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003758void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003759{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003760 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003761 "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 +00003762 program, index, bufsize, length, size, type, name);
3763
3764 try
3765 {
3766 if (bufsize < 0)
3767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003769 }
3770
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003772
3773 if (context)
3774 {
3775 gl::Program *programObject = context->getProgram(program);
3776
3777 if (!programObject)
3778 {
3779 if (context->getShader(program))
3780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003782 }
3783 else
3784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003785 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003786 }
3787 }
3788
3789 if (index >= (GLuint)programObject->getActiveUniformCount())
3790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003792 }
3793
3794 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3795 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003796 }
3797 catch(std::bad_alloc&)
3798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003799 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 }
3801}
3802
3803void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003805 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 +00003806 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003807
3808 try
3809 {
3810 if (maxcount < 0)
3811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003813 }
3814
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003815 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003816
3817 if (context)
3818 {
3819 gl::Program *programObject = context->getProgram(program);
3820
3821 if (!programObject)
3822 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003823 if (context->getShader(program))
3824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003825 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003826 }
3827 else
3828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003830 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003831 }
3832
3833 return programObject->getAttachedShaders(maxcount, count, shaders);
3834 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835 }
3836 catch(std::bad_alloc&)
3837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003839 }
3840}
3841
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003842int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003844 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003845
3846 try
3847 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003848 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003849
3850 if (context)
3851 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003852
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003853 gl::Program *programObject = context->getProgram(program);
3854
3855 if (!programObject)
3856 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003857 if (context->getShader(program))
3858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003859 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003860 }
3861 else
3862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003864 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003865 }
3866
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003867 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003868 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003870 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003871 }
3872
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003873 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 }
3875 }
3876 catch(std::bad_alloc&)
3877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003878 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003879 }
3880
3881 return -1;
3882}
3883
3884void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003886 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887
3888 try
3889 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003890 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003891
3892 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003893 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003894 if (!(context->getBooleanv(pname, params)))
3895 {
3896 GLenum nativeType;
3897 unsigned int numParams = 0;
3898 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003899 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003900
3901 if (numParams == 0)
3902 return; // it is known that the pname is valid, but there are no parameters to return
3903
3904 if (nativeType == GL_FLOAT)
3905 {
3906 GLfloat *floatParams = NULL;
3907 floatParams = new GLfloat[numParams];
3908
3909 context->getFloatv(pname, floatParams);
3910
3911 for (unsigned int i = 0; i < numParams; ++i)
3912 {
3913 if (floatParams[i] == 0.0f)
3914 params[i] = GL_FALSE;
3915 else
3916 params[i] = GL_TRUE;
3917 }
3918
3919 delete [] floatParams;
3920 }
3921 else if (nativeType == GL_INT)
3922 {
3923 GLint *intParams = NULL;
3924 intParams = new GLint[numParams];
3925
3926 context->getIntegerv(pname, intParams);
3927
3928 for (unsigned int i = 0; i < numParams; ++i)
3929 {
3930 if (intParams[i] == 0)
3931 params[i] = GL_FALSE;
3932 else
3933 params[i] = GL_TRUE;
3934 }
3935
3936 delete [] intParams;
3937 }
3938 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939 }
3940 }
3941 catch(std::bad_alloc&)
3942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944 }
3945}
3946
3947void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003949 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 +00003950
3951 try
3952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003954
3955 if (context)
3956 {
3957 gl::Buffer *buffer;
3958
3959 switch (target)
3960 {
3961 case GL_ARRAY_BUFFER:
3962 buffer = context->getArrayBuffer();
3963 break;
3964 case GL_ELEMENT_ARRAY_BUFFER:
3965 buffer = context->getElementArrayBuffer();
3966 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003967 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003968 }
3969
3970 if (!buffer)
3971 {
3972 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003973 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003974 }
3975
3976 switch (pname)
3977 {
3978 case GL_BUFFER_USAGE:
3979 *params = buffer->usage();
3980 break;
3981 case GL_BUFFER_SIZE:
3982 *params = buffer->size();
3983 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003984 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003985 }
3986 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003987 }
3988 catch(std::bad_alloc&)
3989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003990 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003991 }
3992}
3993
3994GLenum __stdcall glGetError(void)
3995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003996 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997
3998 gl::Context *context = gl::getContext();
3999
4000 if (context)
4001 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00004002 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003 }
4004
4005 return GL_NO_ERROR;
4006}
4007
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004008void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
4009{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004010 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004011
4012 try
4013 {
4014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004015 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004016
4017 if (context)
4018 {
4019 gl::Fence *fenceObject = context->getFence(fence);
4020
4021 if (fenceObject == NULL)
4022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004023 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004024 }
4025
4026 fenceObject->getFenceiv(pname, params);
4027 }
4028 }
4029 catch(std::bad_alloc&)
4030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004031 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004032 }
4033}
4034
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
4036{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004037 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004038
4039 try
4040 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004041 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004042
4043 if (context)
4044 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004045 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004046 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004047 GLenum nativeType;
4048 unsigned int numParams = 0;
4049 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004051
4052 if (numParams == 0)
4053 return; // it is known that the pname is valid, but that there are no parameters to return.
4054
4055 if (nativeType == GL_BOOL)
4056 {
4057 GLboolean *boolParams = NULL;
4058 boolParams = new GLboolean[numParams];
4059
4060 context->getBooleanv(pname, boolParams);
4061
4062 for (unsigned int i = 0; i < numParams; ++i)
4063 {
4064 if (boolParams[i] == GL_FALSE)
4065 params[i] = 0.0f;
4066 else
4067 params[i] = 1.0f;
4068 }
4069
4070 delete [] boolParams;
4071 }
4072 else if (nativeType == GL_INT)
4073 {
4074 GLint *intParams = NULL;
4075 intParams = new GLint[numParams];
4076
4077 context->getIntegerv(pname, intParams);
4078
4079 for (unsigned int i = 0; i < numParams; ++i)
4080 {
4081 params[i] = (GLfloat)intParams[i];
4082 }
4083
4084 delete [] intParams;
4085 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004086 }
4087 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004088 }
4089 catch(std::bad_alloc&)
4090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004091 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004092 }
4093}
4094
4095void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
4096{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004097 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 +00004098 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004099
4100 try
4101 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004102 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103
4104 if (context)
4105 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004106 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004108 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004109 }
4110
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004111 gl::Framebuffer *framebuffer = NULL;
4112 if (target == GL_READ_FRAMEBUFFER_ANGLE)
4113 {
4114 if(context->getReadFramebufferHandle() == 0)
4115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004116 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004117 }
4118
4119 framebuffer = context->getReadFramebuffer();
4120 }
4121 else
4122 {
4123 if (context->getDrawFramebufferHandle() == 0)
4124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00004126 }
4127
4128 framebuffer = context->getDrawFramebuffer();
4129 }
4130
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004131 GLenum attachmentType;
4132 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00004133
4134 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004135 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00004136 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
4137
4138 if (colorAttachment >= context->getMaximumRenderTargets())
4139 {
4140 return gl::error(GL_INVALID_ENUM);
4141 }
4142
4143 attachmentType = framebuffer->getColorbufferType(colorAttachment);
4144 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
4145 }
4146 else
4147 {
4148 switch (attachment)
4149 {
4150 case GL_DEPTH_ATTACHMENT:
4151 attachmentType = framebuffer->getDepthbufferType();
4152 attachmentHandle = framebuffer->getDepthbufferHandle();
4153 break;
4154 case GL_STENCIL_ATTACHMENT:
4155 attachmentType = framebuffer->getStencilbufferType();
4156 attachmentHandle = framebuffer->getStencilbufferHandle();
4157 break;
4158 default: return gl::error(GL_INVALID_ENUM);
4159 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004160 }
4161
4162 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00004163 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004164 {
4165 attachmentObjectType = attachmentType;
4166 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00004167 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004168 {
4169 attachmentObjectType = GL_TEXTURE;
4170 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00004171 else
4172 {
4173 UNREACHABLE();
4174 return;
4175 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004176
4177 switch (pname)
4178 {
4179 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
4180 *params = attachmentObjectType;
4181 break;
4182 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
4183 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
4184 {
4185 *params = attachmentHandle;
4186 }
4187 else
4188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004189 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004190 }
4191 break;
4192 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
4193 if (attachmentObjectType == GL_TEXTURE)
4194 {
4195 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
4196 }
4197 else
4198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004200 }
4201 break;
4202 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
4203 if (attachmentObjectType == GL_TEXTURE)
4204 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00004205 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004206 {
4207 *params = attachmentType;
4208 }
4209 else
4210 {
4211 *params = 0;
4212 }
4213 }
4214 else
4215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004216 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004217 }
4218 break;
4219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00004221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 }
4223 }
4224 catch(std::bad_alloc&)
4225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227 }
4228}
4229
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00004230GLenum __stdcall glGetGraphicsResetStatusEXT(void)
4231{
4232 EVENT("()");
4233
4234 try
4235 {
4236 gl::Context *context = gl::getContext();
4237
4238 if (context)
4239 {
4240 return context->getResetStatus();
4241 }
4242
4243 return GL_NO_ERROR;
4244 }
4245 catch(std::bad_alloc&)
4246 {
4247 return GL_OUT_OF_MEMORY;
4248 }
4249}
4250
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004251void __stdcall glGetIntegerv(GLenum pname, GLint* params)
4252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004253 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004254
4255 try
4256 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258
4259 if (context)
4260 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004261 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004262 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004263 GLenum nativeType;
4264 unsigned int numParams = 0;
4265 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004266 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004268 if (numParams == 0)
4269 return; // it is known that pname is valid, but there are no parameters to return
4270
4271 if (nativeType == GL_BOOL)
4272 {
4273 GLboolean *boolParams = NULL;
4274 boolParams = new GLboolean[numParams];
4275
4276 context->getBooleanv(pname, boolParams);
4277
4278 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004279 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004280 if (boolParams[i] == GL_FALSE)
4281 params[i] = 0;
4282 else
4283 params[i] = 1;
4284 }
4285
4286 delete [] boolParams;
4287 }
4288 else if (nativeType == GL_FLOAT)
4289 {
4290 GLfloat *floatParams = NULL;
4291 floatParams = new GLfloat[numParams];
4292
4293 context->getFloatv(pname, floatParams);
4294
4295 for (unsigned int i = 0; i < numParams; ++i)
4296 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00004297 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 +00004298 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004299 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004301 else
4302 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 +00004303 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004305 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004307 }
4308 }
4309 }
4310 catch(std::bad_alloc&)
4311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004313 }
4314}
4315
4316void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
4317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004318 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004319
4320 try
4321 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004322 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323
4324 if (context)
4325 {
4326 gl::Program *programObject = context->getProgram(program);
4327
4328 if (!programObject)
4329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331 }
4332
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004333 if (context->getClientVersion() < 3)
4334 {
4335 switch (pname)
4336 {
4337 case GL_ACTIVE_UNIFORM_BLOCKS:
4338 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4339 return gl::error(GL_INVALID_ENUM);
4340 }
4341 }
4342
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 switch (pname)
4344 {
4345 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004346 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004347 return;
4348 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004349 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004350 return;
4351 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004352 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353 return;
4354 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004355 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356 return;
4357 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004358 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359 return;
4360 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004361 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362 return;
4363 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004364 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365 return;
4366 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004367 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004368 return;
4369 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004370 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004372 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004373 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004374 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004375 case GL_ACTIVE_UNIFORM_BLOCKS:
4376 *params = programObject->getActiveUniformBlockCount();
4377 return;
4378 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4379 *params = programObject->getActiveUniformBlockMaxLength();
4380 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004382 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383 }
4384 }
4385 }
4386 catch(std::bad_alloc&)
4387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004388 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 }
4390}
4391
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004392void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004393{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004394 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 +00004395 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004396
4397 try
4398 {
4399 if (bufsize < 0)
4400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004401 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402 }
4403
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004405
4406 if (context)
4407 {
4408 gl::Program *programObject = context->getProgram(program);
4409
4410 if (!programObject)
4411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004412 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004413 }
4414
4415 programObject->getInfoLog(bufsize, length, infolog);
4416 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417 }
4418 catch(std::bad_alloc&)
4419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421 }
4422}
4423
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004424void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4425{
4426 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4427
4428 try
4429 {
4430 switch (pname)
4431 {
4432 case GL_CURRENT_QUERY_EXT:
4433 break;
4434 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004435 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004436 }
4437
4438 gl::Context *context = gl::getNonLostContext();
4439
4440 if (context)
4441 {
4442 params[0] = context->getActiveQuery(target);
4443 }
4444 }
4445 catch(std::bad_alloc&)
4446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004448 }
4449}
4450
4451void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4452{
4453 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4454
4455 try
4456 {
4457 switch (pname)
4458 {
4459 case GL_QUERY_RESULT_EXT:
4460 case GL_QUERY_RESULT_AVAILABLE_EXT:
4461 break;
4462 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004463 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004464 }
4465 gl::Context *context = gl::getNonLostContext();
4466
4467 if (context)
4468 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004469 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4470
4471 if (!queryObject)
4472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004473 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004474 }
4475
4476 if (context->getActiveQuery(queryObject->getType()) == id)
4477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004478 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004479 }
4480
4481 switch(pname)
4482 {
4483 case GL_QUERY_RESULT_EXT:
4484 params[0] = queryObject->getResult();
4485 break;
4486 case GL_QUERY_RESULT_AVAILABLE_EXT:
4487 params[0] = queryObject->isResultAvailable();
4488 break;
4489 default:
4490 ASSERT(false);
4491 }
4492 }
4493 }
4494 catch(std::bad_alloc&)
4495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004497 }
4498}
4499
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4501{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004502 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 +00004503
4504 try
4505 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004507
4508 if (context)
4509 {
4510 if (target != GL_RENDERBUFFER)
4511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004512 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004513 }
4514
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004515 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004517 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004518 }
4519
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004520 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004521
4522 switch (pname)
4523 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004524 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4525 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4526 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4527 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4528 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4529 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4530 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4531 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4532 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004533 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004534 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004535 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004536 *params = renderbuffer->getSamples();
4537 }
4538 else
4539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004541 }
4542 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004543 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004545 }
4546 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004547 }
4548 catch(std::bad_alloc&)
4549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004550 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551 }
4552}
4553
4554void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4555{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004556 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557
4558 try
4559 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004561
4562 if (context)
4563 {
4564 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004565
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566 if (!shaderObject)
4567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004568 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004569 }
4570
4571 switch (pname)
4572 {
4573 case GL_SHADER_TYPE:
4574 *params = shaderObject->getType();
4575 return;
4576 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004577 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 return;
4579 case GL_COMPILE_STATUS:
4580 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4581 return;
4582 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004583 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004584 return;
4585 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004586 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004587 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004588 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4589 *params = shaderObject->getTranslatedSourceLength();
4590 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004592 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594 }
4595 }
4596 catch(std::bad_alloc&)
4597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004598 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004599 }
4600}
4601
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004602void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004604 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 +00004605 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606
4607 try
4608 {
4609 if (bufsize < 0)
4610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004612 }
4613
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004615
4616 if (context)
4617 {
4618 gl::Shader *shaderObject = context->getShader(shader);
4619
4620 if (!shaderObject)
4621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004623 }
4624
4625 shaderObject->getInfoLog(bufsize, length, infolog);
4626 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
4628 catch(std::bad_alloc&)
4629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004630 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631 }
4632}
4633
4634void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004636 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 +00004637 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004638
4639 try
4640 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004641 switch (shadertype)
4642 {
4643 case GL_VERTEX_SHADER:
4644 case GL_FRAGMENT_SHADER:
4645 break;
4646 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004648 }
4649
4650 switch (precisiontype)
4651 {
4652 case GL_LOW_FLOAT:
4653 case GL_MEDIUM_FLOAT:
4654 case GL_HIGH_FLOAT:
4655 // Assume IEEE 754 precision
4656 range[0] = 127;
4657 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004658 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004659 break;
4660 case GL_LOW_INT:
4661 case GL_MEDIUM_INT:
4662 case GL_HIGH_INT:
4663 // Some (most) hardware only supports single-precision floating-point numbers,
4664 // which can accurately represent integers up to +/-16777216
4665 range[0] = 24;
4666 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004667 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004668 break;
4669 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004671 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672 }
4673 catch(std::bad_alloc&)
4674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004676 }
4677}
4678
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004679void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004681 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 +00004682 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004683
4684 try
4685 {
4686 if (bufsize < 0)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004691 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004692
4693 if (context)
4694 {
4695 gl::Shader *shaderObject = context->getShader(shader);
4696
4697 if (!shaderObject)
4698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004700 }
4701
4702 shaderObject->getSource(bufsize, length, source);
4703 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004704 }
4705 catch(std::bad_alloc&)
4706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004707 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004708 }
4709}
4710
zmo@google.coma574f782011-10-03 21:45:23 +00004711void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4712{
4713 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4714 shader, bufsize, length, source);
4715
4716 try
4717 {
4718 if (bufsize < 0)
4719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004720 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004721 }
4722
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004723 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004724
4725 if (context)
4726 {
4727 gl::Shader *shaderObject = context->getShader(shader);
4728
4729 if (!shaderObject)
4730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004731 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004732 }
4733
4734 shaderObject->getTranslatedSource(bufsize, length, source);
4735 }
4736 }
4737 catch(std::bad_alloc&)
4738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004739 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004740 }
4741}
4742
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743const GLubyte* __stdcall glGetString(GLenum name)
4744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004745 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746
4747 try
4748 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004750
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751 switch (name)
4752 {
4753 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004754 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004755 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004756 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004758 if (context->getClientVersion() == 2)
4759 {
4760 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4761 }
4762 else
4763 {
4764 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4765 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004767 if (context->getClientVersion() == 2)
4768 {
4769 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4770 }
4771 else
4772 {
4773 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4774 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004776 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004777 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004778 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779 }
4780 }
4781 catch(std::bad_alloc&)
4782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785}
4786
4787void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4788{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004789 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 +00004790
4791 try
4792 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004793 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004794
4795 if (context)
4796 {
4797 gl::Texture *texture;
4798
4799 switch (target)
4800 {
4801 case GL_TEXTURE_2D:
4802 texture = context->getTexture2D();
4803 break;
4804 case GL_TEXTURE_CUBE_MAP:
4805 texture = context->getTextureCubeMap();
4806 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004807 case GL_TEXTURE_3D:
4808 if (context->getClientVersion() < 3)
4809 {
4810 return gl::error(GL_INVALID_ENUM);
4811 }
4812 texture = context->getTexture3D();
4813 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004814 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004816 }
4817
4818 switch (pname)
4819 {
4820 case GL_TEXTURE_MAG_FILTER:
4821 *params = (GLfloat)texture->getMagFilter();
4822 break;
4823 case GL_TEXTURE_MIN_FILTER:
4824 *params = (GLfloat)texture->getMinFilter();
4825 break;
4826 case GL_TEXTURE_WRAP_S:
4827 *params = (GLfloat)texture->getWrapS();
4828 break;
4829 case GL_TEXTURE_WRAP_T:
4830 *params = (GLfloat)texture->getWrapT();
4831 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004832 case GL_TEXTURE_WRAP_R:
4833 if (context->getClientVersion() < 3)
4834 {
4835 return gl::error(GL_INVALID_ENUM);
4836 }
4837 *params = (GLfloat)texture->getWrapR();
4838 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004839 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4840 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4841 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004842 case GL_TEXTURE_USAGE_ANGLE:
4843 *params = (GLfloat)texture->getUsage();
4844 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004845 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4846 if (!context->supportsTextureFilterAnisotropy())
4847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004849 }
4850 *params = (GLfloat)texture->getMaxAnisotropy();
4851 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004854 }
4855 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856 }
4857 catch(std::bad_alloc&)
4858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 }
4861}
4862
4863void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004865 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 +00004866
4867 try
4868 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004869 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004870
4871 if (context)
4872 {
4873 gl::Texture *texture;
4874
4875 switch (target)
4876 {
4877 case GL_TEXTURE_2D:
4878 texture = context->getTexture2D();
4879 break;
4880 case GL_TEXTURE_CUBE_MAP:
4881 texture = context->getTextureCubeMap();
4882 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004883 case GL_TEXTURE_3D:
4884 if (context->getClientVersion() < 3)
4885 {
4886 return gl::error(GL_INVALID_ENUM);
4887 }
4888 texture = context->getTexture3D();
4889 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004892 }
4893
4894 switch (pname)
4895 {
4896 case GL_TEXTURE_MAG_FILTER:
4897 *params = texture->getMagFilter();
4898 break;
4899 case GL_TEXTURE_MIN_FILTER:
4900 *params = texture->getMinFilter();
4901 break;
4902 case GL_TEXTURE_WRAP_S:
4903 *params = texture->getWrapS();
4904 break;
4905 case GL_TEXTURE_WRAP_T:
4906 *params = texture->getWrapT();
4907 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004908 case GL_TEXTURE_WRAP_R:
4909 if (context->getClientVersion() < 3)
4910 {
4911 return gl::error(GL_INVALID_ENUM);
4912 }
4913 *params = texture->getWrapR();
4914 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004915 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4916 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4917 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004918 case GL_TEXTURE_USAGE_ANGLE:
4919 *params = texture->getUsage();
4920 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004921 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4922 if (!context->supportsTextureFilterAnisotropy())
4923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004925 }
4926 *params = (GLint)texture->getMaxAnisotropy();
4927 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004928 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004929 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004930 }
4931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004932 }
4933 catch(std::bad_alloc&)
4934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936 }
4937}
4938
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004939void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4940{
4941 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4942 program, location, bufSize, params);
4943
4944 try
4945 {
4946 if (bufSize < 0)
4947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004948 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004949 }
4950
4951 gl::Context *context = gl::getNonLostContext();
4952
4953 if (context)
4954 {
4955 if (program == 0)
4956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004958 }
4959
4960 gl::Program *programObject = context->getProgram(program);
4961
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004962 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004964 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004965 }
4966
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004967 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4968 if (!programBinary)
4969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004970 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004971 }
4972
4973 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004975 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004976 }
4977 }
4978 }
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.com9a849122011-11-12 03:18:00 +00004982 }
4983}
4984
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004985void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4986{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004987 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988
4989 try
4990 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004991 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004992
4993 if (context)
4994 {
4995 if (program == 0)
4996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004997 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004998 }
4999
5000 gl::Program *programObject = context->getProgram(program);
5001
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005002 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005004 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005005 }
5006
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005007 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
5008 if (!programBinary)
5009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005010 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005011 }
5012
5013 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005015 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005016 }
5017 }
5018 }
5019 catch(std::bad_alloc&)
5020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005021 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005022 }
5023}
5024
5025void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
5026{
5027 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
5028 program, location, bufSize, params);
5029
5030 try
5031 {
5032 if (bufSize < 0)
5033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005034 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00005035 }
5036
5037 gl::Context *context = gl::getNonLostContext();
5038
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.com9a849122011-11-12 03:18:00 +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.com9a849122011-11-12 03:18:00 +00005049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005050 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +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->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005061 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005062 }
5063 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064 }
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.com4f39fd92010-03-08 20:26:45 +00005068 }
5069}
5070
5071void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
5072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005073 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074
5075 try
5076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005078
5079 if (context)
5080 {
5081 if (program == 0)
5082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005084 }
5085
5086 gl::Program *programObject = context->getProgram(program);
5087
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005088 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005091 }
5092
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005093 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
5094 if (!programBinary)
5095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005096 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005097 }
5098
5099 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00005102 }
5103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005104 }
5105 catch(std::bad_alloc&)
5106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005108 }
5109}
5110
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005111int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005112{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005113 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114
5115 try
5116 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005117 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118
5119 if (strstr(name, "gl_") == name)
5120 {
5121 return -1;
5122 }
5123
5124 if (context)
5125 {
5126 gl::Program *programObject = context->getProgram(program);
5127
5128 if (!programObject)
5129 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00005130 if (context->getShader(program))
5131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005132 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00005133 }
5134 else
5135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005136 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00005137 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 }
5139
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005140 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00005141 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005143 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005144 }
5145
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005146 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005147 }
5148 }
5149 catch(std::bad_alloc&)
5150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005151 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005152 }
5153
5154 return -1;
5155}
5156
5157void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
5158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005159 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
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
daniel@transgaming.come0078962010-04-15 20:45:08 +00005165 if (context)
5166 {
5167 if (index >= gl::MAX_VERTEX_ATTRIBS)
5168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005170 }
5171
daniel@transgaming.com83921382011-01-08 05:46:00 +00005172 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005173
daniel@transgaming.come0078962010-04-15 20:45:08 +00005174 switch (pname)
5175 {
5176 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00005177 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005178 break;
5179 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005180 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005181 break;
5182 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005183 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005184 break;
5185 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005186 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005187 break;
5188 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005189 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005190 break;
5191 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005192 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00005193 break;
5194 case GL_CURRENT_VERTEX_ATTRIB:
5195 for (int i = 0; i < 4; ++i)
5196 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00005197 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00005198 }
5199 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00005200 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
5201 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
5202 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005203 *params = (GLfloat)attribState.mDivisor;
5204 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005205 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005206 }
5207 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005208 }
5209 catch(std::bad_alloc&)
5210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 }
5213}
5214
5215void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
5216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005217 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218
5219 try
5220 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222
daniel@transgaming.come0078962010-04-15 20:45:08 +00005223 if (context)
5224 {
5225 if (index >= gl::MAX_VERTEX_ATTRIBS)
5226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005227 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005228 }
5229
daniel@transgaming.com83921382011-01-08 05:46:00 +00005230 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005231
daniel@transgaming.come0078962010-04-15 20:45:08 +00005232 switch (pname)
5233 {
5234 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00005235 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005236 break;
5237 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005238 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005239 break;
5240 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005241 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005242 break;
5243 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005244 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00005245 break;
5246 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005247 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005248 break;
5249 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005250 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00005251 break;
5252 case GL_CURRENT_VERTEX_ATTRIB:
5253 for (int i = 0; i < 4; ++i)
5254 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00005255 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00005256 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
5257 }
5258 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00005259 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
5260 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
5261 // the same constant.
5262 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005263 *params = (GLint)attribState.mDivisor;
5264 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005265 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005266 }
5267 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
5269 catch(std::bad_alloc&)
5270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005271 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273}
5274
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005275void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005277 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005278
5279 try
5280 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005281 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282
daniel@transgaming.come0078962010-04-15 20:45:08 +00005283 if (context)
5284 {
5285 if (index >= gl::MAX_VERTEX_ATTRIBS)
5286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005288 }
5289
5290 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
5291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005292 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005293 }
5294
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005295 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00005296 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005297 }
5298 catch(std::bad_alloc&)
5299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 }
5302}
5303
5304void __stdcall glHint(GLenum target, GLenum mode)
5305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005306 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 try
5309 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005310 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005311 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005312 case GL_FASTEST:
5313 case GL_NICEST:
5314 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005315 break;
5316 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005317 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005318 }
5319
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005320 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005321 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005322 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005323 case GL_GENERATE_MIPMAP_HINT:
5324 if (context) context->setGenerateMipmapHint(mode);
5325 break;
5326 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
5327 if (context) context->setFragmentShaderDerivativeHint(mode);
5328 break;
5329 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005332 }
5333 catch(std::bad_alloc&)
5334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 }
5337}
5338
5339GLboolean __stdcall glIsBuffer(GLuint buffer)
5340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005341 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342
5343 try
5344 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005346
5347 if (context && buffer)
5348 {
5349 gl::Buffer *bufferObject = context->getBuffer(buffer);
5350
5351 if (bufferObject)
5352 {
5353 return GL_TRUE;
5354 }
5355 }
5356 }
5357 catch(std::bad_alloc&)
5358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005359 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 }
5361
5362 return GL_FALSE;
5363}
5364
5365GLboolean __stdcall glIsEnabled(GLenum cap)
5366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005367 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005368
5369 try
5370 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372
5373 if (context)
5374 {
5375 switch (cap)
5376 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005377 case GL_CULL_FACE: return context->isCullFaceEnabled();
5378 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5379 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5380 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5381 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5382 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5383 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5384 case GL_BLEND: return context->isBlendEnabled();
5385 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005386 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005387 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388 }
5389 }
5390 }
5391 catch(std::bad_alloc&)
5392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005393 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394 }
5395
5396 return false;
5397}
5398
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005399GLboolean __stdcall glIsFenceNV(GLuint fence)
5400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005401 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005402
5403 try
5404 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005405 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005406
5407 if (context)
5408 {
5409 gl::Fence *fenceObject = context->getFence(fence);
5410
5411 if (fenceObject == NULL)
5412 {
5413 return GL_FALSE;
5414 }
5415
5416 return fenceObject->isFence();
5417 }
5418 }
5419 catch(std::bad_alloc&)
5420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005421 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005422 }
5423
5424 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005425}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005426
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005429 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430
5431 try
5432 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005433 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005434
5435 if (context && framebuffer)
5436 {
5437 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5438
5439 if (framebufferObject)
5440 {
5441 return GL_TRUE;
5442 }
5443 }
5444 }
5445 catch(std::bad_alloc&)
5446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449
5450 return GL_FALSE;
5451}
5452
5453GLboolean __stdcall glIsProgram(GLuint program)
5454{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005455 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456
5457 try
5458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460
5461 if (context && program)
5462 {
5463 gl::Program *programObject = context->getProgram(program);
5464
5465 if (programObject)
5466 {
5467 return GL_TRUE;
5468 }
5469 }
5470 }
5471 catch(std::bad_alloc&)
5472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005473 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474 }
5475
5476 return GL_FALSE;
5477}
5478
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005479GLboolean __stdcall glIsQueryEXT(GLuint id)
5480{
5481 EVENT("(GLuint id = %d)", id);
5482
5483 try
5484 {
5485 if (id == 0)
5486 {
5487 return GL_FALSE;
5488 }
5489
5490 gl::Context *context = gl::getNonLostContext();
5491
5492 if (context)
5493 {
5494 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5495
5496 if (queryObject)
5497 {
5498 return GL_TRUE;
5499 }
5500 }
5501 }
5502 catch(std::bad_alloc&)
5503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005504 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005505 }
5506
5507 return GL_FALSE;
5508}
5509
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005510GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5511{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005512 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005513
5514 try
5515 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005516 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005517
5518 if (context && renderbuffer)
5519 {
5520 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5521
5522 if (renderbufferObject)
5523 {
5524 return GL_TRUE;
5525 }
5526 }
5527 }
5528 catch(std::bad_alloc&)
5529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005530 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005531 }
5532
5533 return GL_FALSE;
5534}
5535
5536GLboolean __stdcall glIsShader(GLuint shader)
5537{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005538 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539
5540 try
5541 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543
5544 if (context && shader)
5545 {
5546 gl::Shader *shaderObject = context->getShader(shader);
5547
5548 if (shaderObject)
5549 {
5550 return GL_TRUE;
5551 }
5552 }
5553 }
5554 catch(std::bad_alloc&)
5555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557 }
5558
5559 return GL_FALSE;
5560}
5561
5562GLboolean __stdcall glIsTexture(GLuint texture)
5563{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005564 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565
5566 try
5567 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005568 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005569
5570 if (context && texture)
5571 {
5572 gl::Texture *textureObject = context->getTexture(texture);
5573
5574 if (textureObject)
5575 {
5576 return GL_TRUE;
5577 }
5578 }
5579 }
5580 catch(std::bad_alloc&)
5581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005582 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583 }
5584
5585 return GL_FALSE;
5586}
5587
5588void __stdcall glLineWidth(GLfloat width)
5589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005590 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005591
5592 try
5593 {
5594 if (width <= 0.0f)
5595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597 }
5598
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005599 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005600
5601 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005603 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604 }
5605 }
5606 catch(std::bad_alloc&)
5607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005608 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 }
5610}
5611
5612void __stdcall glLinkProgram(GLuint program)
5613{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005614 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615
5616 try
5617 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005618 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005619
5620 if (context)
5621 {
5622 gl::Program *programObject = context->getProgram(program);
5623
5624 if (!programObject)
5625 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005626 if (context->getShader(program))
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005629 }
5630 else
5631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005632 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634 }
5635
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005636 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637 }
5638 }
5639 catch(std::bad_alloc&)
5640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 }
5643}
5644
5645void __stdcall glPixelStorei(GLenum pname, GLint param)
5646{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005647 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005648
5649 try
5650 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005651 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005652
5653 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005654 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005655 switch (pname)
5656 {
5657 case GL_UNPACK_ALIGNMENT:
5658 if (param != 1 && param != 2 && param != 4 && param != 8)
5659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005660 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005661 }
5662
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005663 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005664 break;
5665
5666 case GL_PACK_ALIGNMENT:
5667 if (param != 1 && param != 2 && param != 4 && param != 8)
5668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005669 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005670 }
5671
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005672 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005673 break;
5674
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005675 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5676 context->setPackReverseRowOrder(param != 0);
5677 break;
5678
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005679 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005681 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005682 }
5683 }
5684 catch(std::bad_alloc&)
5685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005687 }
5688}
5689
5690void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005692 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693
5694 try
5695 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005696 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005697
5698 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005699 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005700 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 }
5702 }
5703 catch(std::bad_alloc&)
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707}
5708
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005709void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5710 GLenum format, GLenum type, GLsizei bufSize,
5711 GLvoid *data)
5712{
5713 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5714 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5715 x, y, width, height, format, type, bufSize, data);
5716
5717 try
5718 {
5719 if (width < 0 || height < 0 || bufSize < 0)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005722 }
5723
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005724 gl::Context *context = gl::getNonLostContext();
5725
5726 if (context)
5727 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005728 GLenum currentFormat, currentType;
5729
5730 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5731 // and attempting to read back if that's the case is an error. The error will be registered
5732 // by getCurrentReadFormat.
5733 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5734 return;
5735
5736 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005739 }
5740
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005741 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5742 }
5743 }
5744 catch(std::bad_alloc&)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005747 }
5748}
5749
5750void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5751 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005752{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005753 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005754 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005755 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756
5757 try
5758 {
5759 if (width < 0 || height < 0)
5760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005762 }
5763
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005764 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005765
5766 if (context)
5767 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005768 GLenum currentFormat, currentType;
5769
5770 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5771 // and attempting to read back if that's the case is an error. The error will be registered
5772 // by getCurrentReadFormat.
5773 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5774 return;
5775
5776 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005778 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005779 }
5780
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005781 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005782 }
5783 }
5784 catch(std::bad_alloc&)
5785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005786 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 }
5788}
5789
5790void __stdcall glReleaseShaderCompiler(void)
5791{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005792 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793
5794 try
5795 {
5796 gl::Shader::releaseCompiler();
5797 }
5798 catch(std::bad_alloc&)
5799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802}
5803
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005804void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005806 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 +00005807 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005808
5809 try
5810 {
5811 switch (target)
5812 {
5813 case GL_RENDERBUFFER:
5814 break;
5815 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005816 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 }
5818
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005819 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 }
5823
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825
5826 if (context)
5827 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005828 if (!gl::IsValidInternalFormat(internalformat, context))
5829 {
5830 return gl::error(GL_INVALID_ENUM);
5831 }
5832
5833 if (!gl::IsColorRenderingSupported(internalformat, context) &&
5834 !gl::IsDepthRenderingSupported(internalformat, context) &&
5835 !gl::IsStencilRenderingSupported(internalformat, context))
5836 {
5837 return gl::error(GL_INVALID_ENUM);
5838 }
5839
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005840 if (width > context->getMaximumRenderbufferDimension() ||
5841 height > context->getMaximumRenderbufferDimension() ||
5842 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005844 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005845 }
5846
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005847 GLuint handle = context->getRenderbufferHandle();
5848 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005850 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 }
5852
5853 switch (internalformat)
5854 {
5855 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 case GL_RGBA4:
5857 case GL_RGB5_A1:
5858 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005859 case GL_RGB8_OES:
5860 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005861 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005862 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005863 break;
5864 case GL_SRGB8_ALPHA8:
5865 case GL_RGB10_A2:
5866 case GL_RG8:
5867 case GL_R8:
5868 if (context->getClientVersion() < 3)
5869 {
5870 return gl::error(GL_INVALID_ENUM);
5871 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005872 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005873 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005874 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005875 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005876
5877 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878 }
5879 }
5880 catch(std::bad_alloc&)
5881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005882 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005883 }
5884}
5885
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005886void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5887{
5888 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5889}
5890
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005891void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5892{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005893 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005894
5895 try
5896 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005897 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005898
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005899 if (context)
5900 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005901 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005902 }
5903 }
5904 catch(std::bad_alloc&)
5905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005906 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 }
5908}
5909
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005910void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5911{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005912 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005913
5914 try
5915 {
5916 if (condition != GL_ALL_COMPLETED_NV)
5917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005919 }
5920
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005921 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005922
5923 if (context)
5924 {
5925 gl::Fence *fenceObject = context->getFence(fence);
5926
5927 if (fenceObject == NULL)
5928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005929 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005930 }
5931
5932 fenceObject->setFence(condition);
5933 }
5934 }
5935 catch(std::bad_alloc&)
5936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005937 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005938 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005939}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005940
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5942{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005943 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 +00005944
5945 try
5946 {
5947 if (width < 0 || height < 0)
5948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 }
5951
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005952 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005953
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005954 if (context)
5955 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005956 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005957 }
5958 }
5959 catch(std::bad_alloc&)
5960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005962 }
5963}
5964
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005965void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005967 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005968 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005969 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970
5971 try
5972 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005973 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005974 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005975 }
5976 catch(std::bad_alloc&)
5977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005979 }
5980}
5981
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005982void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005983{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005984 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 +00005985 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986
5987 try
5988 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005989 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992 }
5993
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995
5996 if (context)
5997 {
5998 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005999
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006000 if (!shaderObject)
6001 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006002 if (context->getProgram(shader))
6003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006004 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006005 }
6006 else
6007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006008 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00006009 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011
6012 shaderObject->setSource(count, string, length);
6013 }
6014 }
6015 catch(std::bad_alloc&)
6016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019}
6020
6021void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
6022{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006023 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024}
6025
6026void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
6027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006028 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 +00006029
6030 try
6031 {
6032 switch (face)
6033 {
6034 case GL_FRONT:
6035 case GL_BACK:
6036 case GL_FRONT_AND_BACK:
6037 break;
6038 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006039 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006040 }
6041
6042 switch (func)
6043 {
6044 case GL_NEVER:
6045 case GL_ALWAYS:
6046 case GL_LESS:
6047 case GL_LEQUAL:
6048 case GL_EQUAL:
6049 case GL_GEQUAL:
6050 case GL_GREATER:
6051 case GL_NOTEQUAL:
6052 break;
6053 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006054 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 }
6056
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006057 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058
6059 if (context)
6060 {
6061 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
6062 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006063 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065
6066 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
6067 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006068 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006069 }
6070 }
6071 }
6072 catch(std::bad_alloc&)
6073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006075 }
6076}
6077
6078void __stdcall glStencilMask(GLuint mask)
6079{
6080 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
6081}
6082
6083void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
6084{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006085 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006086
6087 try
6088 {
6089 switch (face)
6090 {
6091 case GL_FRONT:
6092 case GL_BACK:
6093 case GL_FRONT_AND_BACK:
6094 break;
6095 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006097 }
6098
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006099 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100
6101 if (context)
6102 {
6103 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
6104 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006105 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 }
6107
6108 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
6109 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006110 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006111 }
6112 }
6113 }
6114 catch(std::bad_alloc&)
6115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006116 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006117 }
6118}
6119
6120void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
6121{
6122 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
6123}
6124
6125void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
6126{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006127 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 +00006128 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006129
6130 try
6131 {
6132 switch (face)
6133 {
6134 case GL_FRONT:
6135 case GL_BACK:
6136 case GL_FRONT_AND_BACK:
6137 break;
6138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006139 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006140 }
6141
6142 switch (fail)
6143 {
6144 case GL_ZERO:
6145 case GL_KEEP:
6146 case GL_REPLACE:
6147 case GL_INCR:
6148 case GL_DECR:
6149 case GL_INVERT:
6150 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006151 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006152 break;
6153 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006155 }
6156
6157 switch (zfail)
6158 {
6159 case GL_ZERO:
6160 case GL_KEEP:
6161 case GL_REPLACE:
6162 case GL_INCR:
6163 case GL_DECR:
6164 case GL_INVERT:
6165 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006166 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006167 break;
6168 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006169 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006170 }
6171
6172 switch (zpass)
6173 {
6174 case GL_ZERO:
6175 case GL_KEEP:
6176 case GL_REPLACE:
6177 case GL_INCR:
6178 case GL_DECR:
6179 case GL_INVERT:
6180 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00006181 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006182 break;
6183 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006184 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006185 }
6186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006188
6189 if (context)
6190 {
6191 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
6192 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006193 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006194 }
6195
6196 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
6197 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006198 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006199 }
6200 }
6201 }
6202 catch(std::bad_alloc&)
6203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006205 }
6206}
6207
daniel@transgaming.comfe208882010-09-01 15:47:57 +00006208GLboolean __stdcall glTestFenceNV(GLuint fence)
6209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006210 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006211
6212 try
6213 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006214 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006215
6216 if (context)
6217 {
6218 gl::Fence *fenceObject = context->getFence(fence);
6219
6220 if (fenceObject == NULL)
6221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006222 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006223 }
6224
6225 return fenceObject->testFence();
6226 }
6227 }
6228 catch(std::bad_alloc&)
6229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006230 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006231 }
6232
6233 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00006234}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006235
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006236void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
6237 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006238{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006239 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 +00006240 "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 +00006241 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006242
6243 try
6244 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006245 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006246
6247 if (context)
6248 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006249 if (context->getClientVersion() < 3 &&
6250 !validateES2TexImageParameters(context, target, level, internalformat, false, false,
6251 0, 0, width, height, border, format, type, pixels))
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006252 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006253 return;
6254 }
6255
6256 if (context->getClientVersion() >= 3 &&
6257 !validateES3TexImageParameters(context, target, level, internalformat, false, false,
6258 0, 0, 0, width, height, 1, border, format, type))
6259 {
6260 return;
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006261 }
6262
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006263 switch (target)
6264 {
6265 case GL_TEXTURE_2D:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006266 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006267 gl::Texture2D *texture = context->getTexture2D();
6268 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006269 }
6270 break;
6271 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006272 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006273 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006274 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006275 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006276 break;
6277 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6278 {
6279 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6280 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6281 }
6282 break;
6283 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6284 {
6285 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6286 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6287 }
6288 break;
6289 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6290 {
6291 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6292 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6293 }
6294 break;
6295 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6296 {
6297 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6298 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6299 }
6300 break;
6301 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6302 {
6303 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6304 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
6305 }
6306 break;
6307 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006308 }
6309 }
6310 }
6311 catch(std::bad_alloc&)
6312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006314 }
6315}
6316
6317void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6318{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006319 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6320
6321 try
6322 {
6323 gl::Context *context = gl::getNonLostContext();
6324
6325 if (context)
6326 {
6327 gl::Texture *texture;
6328
6329 switch (target)
6330 {
6331 case GL_TEXTURE_2D:
6332 texture = context->getTexture2D();
6333 break;
6334 case GL_TEXTURE_CUBE_MAP:
6335 texture = context->getTextureCubeMap();
6336 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006337 case GL_TEXTURE_3D:
6338 if (context->getClientVersion() < 3)
6339 {
6340 return gl::error(GL_INVALID_ENUM);
6341 }
6342 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006343 case GL_TEXTURE_2D_ARRAY:
6344 if (context->getClientVersion() < 3)
6345 {
6346 return gl::error(GL_INVALID_ENUM);
6347 }
6348 texture = context->getTexture2DArray();
6349 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006350 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006351 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006352 }
6353
6354 switch (pname)
6355 {
6356 case GL_TEXTURE_WRAP_S:
6357 if (!texture->setWrapS((GLenum)param))
6358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006359 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006360 }
6361 break;
6362 case GL_TEXTURE_WRAP_T:
6363 if (!texture->setWrapT((GLenum)param))
6364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006365 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006366 }
6367 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006368 case GL_TEXTURE_WRAP_R:
6369 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6370 {
6371 return gl::error(GL_INVALID_ENUM);
6372 }
6373 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006374 case GL_TEXTURE_MIN_FILTER:
6375 if (!texture->setMinFilter((GLenum)param))
6376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006377 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006378 }
6379 break;
6380 case GL_TEXTURE_MAG_FILTER:
6381 if (!texture->setMagFilter((GLenum)param))
6382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006384 }
6385 break;
6386 case GL_TEXTURE_USAGE_ANGLE:
6387 if (!texture->setUsage((GLenum)param))
6388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006389 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006390 }
6391 break;
6392 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6393 if (!context->supportsTextureFilterAnisotropy())
6394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006395 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006396 }
6397 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006400 }
6401 break;
6402 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006403 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006404 }
6405 }
6406 }
6407 catch(std::bad_alloc&)
6408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006409 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006410 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006411}
6412
6413void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6414{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006415 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006416}
6417
6418void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006420 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006421
6422 try
6423 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006425
6426 if (context)
6427 {
6428 gl::Texture *texture;
6429
6430 switch (target)
6431 {
6432 case GL_TEXTURE_2D:
6433 texture = context->getTexture2D();
6434 break;
6435 case GL_TEXTURE_CUBE_MAP:
6436 texture = context->getTextureCubeMap();
6437 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006438 case GL_TEXTURE_3D:
6439 if (context->getClientVersion() < 3)
6440 {
6441 return gl::error(GL_INVALID_ENUM);
6442 }
6443 texture = context->getTexture3D();
6444 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006445 case GL_TEXTURE_2D_ARRAY:
6446 if (context->getClientVersion() < 3)
6447 {
6448 return gl::error(GL_INVALID_ENUM);
6449 }
6450 texture = context->getTexture2DArray();
6451 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006453 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006454 }
6455
6456 switch (pname)
6457 {
6458 case GL_TEXTURE_WRAP_S:
6459 if (!texture->setWrapS((GLenum)param))
6460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006461 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006462 }
6463 break;
6464 case GL_TEXTURE_WRAP_T:
6465 if (!texture->setWrapT((GLenum)param))
6466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006468 }
6469 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006470 case GL_TEXTURE_WRAP_R:
6471 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6472 {
6473 return gl::error(GL_INVALID_ENUM);
6474 }
6475 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006476 case GL_TEXTURE_MIN_FILTER:
6477 if (!texture->setMinFilter((GLenum)param))
6478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006479 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006480 }
6481 break;
6482 case GL_TEXTURE_MAG_FILTER:
6483 if (!texture->setMagFilter((GLenum)param))
6484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006486 }
6487 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006488 case GL_TEXTURE_USAGE_ANGLE:
6489 if (!texture->setUsage((GLenum)param))
6490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006492 }
6493 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006494 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6495 if (!context->supportsTextureFilterAnisotropy())
6496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006497 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006498 }
6499 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006502 }
6503 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006504 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006506 }
6507 }
6508 }
6509 catch(std::bad_alloc&)
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006512 }
6513}
6514
6515void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6516{
6517 glTexParameteri(target, pname, *params);
6518}
6519
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006520void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6521{
6522 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6523 target, levels, internalformat, width, height);
6524
6525 try
6526 {
6527 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006529 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006530 }
6531
6532 if (width < 1 || height < 1 || levels < 1)
6533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006534 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006535 }
6536
6537 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006539 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006540 }
6541
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006542 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006544 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006545 }
6546
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006547 gl::Context *context = gl::getNonLostContext();
6548
6549 if (context)
6550 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006551 if (!gl::IsValidInternalFormat(internalformat, context))
6552 {
6553 return gl::error(GL_INVALID_ENUM);
6554 }
6555
6556 GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
6557 GLenum type = gl::GetType(internalformat, context->getClientVersion());
6558
6559 if (format == GL_NONE || type == GL_NONE)
6560 {
6561 return gl::error(GL_INVALID_ENUM);
6562 }
6563
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006564 switch (target)
6565 {
6566 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006567 if (width > context->getMaximum2DTextureDimension() ||
6568 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006570 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006571 }
6572 break;
6573 case GL_TEXTURE_CUBE_MAP:
6574 if (width > context->getMaximumCubeTextureDimension() ||
6575 height > context->getMaximumCubeTextureDimension())
6576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006578 }
6579 break;
6580 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006582 }
6583
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006584 if (levels != 1 && !context->supportsNonPower2Texture())
6585 {
6586 if (!gl::isPow2(width) || !gl::isPow2(height))
6587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006588 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006589 }
6590 }
6591
daniel@transgaming.come1077362011-11-11 04:16:50 +00006592 switch (internalformat)
6593 {
6594 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6595 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6596 if (!context->supportsDXT1Textures())
6597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006598 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006599 }
6600 break;
6601 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6602 if (!context->supportsDXT3Textures())
6603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006604 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006605 }
6606 break;
6607 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6608 if (!context->supportsDXT5Textures())
6609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006610 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006611 }
6612 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006613 case GL_RGBA32F_EXT:
6614 case GL_RGB32F_EXT:
6615 case GL_ALPHA32F_EXT:
6616 case GL_LUMINANCE32F_EXT:
6617 case GL_LUMINANCE_ALPHA32F_EXT:
6618 if (!context->supportsFloat32Textures())
6619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006621 }
6622 break;
6623 case GL_RGBA16F_EXT:
6624 case GL_RGB16F_EXT:
6625 case GL_ALPHA16F_EXT:
6626 case GL_LUMINANCE16F_EXT:
6627 case GL_LUMINANCE_ALPHA16F_EXT:
6628 if (!context->supportsFloat16Textures())
6629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006630 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006631 }
6632 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006633 case GL_DEPTH_COMPONENT16:
6634 case GL_DEPTH_COMPONENT32_OES:
6635 case GL_DEPTH24_STENCIL8_OES:
6636 if (!context->supportsDepthTextures())
6637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006638 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006639 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006640 if (target != GL_TEXTURE_2D)
6641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006643 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006644 // ANGLE_depth_texture only supports 1-level textures
6645 if (levels != 1)
6646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006647 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006648 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006649 break;
6650 default:
6651 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006652 }
6653
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006654 if (target == GL_TEXTURE_2D)
6655 {
6656 gl::Texture2D *texture = context->getTexture2D();
6657
6658 if (!texture || texture->id() == 0)
6659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006660 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006661 }
6662
6663 if (texture->isImmutable())
6664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006665 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006666 }
6667
6668 texture->storage(levels, internalformat, width, height);
6669 }
6670 else if (target == GL_TEXTURE_CUBE_MAP)
6671 {
6672 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6673
6674 if (!texture || texture->id() == 0)
6675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006677 }
6678
6679 if (texture->isImmutable())
6680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006681 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006682 }
6683
6684 texture->storage(levels, internalformat, width);
6685 }
6686 else UNREACHABLE();
6687 }
6688 }
6689 catch(std::bad_alloc&)
6690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006691 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006692 }
6693}
6694
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006695void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6696 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006698 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006699 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006700 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006701 target, level, xoffset, yoffset, width, height, format, type, pixels);
6702
6703 try
6704 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006705 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006706
6707 if (context)
6708 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006709 if (context->getClientVersion() < 3 &&
6710 !validateES2TexImageParameters(context, target, level, GL_NONE, false, true,
6711 0, 0, width, height, 0, format, type, pixels))
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006712 {
6713 return;
6714 }
6715
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006716 if (context->getClientVersion() >= 3 &&
6717 !validateES3TexImageParameters(context, target, level, GL_NONE, false, true,
6718 0, 0, 0, width, height, 1, 0, format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006719 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006720 return;
6721 }
6722
6723 switch (target)
6724 {
6725 case GL_TEXTURE_2D:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006726 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006727 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006728 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006729 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006730 break;
6731
6732 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6733 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6734 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6735 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6736 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6737 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006738 {
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006739 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006740 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006741 }
shannonwoods@chromium.orgf3a3eda2013-05-30 00:13:42 +00006742 break;
6743
6744 default:
6745 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006746 }
6747 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006748 }
6749 catch(std::bad_alloc&)
6750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006751 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006752 }
6753}
6754
6755void __stdcall glUniform1f(GLint location, GLfloat x)
6756{
6757 glUniform1fv(location, 1, &x);
6758}
6759
6760void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6761{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006762 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006763
6764 try
6765 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006766 if (count < 0)
6767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006769 }
6770
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006771 if (location == -1)
6772 {
6773 return;
6774 }
6775
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006776 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006777
6778 if (context)
6779 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006780 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006781 if (!programBinary)
6782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006783 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006784 }
6785
6786 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006788 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006789 }
6790 }
6791 }
6792 catch(std::bad_alloc&)
6793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006795 }
6796}
6797
6798void __stdcall glUniform1i(GLint location, GLint x)
6799{
6800 glUniform1iv(location, 1, &x);
6801}
6802
6803void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006805 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006806
6807 try
6808 {
6809 if (count < 0)
6810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006812 }
6813
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006814 if (location == -1)
6815 {
6816 return;
6817 }
6818
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820
6821 if (context)
6822 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006823 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006824 if (!programBinary)
6825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006826 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006827 }
6828
6829 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006831 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006832 }
6833 }
6834 }
6835 catch(std::bad_alloc&)
6836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 }
6839}
6840
6841void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6842{
6843 GLfloat xy[2] = {x, y};
6844
6845 glUniform2fv(location, 1, (GLfloat*)&xy);
6846}
6847
6848void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6849{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006850 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006851
6852 try
6853 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006854 if (count < 0)
6855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006856 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006857 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006858
6859 if (location == -1)
6860 {
6861 return;
6862 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006865
6866 if (context)
6867 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006868 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006869 if (!programBinary)
6870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006871 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006872 }
6873
6874 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006876 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006877 }
6878 }
6879 }
6880 catch(std::bad_alloc&)
6881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006882 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006883 }
6884}
6885
6886void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6887{
6888 GLint xy[4] = {x, y};
6889
6890 glUniform2iv(location, 1, (GLint*)&xy);
6891}
6892
6893void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6894{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006895 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006896
6897 try
6898 {
6899 if (count < 0)
6900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006901 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006902 }
6903
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006904 if (location == -1)
6905 {
6906 return;
6907 }
6908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006910
6911 if (context)
6912 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006913 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006914 if (!programBinary)
6915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006916 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006917 }
6918
6919 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006921 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006922 }
6923 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006924 }
6925 catch(std::bad_alloc&)
6926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006928 }
6929}
6930
6931void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6932{
6933 GLfloat xyz[3] = {x, y, z};
6934
6935 glUniform3fv(location, 1, (GLfloat*)&xyz);
6936}
6937
6938void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006940 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006941
6942 try
6943 {
6944 if (count < 0)
6945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006946 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006947 }
6948
6949 if (location == -1)
6950 {
6951 return;
6952 }
6953
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006954 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006955
6956 if (context)
6957 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006958 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006959 if (!programBinary)
6960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006961 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006962 }
6963
6964 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006966 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006967 }
6968 }
6969 }
6970 catch(std::bad_alloc&)
6971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006973 }
6974}
6975
6976void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6977{
6978 GLint xyz[3] = {x, y, z};
6979
6980 glUniform3iv(location, 1, (GLint*)&xyz);
6981}
6982
6983void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006985 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006986
6987 try
6988 {
6989 if (count < 0)
6990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006992 }
6993
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006994 if (location == -1)
6995 {
6996 return;
6997 }
6998
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006999 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007000
7001 if (context)
7002 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007003 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007004 if (!programBinary)
7005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007006 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007007 }
7008
7009 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007011 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007012 }
7013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007014 }
7015 catch(std::bad_alloc&)
7016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007018 }
7019}
7020
7021void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7022{
7023 GLfloat xyzw[4] = {x, y, z, w};
7024
7025 glUniform4fv(location, 1, (GLfloat*)&xyzw);
7026}
7027
7028void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
7029{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007030 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007031
7032 try
7033 {
7034 if (count < 0)
7035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007037 }
7038
7039 if (location == -1)
7040 {
7041 return;
7042 }
7043
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007044 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007045
7046 if (context)
7047 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007048 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007049 if (!programBinary)
7050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007051 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007052 }
7053
7054 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007056 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007057 }
7058 }
7059 }
7060 catch(std::bad_alloc&)
7061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007062 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007063 }
7064}
7065
7066void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
7067{
7068 GLint xyzw[4] = {x, y, z, w};
7069
7070 glUniform4iv(location, 1, (GLint*)&xyzw);
7071}
7072
7073void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
7074{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007075 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007076
7077 try
7078 {
7079 if (count < 0)
7080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007081 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007082 }
7083
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007084 if (location == -1)
7085 {
7086 return;
7087 }
7088
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007089 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007090
7091 if (context)
7092 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007093 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007094 if (!programBinary)
7095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007096 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007097 }
7098
7099 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007102 }
7103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007104 }
7105 catch(std::bad_alloc&)
7106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007108 }
7109}
7110
7111void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7112{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007113 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007114 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007115
7116 try
7117 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007118 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007120 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007121 }
7122
7123 if (location == -1)
7124 {
7125 return;
7126 }
7127
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007128 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007129
7130 if (context)
7131 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007132 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7133 {
7134 return gl::error(GL_INVALID_VALUE);
7135 }
7136
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007137 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007138 if (!programBinary)
7139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007140 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007141 }
7142
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007143 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007145 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007146 }
7147 }
7148 }
7149 catch(std::bad_alloc&)
7150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007151 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007152 }
7153}
7154
7155void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7156{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007157 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007158 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007159
7160 try
7161 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007162 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007164 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007165 }
7166
7167 if (location == -1)
7168 {
7169 return;
7170 }
7171
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007173
7174 if (context)
7175 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007176 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7177 {
7178 return gl::error(GL_INVALID_VALUE);
7179 }
7180
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007181 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007182 if (!programBinary)
7183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007184 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007185 }
7186
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007187 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007189 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007190 }
7191 }
7192 }
7193 catch(std::bad_alloc&)
7194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007195 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007196 }
7197}
7198
7199void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7200{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007201 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007202 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007203
7204 try
7205 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007206 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007208 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007209 }
7210
7211 if (location == -1)
7212 {
7213 return;
7214 }
7215
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007216 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007217
7218 if (context)
7219 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007220 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7221 {
7222 return gl::error(GL_INVALID_VALUE);
7223 }
7224
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007226 if (!programBinary)
7227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007228 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007229 }
7230
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007231 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007233 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007234 }
7235 }
7236 }
7237 catch(std::bad_alloc&)
7238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007240 }
7241}
7242
7243void __stdcall glUseProgram(GLuint program)
7244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007245 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007246
7247 try
7248 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007249 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007250
7251 if (context)
7252 {
7253 gl::Program *programObject = context->getProgram(program);
7254
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007255 if (!programObject && program != 0)
7256 {
7257 if (context->getShader(program))
7258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007259 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007260 }
7261 else
7262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007263 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007264 }
7265 }
7266
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007267 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007269 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007270 }
7271
7272 context->useProgram(program);
7273 }
7274 }
7275 catch(std::bad_alloc&)
7276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007278 }
7279}
7280
7281void __stdcall glValidateProgram(GLuint program)
7282{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007283 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007284
7285 try
7286 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007287 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007288
7289 if (context)
7290 {
7291 gl::Program *programObject = context->getProgram(program);
7292
7293 if (!programObject)
7294 {
7295 if (context->getShader(program))
7296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007297 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007298 }
7299 else
7300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007301 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007302 }
7303 }
7304
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007305 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007306 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007307 }
7308 catch(std::bad_alloc&)
7309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007310 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007311 }
7312}
7313
7314void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7315{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007316 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007317
7318 try
7319 {
7320 if (index >= gl::MAX_VERTEX_ATTRIBS)
7321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007322 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007323 }
7324
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007326
7327 if (context)
7328 {
7329 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007330 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007332 }
7333 catch(std::bad_alloc&)
7334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007336 }
7337}
7338
7339void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007341 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007342
7343 try
7344 {
7345 if (index >= gl::MAX_VERTEX_ATTRIBS)
7346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007348 }
7349
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007351
7352 if (context)
7353 {
7354 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007355 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007356 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007357 }
7358 catch(std::bad_alloc&)
7359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007361 }
7362}
7363
7364void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7365{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007366 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007367
7368 try
7369 {
7370 if (index >= gl::MAX_VERTEX_ATTRIBS)
7371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007372 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007373 }
7374
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007376
7377 if (context)
7378 {
7379 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007380 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007381 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007382 }
7383 catch(std::bad_alloc&)
7384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007385 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007386 }
7387}
7388
7389void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007391 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007392
7393 try
7394 {
7395 if (index >= gl::MAX_VERTEX_ATTRIBS)
7396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007398 }
7399
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007400 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007401
7402 if (context)
7403 {
7404 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007405 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007406 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007407 }
7408 catch(std::bad_alloc&)
7409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007411 }
7412}
7413
7414void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007416 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 +00007417
7418 try
7419 {
7420 if (index >= gl::MAX_VERTEX_ATTRIBS)
7421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007422 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007423 }
7424
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007426
7427 if (context)
7428 {
7429 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007430 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007431 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007432 }
7433 catch(std::bad_alloc&)
7434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007435 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007436 }
7437}
7438
7439void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007441 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007442
7443 try
7444 {
7445 if (index >= gl::MAX_VERTEX_ATTRIBS)
7446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007448 }
7449
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007451
7452 if (context)
7453 {
7454 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007455 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007456 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007457 }
7458 catch(std::bad_alloc&)
7459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007460 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007461 }
7462}
7463
7464void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007466 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 +00007467
7468 try
7469 {
7470 if (index >= gl::MAX_VERTEX_ATTRIBS)
7471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007472 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007473 }
7474
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007475 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007476
7477 if (context)
7478 {
7479 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007480 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007481 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007482 }
7483 catch(std::bad_alloc&)
7484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007485 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007486 }
7487}
7488
7489void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007491 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007492
7493 try
7494 {
7495 if (index >= gl::MAX_VERTEX_ATTRIBS)
7496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007497 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007498 }
7499
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007500 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007501
7502 if (context)
7503 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007504 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007506 }
7507 catch(std::bad_alloc&)
7508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007509 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007510 }
7511}
7512
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007513void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7514{
7515 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7516
7517 try
7518 {
7519 if (index >= gl::MAX_VERTEX_ATTRIBS)
7520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007521 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007522 }
7523
7524 gl::Context *context = gl::getNonLostContext();
7525
7526 if (context)
7527 {
7528 context->setVertexAttribDivisor(index, divisor);
7529 }
7530 }
7531 catch(std::bad_alloc&)
7532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007533 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007534 }
7535}
7536
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007537void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007538{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007539 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007540 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007541 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007542
7543 try
7544 {
7545 if (index >= gl::MAX_VERTEX_ATTRIBS)
7546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007547 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007548 }
7549
7550 if (size < 1 || size > 4)
7551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007552 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007553 }
7554
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007555 gl::Context *context = gl::getNonLostContext();
7556
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007557 switch (type)
7558 {
7559 case GL_BYTE:
7560 case GL_UNSIGNED_BYTE:
7561 case GL_SHORT:
7562 case GL_UNSIGNED_SHORT:
7563 case GL_FIXED:
7564 case GL_FLOAT:
7565 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007566 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007567 case GL_INT:
7568 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007569 case GL_INT_2_10_10_10_REV:
7570 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007571 if (context && context->getClientVersion() < 3)
7572 {
7573 return gl::error(GL_INVALID_ENUM);
7574 }
7575 else
7576 {
7577 break;
7578 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007580 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007581 }
7582
7583 if (stride < 0)
7584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007585 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007586 }
7587
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007588 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7589 {
7590 return gl::error(GL_INVALID_OPERATION);
7591 }
7592
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007593 if (context)
7594 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007595 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7596 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007597 }
7598 }
7599 catch(std::bad_alloc&)
7600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007601 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007602 }
7603}
7604
7605void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007607 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 +00007608
7609 try
7610 {
7611 if (width < 0 || height < 0)
7612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007614 }
7615
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007616 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007617
7618 if (context)
7619 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007620 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007621 }
7622 }
7623 catch(std::bad_alloc&)
7624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007626 }
7627}
7628
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007629// OpenGL ES 3.0 functions
7630
7631void __stdcall glReadBuffer(GLenum mode)
7632{
7633 EVENT("(GLenum mode = 0x%X)", mode);
7634
7635 try
7636 {
7637 gl::Context *context = gl::getNonLostContext();
7638
7639 if (context)
7640 {
7641 if (context->getClientVersion() < 3)
7642 {
7643 return gl::error(GL_INVALID_OPERATION);
7644 }
7645 }
7646
7647 UNIMPLEMENTED();
7648 }
7649 catch(std::bad_alloc&)
7650 {
7651 return gl::error(GL_OUT_OF_MEMORY);
7652 }
7653}
7654
7655void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7656{
7657 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7658 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7659
7660 try
7661 {
7662 gl::Context *context = gl::getNonLostContext();
7663
7664 if (context)
7665 {
7666 if (context->getClientVersion() < 3)
7667 {
7668 return gl::error(GL_INVALID_OPERATION);
7669 }
7670 }
7671
7672 UNIMPLEMENTED();
7673 }
7674 catch(std::bad_alloc&)
7675 {
7676 return gl::error(GL_OUT_OF_MEMORY);
7677 }
7678}
7679
7680void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7681{
7682 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7683 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7684 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7685 target, level, internalformat, width, height, depth, border, format, type, pixels);
7686
7687 try
7688 {
7689 gl::Context *context = gl::getNonLostContext();
7690
7691 if (context)
7692 {
7693 if (context->getClientVersion() < 3)
7694 {
7695 return gl::error(GL_INVALID_OPERATION);
7696 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007697
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007698 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007699 if (!validateES3TexImageParameters(context, target, level, internalformat, false, false,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007700 0, 0, 0, width, height, depth, border, format, type))
7701 {
7702 return;
7703 }
7704
7705 switch(target)
7706 {
7707 case GL_TEXTURE_3D:
7708 {
7709 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007710 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007711 }
7712 break;
7713
7714 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007715 {
7716 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007717 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007718 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007719 break;
7720
7721 default:
7722 return gl::error(GL_INVALID_ENUM);
7723 }
7724 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007725 }
7726 catch(std::bad_alloc&)
7727 {
7728 return gl::error(GL_OUT_OF_MEMORY);
7729 }
7730}
7731
7732void __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)
7733{
7734 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7735 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7736 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7737 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7738
7739 try
7740 {
7741 gl::Context *context = gl::getNonLostContext();
7742
7743 if (context)
7744 {
7745 if (context->getClientVersion() < 3)
7746 {
7747 return gl::error(GL_INVALID_OPERATION);
7748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007749
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007750 if (!pixels)
7751 {
7752 return gl::error(GL_INVALID_VALUE);
7753 }
7754
7755 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007756 if (!validateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007757 xoffset, yoffset, zoffset, width, height, depth, 0,
7758 format, type))
7759 {
7760 return;
7761 }
7762
7763 switch(target)
7764 {
7765 case GL_TEXTURE_3D:
7766 {
7767 gl::Texture3D *texture = context->getTexture3D();
7768 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7769 }
7770 break;
7771
7772 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007773 {
7774 gl::Texture2DArray *texture = context->getTexture2DArray();
7775 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7776 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007777 break;
7778
7779 default:
7780 return gl::error(GL_INVALID_ENUM);
7781 }
7782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007783 }
7784 catch(std::bad_alloc&)
7785 {
7786 return gl::error(GL_OUT_OF_MEMORY);
7787 }
7788}
7789
7790void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7791{
7792 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7793 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7794 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7795
7796 try
7797 {
7798 gl::Context *context = gl::getNonLostContext();
7799
7800 if (context)
7801 {
7802 if (context->getClientVersion() < 3)
7803 {
7804 return gl::error(GL_INVALID_OPERATION);
7805 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007806
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007807 if (!validateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
7808 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007809 {
7810 return;
7811 }
7812
7813 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7814 gl::Texture *texture = NULL;
7815 switch (target)
7816 {
7817 case GL_TEXTURE_3D:
7818 texture = context->getTexture3D();
7819 break;
7820
7821 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007822 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007823 break;
7824
7825 default:
7826 return gl::error(GL_INVALID_ENUM);
7827 }
7828
7829 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7830 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007831 }
7832 catch(std::bad_alloc&)
7833 {
7834 return gl::error(GL_OUT_OF_MEMORY);
7835 }
7836}
7837
7838void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7839{
7840 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7841 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7842 "const GLvoid* data = 0x%0.8p)",
7843 target, level, internalformat, width, height, depth, border, imageSize, data);
7844
7845 try
7846 {
7847 gl::Context *context = gl::getNonLostContext();
7848
7849 if (context)
7850 {
7851 if (context->getClientVersion() < 3)
7852 {
7853 return gl::error(GL_INVALID_OPERATION);
7854 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007855
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007856 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 +00007857 {
7858 return gl::error(GL_INVALID_VALUE);
7859 }
7860
7861 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007862 if (!validateES3TexImageParameters(context, target, level, internalformat, true, false,
7863 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007864 {
7865 return;
7866 }
7867
7868 switch(target)
7869 {
7870 case GL_TEXTURE_3D:
7871 {
7872 gl::Texture3D *texture = context->getTexture3D();
7873 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7874 }
7875 break;
7876
7877 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007878 {
7879 gl::Texture2DArray *texture = context->getTexture2DArray();
7880 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7881 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007882 break;
7883
7884 default:
7885 return gl::error(GL_INVALID_ENUM);
7886 }
7887 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007888 }
7889 catch(std::bad_alloc&)
7890 {
7891 return gl::error(GL_OUT_OF_MEMORY);
7892 }
7893}
7894
7895void __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)
7896{
7897 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7898 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7899 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7900 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7901
7902 try
7903 {
7904 gl::Context *context = gl::getNonLostContext();
7905
7906 if (context)
7907 {
7908 if (context->getClientVersion() < 3)
7909 {
7910 return gl::error(GL_INVALID_OPERATION);
7911 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007912
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007913 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 +00007914 {
7915 return gl::error(GL_INVALID_VALUE);
7916 }
7917
7918 if (!data)
7919 {
7920 return gl::error(GL_INVALID_VALUE);
7921 }
7922
7923 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007924 if (!validateES3TexImageParameters(context, target, level, GL_NONE, true, true,
7925 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007926 {
7927 return;
7928 }
7929
7930 switch(target)
7931 {
7932 case GL_TEXTURE_3D:
7933 {
7934 gl::Texture3D *texture = context->getTexture3D();
7935 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7936 format, imageSize, data);
7937 }
7938 break;
7939
7940 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007941 {
7942 gl::Texture2DArray *texture = context->getTexture2DArray();
7943 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7944 format, imageSize, data);
7945 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007946 break;
7947
7948 default:
7949 return gl::error(GL_INVALID_ENUM);
7950 }
7951 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007952 }
7953 catch(std::bad_alloc&)
7954 {
7955 return gl::error(GL_OUT_OF_MEMORY);
7956 }
7957}
7958
7959void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7960{
7961 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7962
7963 try
7964 {
7965 gl::Context *context = gl::getNonLostContext();
7966
7967 if (context)
7968 {
7969 if (context->getClientVersion() < 3)
7970 {
7971 return gl::error(GL_INVALID_OPERATION);
7972 }
7973 }
7974
7975 UNIMPLEMENTED();
7976 }
7977 catch(std::bad_alloc&)
7978 {
7979 return gl::error(GL_OUT_OF_MEMORY);
7980 }
7981}
7982
7983void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7984{
7985 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7986
7987 try
7988 {
7989 gl::Context *context = gl::getNonLostContext();
7990
7991 if (context)
7992 {
7993 if (context->getClientVersion() < 3)
7994 {
7995 return gl::error(GL_INVALID_OPERATION);
7996 }
7997 }
7998
7999 UNIMPLEMENTED();
8000 }
8001 catch(std::bad_alloc&)
8002 {
8003 return gl::error(GL_OUT_OF_MEMORY);
8004 }
8005}
8006
8007GLboolean __stdcall glIsQuery(GLuint id)
8008{
8009 EVENT("(GLuint id = %u)", id);
8010
8011 try
8012 {
8013 gl::Context *context = gl::getNonLostContext();
8014
8015 if (context)
8016 {
8017 if (context->getClientVersion() < 3)
8018 {
8019 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8020 }
8021 }
8022
8023 UNIMPLEMENTED();
8024 }
8025 catch(std::bad_alloc&)
8026 {
8027 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8028 }
8029
8030 return GL_FALSE;
8031}
8032
8033void __stdcall glBeginQuery(GLenum target, GLuint id)
8034{
8035 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
8036
8037 try
8038 {
8039 gl::Context *context = gl::getNonLostContext();
8040
8041 if (context)
8042 {
8043 if (context->getClientVersion() < 3)
8044 {
8045 return gl::error(GL_INVALID_OPERATION);
8046 }
8047 }
8048
8049 UNIMPLEMENTED();
8050 }
8051 catch(std::bad_alloc&)
8052 {
8053 return gl::error(GL_OUT_OF_MEMORY);
8054 }
8055}
8056
8057void __stdcall glEndQuery(GLenum target)
8058{
8059 EVENT("(GLenum target = 0x%X)", target);
8060
8061 try
8062 {
8063 gl::Context *context = gl::getNonLostContext();
8064
8065 if (context)
8066 {
8067 if (context->getClientVersion() < 3)
8068 {
8069 return gl::error(GL_INVALID_OPERATION);
8070 }
8071 }
8072
8073 UNIMPLEMENTED();
8074 }
8075 catch(std::bad_alloc&)
8076 {
8077 return gl::error(GL_OUT_OF_MEMORY);
8078 }
8079}
8080
8081void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
8082{
8083 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
8084
8085 try
8086 {
8087 gl::Context *context = gl::getNonLostContext();
8088
8089 if (context)
8090 {
8091 if (context->getClientVersion() < 3)
8092 {
8093 return gl::error(GL_INVALID_OPERATION);
8094 }
8095 }
8096
8097 UNIMPLEMENTED();
8098 }
8099 catch(std::bad_alloc&)
8100 {
8101 return gl::error(GL_OUT_OF_MEMORY);
8102 }
8103}
8104
8105void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
8106{
8107 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
8108
8109 try
8110 {
8111 gl::Context *context = gl::getNonLostContext();
8112
8113 if (context)
8114 {
8115 if (context->getClientVersion() < 3)
8116 {
8117 return gl::error(GL_INVALID_OPERATION);
8118 }
8119 }
8120
8121 UNIMPLEMENTED();
8122 }
8123 catch(std::bad_alloc&)
8124 {
8125 return gl::error(GL_OUT_OF_MEMORY);
8126 }
8127}
8128
8129GLboolean __stdcall glUnmapBuffer(GLenum target)
8130{
8131 EVENT("(GLenum target = 0x%X)", target);
8132
8133 try
8134 {
8135 gl::Context *context = gl::getNonLostContext();
8136
8137 if (context)
8138 {
8139 if (context->getClientVersion() < 3)
8140 {
8141 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8142 }
8143 }
8144
8145 UNIMPLEMENTED();
8146 }
8147 catch(std::bad_alloc&)
8148 {
8149 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8150 }
8151
8152 return GL_FALSE;
8153}
8154
8155void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8156{
8157 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8158
8159 try
8160 {
8161 gl::Context *context = gl::getNonLostContext();
8162
8163 if (context)
8164 {
8165 if (context->getClientVersion() < 3)
8166 {
8167 return gl::error(GL_INVALID_OPERATION);
8168 }
8169 }
8170
8171 UNIMPLEMENTED();
8172 }
8173 catch(std::bad_alloc&)
8174 {
8175 return gl::error(GL_OUT_OF_MEMORY);
8176 }
8177}
8178
8179void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8180{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008181 try
8182 {
8183 gl::Context *context = gl::getNonLostContext();
8184
8185 if (context)
8186 {
8187 if (context->getClientVersion() < 3)
8188 {
8189 return gl::error(GL_INVALID_OPERATION);
8190 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008191
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008192 glDrawBuffersEXT(n, bufs);
8193 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008194 }
8195 catch(std::bad_alloc&)
8196 {
8197 return gl::error(GL_OUT_OF_MEMORY);
8198 }
8199}
8200
8201void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8202{
8203 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8204 location, count, transpose, value);
8205
8206 try
8207 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008208 if (count < 0)
8209 {
8210 return gl::error(GL_INVALID_VALUE);
8211 }
8212
8213 if (location == -1)
8214 {
8215 return;
8216 }
8217
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008218 gl::Context *context = gl::getNonLostContext();
8219
8220 if (context)
8221 {
8222 if (context->getClientVersion() < 3)
8223 {
8224 return gl::error(GL_INVALID_OPERATION);
8225 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008226
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008227 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8228 if (!programBinary)
8229 {
8230 return gl::error(GL_INVALID_OPERATION);
8231 }
8232
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008233 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008234 {
8235 return gl::error(GL_INVALID_OPERATION);
8236 }
8237 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008238 }
8239 catch(std::bad_alloc&)
8240 {
8241 return gl::error(GL_OUT_OF_MEMORY);
8242 }
8243}
8244
8245void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8246{
8247 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8248 location, count, transpose, value);
8249
8250 try
8251 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008252 if (count < 0)
8253 {
8254 return gl::error(GL_INVALID_VALUE);
8255 }
8256
8257 if (location == -1)
8258 {
8259 return;
8260 }
8261
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008262 gl::Context *context = gl::getNonLostContext();
8263
8264 if (context)
8265 {
8266 if (context->getClientVersion() < 3)
8267 {
8268 return gl::error(GL_INVALID_OPERATION);
8269 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008270
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008271 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8272 if (!programBinary)
8273 {
8274 return gl::error(GL_INVALID_OPERATION);
8275 }
8276
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008277 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008278 {
8279 return gl::error(GL_INVALID_OPERATION);
8280 }
8281 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008282 }
8283 catch(std::bad_alloc&)
8284 {
8285 return gl::error(GL_OUT_OF_MEMORY);
8286 }
8287}
8288
8289void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8290{
8291 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8292 location, count, transpose, value);
8293
8294 try
8295 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008296 if (count < 0)
8297 {
8298 return gl::error(GL_INVALID_VALUE);
8299 }
8300
8301 if (location == -1)
8302 {
8303 return;
8304 }
8305
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008306 gl::Context *context = gl::getNonLostContext();
8307
8308 if (context)
8309 {
8310 if (context->getClientVersion() < 3)
8311 {
8312 return gl::error(GL_INVALID_OPERATION);
8313 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008314
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008315 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8316 if (!programBinary)
8317 {
8318 return gl::error(GL_INVALID_OPERATION);
8319 }
8320
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008321 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008322 {
8323 return gl::error(GL_INVALID_OPERATION);
8324 }
8325 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008326 }
8327 catch(std::bad_alloc&)
8328 {
8329 return gl::error(GL_OUT_OF_MEMORY);
8330 }
8331}
8332
8333void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8334{
8335 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8336 location, count, transpose, value);
8337
8338 try
8339 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008340 if (count < 0)
8341 {
8342 return gl::error(GL_INVALID_VALUE);
8343 }
8344
8345 if (location == -1)
8346 {
8347 return;
8348 }
8349
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008350 gl::Context *context = gl::getNonLostContext();
8351
8352 if (context)
8353 {
8354 if (context->getClientVersion() < 3)
8355 {
8356 return gl::error(GL_INVALID_OPERATION);
8357 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008358
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008359 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8360 if (!programBinary)
8361 {
8362 return gl::error(GL_INVALID_OPERATION);
8363 }
8364
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008365 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008366 {
8367 return gl::error(GL_INVALID_OPERATION);
8368 }
8369 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008370 }
8371 catch(std::bad_alloc&)
8372 {
8373 return gl::error(GL_OUT_OF_MEMORY);
8374 }
8375}
8376
8377void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8378{
8379 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8380 location, count, transpose, value);
8381
8382 try
8383 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008384 if (count < 0)
8385 {
8386 return gl::error(GL_INVALID_VALUE);
8387 }
8388
8389 if (location == -1)
8390 {
8391 return;
8392 }
8393
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008394 gl::Context *context = gl::getNonLostContext();
8395
8396 if (context)
8397 {
8398 if (context->getClientVersion() < 3)
8399 {
8400 return gl::error(GL_INVALID_OPERATION);
8401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008402
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008403 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8404 if (!programBinary)
8405 {
8406 return gl::error(GL_INVALID_OPERATION);
8407 }
8408
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008409 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008410 {
8411 return gl::error(GL_INVALID_OPERATION);
8412 }
8413 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008414 }
8415 catch(std::bad_alloc&)
8416 {
8417 return gl::error(GL_OUT_OF_MEMORY);
8418 }
8419}
8420
8421void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8422{
8423 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8424 location, count, transpose, value);
8425
8426 try
8427 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008428 if (count < 0)
8429 {
8430 return gl::error(GL_INVALID_VALUE);
8431 }
8432
8433 if (location == -1)
8434 {
8435 return;
8436 }
8437
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008438 gl::Context *context = gl::getNonLostContext();
8439
8440 if (context)
8441 {
8442 if (context->getClientVersion() < 3)
8443 {
8444 return gl::error(GL_INVALID_OPERATION);
8445 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008446
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008447 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8448 if (!programBinary)
8449 {
8450 return gl::error(GL_INVALID_OPERATION);
8451 }
8452
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008453 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008454 {
8455 return gl::error(GL_INVALID_OPERATION);
8456 }
8457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008458 }
8459 catch(std::bad_alloc&)
8460 {
8461 return gl::error(GL_OUT_OF_MEMORY);
8462 }
8463}
8464
8465void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8466{
8467 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8468 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8469 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8470
8471 try
8472 {
8473 gl::Context *context = gl::getNonLostContext();
8474
8475 if (context)
8476 {
8477 if (context->getClientVersion() < 3)
8478 {
8479 return gl::error(GL_INVALID_OPERATION);
8480 }
8481 }
8482
8483 UNIMPLEMENTED();
8484 }
8485 catch(std::bad_alloc&)
8486 {
8487 return gl::error(GL_OUT_OF_MEMORY);
8488 }
8489}
8490
8491void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8492{
8493 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8494 target, samples, internalformat, width, height);
8495
8496 try
8497 {
8498 gl::Context *context = gl::getNonLostContext();
8499
8500 if (context)
8501 {
8502 if (context->getClientVersion() < 3)
8503 {
8504 return gl::error(GL_INVALID_OPERATION);
8505 }
8506 }
8507
8508 UNIMPLEMENTED();
8509 }
8510 catch(std::bad_alloc&)
8511 {
8512 return gl::error(GL_OUT_OF_MEMORY);
8513 }
8514}
8515
8516void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8517{
8518 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8519 target, attachment, texture, level, layer);
8520
8521 try
8522 {
8523 gl::Context *context = gl::getNonLostContext();
8524
8525 if (context)
8526 {
8527 if (context->getClientVersion() < 3)
8528 {
8529 return gl::error(GL_INVALID_OPERATION);
8530 }
8531 }
8532
8533 UNIMPLEMENTED();
8534 }
8535 catch(std::bad_alloc&)
8536 {
8537 return gl::error(GL_OUT_OF_MEMORY);
8538 }
8539}
8540
8541GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8542{
8543 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8544 target, offset, length, access);
8545
8546 try
8547 {
8548 gl::Context *context = gl::getNonLostContext();
8549
8550 if (context)
8551 {
8552 if (context->getClientVersion() < 3)
8553 {
8554 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8555 }
8556 }
8557
8558 UNIMPLEMENTED();
8559 }
8560 catch(std::bad_alloc&)
8561 {
8562 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8563 }
8564
8565 return NULL;
8566}
8567
8568void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8569{
8570 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8571
8572 try
8573 {
8574 gl::Context *context = gl::getNonLostContext();
8575
8576 if (context)
8577 {
8578 if (context->getClientVersion() < 3)
8579 {
8580 return gl::error(GL_INVALID_OPERATION);
8581 }
8582 }
8583
8584 UNIMPLEMENTED();
8585 }
8586 catch(std::bad_alloc&)
8587 {
8588 return gl::error(GL_OUT_OF_MEMORY);
8589 }
8590}
8591
8592void __stdcall glBindVertexArray(GLuint array)
8593{
8594 EVENT("(GLuint array = %u)", array);
8595
8596 try
8597 {
8598 gl::Context *context = gl::getNonLostContext();
8599
8600 if (context)
8601 {
8602 if (context->getClientVersion() < 3)
8603 {
8604 return gl::error(GL_INVALID_OPERATION);
8605 }
8606 }
8607
8608 UNIMPLEMENTED();
8609 }
8610 catch(std::bad_alloc&)
8611 {
8612 return gl::error(GL_OUT_OF_MEMORY);
8613 }
8614}
8615
8616void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8617{
8618 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8619
8620 try
8621 {
8622 gl::Context *context = gl::getNonLostContext();
8623
8624 if (context)
8625 {
8626 if (context->getClientVersion() < 3)
8627 {
8628 return gl::error(GL_INVALID_OPERATION);
8629 }
8630 }
8631
8632 UNIMPLEMENTED();
8633 }
8634 catch(std::bad_alloc&)
8635 {
8636 return gl::error(GL_OUT_OF_MEMORY);
8637 }
8638}
8639
8640void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8641{
8642 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8643
8644 try
8645 {
8646 gl::Context *context = gl::getNonLostContext();
8647
8648 if (context)
8649 {
8650 if (context->getClientVersion() < 3)
8651 {
8652 return gl::error(GL_INVALID_OPERATION);
8653 }
8654 }
8655
8656 UNIMPLEMENTED();
8657 }
8658 catch(std::bad_alloc&)
8659 {
8660 return gl::error(GL_OUT_OF_MEMORY);
8661 }
8662}
8663
8664GLboolean __stdcall glIsVertexArray(GLuint array)
8665{
8666 EVENT("(GLuint array = %u)", array);
8667
8668 try
8669 {
8670 gl::Context *context = gl::getNonLostContext();
8671
8672 if (context)
8673 {
8674 if (context->getClientVersion() < 3)
8675 {
8676 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8677 }
8678 }
8679
8680 UNIMPLEMENTED();
8681 }
8682 catch(std::bad_alloc&)
8683 {
8684 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8685 }
8686
8687 return GL_FALSE;
8688}
8689
8690void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8691{
8692 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8693 target, index, data);
8694
8695 try
8696 {
8697 gl::Context *context = gl::getNonLostContext();
8698
8699 if (context)
8700 {
8701 if (context->getClientVersion() < 3)
8702 {
8703 return gl::error(GL_INVALID_OPERATION);
8704 }
8705 }
8706
8707 UNIMPLEMENTED();
8708 }
8709 catch(std::bad_alloc&)
8710 {
8711 return gl::error(GL_OUT_OF_MEMORY);
8712 }
8713}
8714
8715void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8716{
8717 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8718
8719 try
8720 {
8721 gl::Context *context = gl::getNonLostContext();
8722
8723 if (context)
8724 {
8725 if (context->getClientVersion() < 3)
8726 {
8727 return gl::error(GL_INVALID_OPERATION);
8728 }
8729 }
8730
8731 UNIMPLEMENTED();
8732 }
8733 catch(std::bad_alloc&)
8734 {
8735 return gl::error(GL_OUT_OF_MEMORY);
8736 }
8737}
8738
8739void __stdcall glEndTransformFeedback(void)
8740{
8741 EVENT("(void)");
8742
8743 try
8744 {
8745 gl::Context *context = gl::getNonLostContext();
8746
8747 if (context)
8748 {
8749 if (context->getClientVersion() < 3)
8750 {
8751 return gl::error(GL_INVALID_OPERATION);
8752 }
8753 }
8754
8755 UNIMPLEMENTED();
8756 }
8757 catch(std::bad_alloc&)
8758 {
8759 return gl::error(GL_OUT_OF_MEMORY);
8760 }
8761}
8762
8763void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8764{
8765 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8766 target, index, buffer, offset, size);
8767
8768 try
8769 {
8770 gl::Context *context = gl::getNonLostContext();
8771
8772 if (context)
8773 {
8774 if (context->getClientVersion() < 3)
8775 {
8776 return gl::error(GL_INVALID_OPERATION);
8777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008778
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008779 switch (target)
8780 {
8781 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008782 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008783 {
8784 return gl::error(GL_INVALID_VALUE);
8785 }
8786 break;
8787
8788 case GL_UNIFORM_BUFFER:
8789 if (index >= context->getMaximumCombinedUniformBufferBindings())
8790 {
8791 return gl::error(GL_INVALID_VALUE);
8792 }
8793 break;
8794
8795 default:
8796 return gl::error(GL_INVALID_ENUM);
8797 }
8798
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008799 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008800 {
8801 return gl::error(GL_INVALID_VALUE);
8802 }
8803
8804 switch (target)
8805 {
8806 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008807
8808 // size and offset must be a multiple of 4
8809 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8810 {
8811 return gl::error(GL_INVALID_VALUE);
8812 }
8813
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008814 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8815 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008816 break;
8817
8818 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008819
8820 // it is an error to bind an offset not a multiple of the alignment
8821 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8822 {
8823 return gl::error(GL_INVALID_VALUE);
8824 }
8825
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008826 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8827 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008828 break;
8829
8830 default:
8831 UNREACHABLE();
8832 }
8833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008834 }
8835 catch(std::bad_alloc&)
8836 {
8837 return gl::error(GL_OUT_OF_MEMORY);
8838 }
8839}
8840
8841void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8842{
8843 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8844 target, index, buffer);
8845
8846 try
8847 {
8848 gl::Context *context = gl::getNonLostContext();
8849
8850 if (context)
8851 {
8852 if (context->getClientVersion() < 3)
8853 {
8854 return gl::error(GL_INVALID_OPERATION);
8855 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008856
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008857 switch (target)
8858 {
8859 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008860 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008861 {
8862 return gl::error(GL_INVALID_VALUE);
8863 }
8864 break;
8865
8866 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008867 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008868 {
8869 return gl::error(GL_INVALID_VALUE);
8870 }
8871 break;
8872
8873 default:
8874 return gl::error(GL_INVALID_ENUM);
8875 }
8876
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008877 switch (target)
8878 {
8879 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008880 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008881 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008882 break;
8883
8884 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008885 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008886 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008887 break;
8888
8889 default:
8890 UNREACHABLE();
8891 }
8892 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008893 }
8894 catch(std::bad_alloc&)
8895 {
8896 return gl::error(GL_OUT_OF_MEMORY);
8897 }
8898}
8899
8900void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8901{
8902 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8903 program, count, varyings, bufferMode);
8904
8905 try
8906 {
8907 gl::Context *context = gl::getNonLostContext();
8908
8909 if (context)
8910 {
8911 if (context->getClientVersion() < 3)
8912 {
8913 return gl::error(GL_INVALID_OPERATION);
8914 }
8915 }
8916
8917 UNIMPLEMENTED();
8918 }
8919 catch(std::bad_alloc&)
8920 {
8921 return gl::error(GL_OUT_OF_MEMORY);
8922 }
8923}
8924
8925void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8926{
8927 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8928 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8929 program, index, bufSize, length, size, type, name);
8930
8931 try
8932 {
8933 gl::Context *context = gl::getNonLostContext();
8934
8935 if (context)
8936 {
8937 if (context->getClientVersion() < 3)
8938 {
8939 return gl::error(GL_INVALID_OPERATION);
8940 }
8941 }
8942
8943 UNIMPLEMENTED();
8944 }
8945 catch(std::bad_alloc&)
8946 {
8947 return gl::error(GL_OUT_OF_MEMORY);
8948 }
8949}
8950
8951void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8952{
8953 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8954 index, size, type, stride, pointer);
8955
8956 try
8957 {
8958 gl::Context *context = gl::getNonLostContext();
8959
8960 if (context)
8961 {
8962 if (context->getClientVersion() < 3)
8963 {
8964 return gl::error(GL_INVALID_OPERATION);
8965 }
8966 }
8967
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008968 if (index >= gl::MAX_VERTEX_ATTRIBS)
8969 {
8970 return gl::error(GL_INVALID_VALUE);
8971 }
8972
8973 if (size < 1 || size > 4)
8974 {
8975 return gl::error(GL_INVALID_VALUE);
8976 }
8977
8978 switch (type)
8979 {
8980 case GL_BYTE:
8981 case GL_UNSIGNED_BYTE:
8982 case GL_SHORT:
8983 case GL_UNSIGNED_SHORT:
8984 case GL_INT:
8985 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008986 case GL_INT_2_10_10_10_REV:
8987 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008988 break;
8989 default:
8990 return gl::error(GL_INVALID_ENUM);
8991 }
8992
8993 if (stride < 0)
8994 {
8995 return gl::error(GL_INVALID_VALUE);
8996 }
8997
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008998 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8999 {
9000 return gl::error(GL_INVALID_OPERATION);
9001 }
9002
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009003 if (context)
9004 {
9005 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
9006 stride, pointer);
9007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009008 }
9009 catch(std::bad_alloc&)
9010 {
9011 return gl::error(GL_OUT_OF_MEMORY);
9012 }
9013}
9014
9015void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
9016{
9017 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9018 index, pname, params);
9019
9020 try
9021 {
9022 gl::Context *context = gl::getNonLostContext();
9023
9024 if (context)
9025 {
9026 if (context->getClientVersion() < 3)
9027 {
9028 return gl::error(GL_INVALID_OPERATION);
9029 }
9030 }
9031
9032 UNIMPLEMENTED();
9033 }
9034 catch(std::bad_alloc&)
9035 {
9036 return gl::error(GL_OUT_OF_MEMORY);
9037 }
9038}
9039
9040void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
9041{
9042 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
9043 index, pname, params);
9044
9045 try
9046 {
9047 gl::Context *context = gl::getNonLostContext();
9048
9049 if (context)
9050 {
9051 if (context->getClientVersion() < 3)
9052 {
9053 return gl::error(GL_INVALID_OPERATION);
9054 }
9055 }
9056
9057 UNIMPLEMENTED();
9058 }
9059 catch(std::bad_alloc&)
9060 {
9061 return gl::error(GL_OUT_OF_MEMORY);
9062 }
9063}
9064
9065void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
9066{
9067 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
9068 index, x, y, z, w);
9069
9070 try
9071 {
9072 gl::Context *context = gl::getNonLostContext();
9073
9074 if (context)
9075 {
9076 if (context->getClientVersion() < 3)
9077 {
9078 return gl::error(GL_INVALID_OPERATION);
9079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009080
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009081 if (index >= gl::MAX_VERTEX_ATTRIBS)
9082 {
9083 return gl::error(GL_INVALID_VALUE);
9084 }
9085
9086 GLint vals[4] = { x, y, z, w };
9087 context->setVertexAttribi(index, vals);
9088 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009089 }
9090 catch(std::bad_alloc&)
9091 {
9092 return gl::error(GL_OUT_OF_MEMORY);
9093 }
9094}
9095
9096void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
9097{
9098 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
9099 index, x, y, z, w);
9100
9101 try
9102 {
9103 gl::Context *context = gl::getNonLostContext();
9104
9105 if (context)
9106 {
9107 if (context->getClientVersion() < 3)
9108 {
9109 return gl::error(GL_INVALID_OPERATION);
9110 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009111
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009112 if (index >= gl::MAX_VERTEX_ATTRIBS)
9113 {
9114 return gl::error(GL_INVALID_VALUE);
9115 }
9116
9117 GLuint vals[4] = { x, y, z, w };
9118 context->setVertexAttribu(index, vals);
9119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009120 }
9121 catch(std::bad_alloc&)
9122 {
9123 return gl::error(GL_OUT_OF_MEMORY);
9124 }
9125}
9126
9127void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9128{
9129 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9130
9131 try
9132 {
9133 gl::Context *context = gl::getNonLostContext();
9134
9135 if (context)
9136 {
9137 if (context->getClientVersion() < 3)
9138 {
9139 return gl::error(GL_INVALID_OPERATION);
9140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009141
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009142 if (index >= gl::MAX_VERTEX_ATTRIBS)
9143 {
9144 return gl::error(GL_INVALID_VALUE);
9145 }
9146
9147 context->setVertexAttribi(index, v);
9148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009149 }
9150 catch(std::bad_alloc&)
9151 {
9152 return gl::error(GL_OUT_OF_MEMORY);
9153 }
9154}
9155
9156void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9157{
9158 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9159
9160 try
9161 {
9162 gl::Context *context = gl::getNonLostContext();
9163
9164 if (context)
9165 {
9166 if (context->getClientVersion() < 3)
9167 {
9168 return gl::error(GL_INVALID_OPERATION);
9169 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009170
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009171 if (index >= gl::MAX_VERTEX_ATTRIBS)
9172 {
9173 return gl::error(GL_INVALID_VALUE);
9174 }
9175
9176 context->setVertexAttribu(index, v);
9177 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009178 }
9179 catch(std::bad_alloc&)
9180 {
9181 return gl::error(GL_OUT_OF_MEMORY);
9182 }
9183}
9184
9185void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9186{
9187 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9188 program, location, params);
9189
9190 try
9191 {
9192 gl::Context *context = gl::getNonLostContext();
9193
9194 if (context)
9195 {
9196 if (context->getClientVersion() < 3)
9197 {
9198 return gl::error(GL_INVALID_OPERATION);
9199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009200
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009201 if (program == 0)
9202 {
9203 return gl::error(GL_INVALID_VALUE);
9204 }
9205
9206 gl::Program *programObject = context->getProgram(program);
9207
9208 if (!programObject || !programObject->isLinked())
9209 {
9210 return gl::error(GL_INVALID_OPERATION);
9211 }
9212
9213 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9214 if (!programBinary)
9215 {
9216 return gl::error(GL_INVALID_OPERATION);
9217 }
9218
9219 if (!programBinary->getUniformuiv(location, NULL, params))
9220 {
9221 return gl::error(GL_INVALID_OPERATION);
9222 }
9223 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009224 }
9225 catch(std::bad_alloc&)
9226 {
9227 return gl::error(GL_OUT_OF_MEMORY);
9228 }
9229}
9230
9231GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9232{
9233 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9234 program, name);
9235
9236 try
9237 {
9238 gl::Context *context = gl::getNonLostContext();
9239
9240 if (context)
9241 {
9242 if (context->getClientVersion() < 3)
9243 {
9244 return gl::error(GL_INVALID_OPERATION, 0);
9245 }
9246 }
9247
9248 UNIMPLEMENTED();
9249 }
9250 catch(std::bad_alloc&)
9251 {
9252 return gl::error(GL_OUT_OF_MEMORY, 0);
9253 }
9254
9255 return 0;
9256}
9257
9258void __stdcall glUniform1ui(GLint location, GLuint v0)
9259{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009260 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009261}
9262
9263void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9264{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009265 const GLuint xy[] = { v0, v1 };
9266 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009267}
9268
9269void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9270{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009271 const GLuint xyz[] = { v0, v1, v2 };
9272 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009273}
9274
9275void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9276{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009277 const GLuint xyzw[] = { v0, v1, v2, v3 };
9278 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009279}
9280
9281void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9282{
9283 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9284 location, count, value);
9285
9286 try
9287 {
9288 gl::Context *context = gl::getNonLostContext();
9289
9290 if (context)
9291 {
9292 if (context->getClientVersion() < 3)
9293 {
9294 return gl::error(GL_INVALID_OPERATION);
9295 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009296
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009297 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9298 if (!programBinary)
9299 {
9300 return gl::error(GL_INVALID_OPERATION);
9301 }
9302
9303 if (!programBinary->setUniform1uiv(location, count, value))
9304 {
9305 return gl::error(GL_INVALID_OPERATION);
9306 }
9307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308 }
9309 catch(std::bad_alloc&)
9310 {
9311 return gl::error(GL_OUT_OF_MEMORY);
9312 }
9313}
9314
9315void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9316{
9317 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9318 location, count, value);
9319
9320 try
9321 {
9322 gl::Context *context = gl::getNonLostContext();
9323
9324 if (context)
9325 {
9326 if (context->getClientVersion() < 3)
9327 {
9328 return gl::error(GL_INVALID_OPERATION);
9329 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009330
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009331 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9332 if (!programBinary)
9333 {
9334 return gl::error(GL_INVALID_OPERATION);
9335 }
9336
9337 if (!programBinary->setUniform2uiv(location, count, value))
9338 {
9339 return gl::error(GL_INVALID_OPERATION);
9340 }
9341 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009342 }
9343 catch(std::bad_alloc&)
9344 {
9345 return gl::error(GL_OUT_OF_MEMORY);
9346 }
9347}
9348
9349void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9350{
9351 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9352 location, count, value);
9353
9354 try
9355 {
9356 gl::Context *context = gl::getNonLostContext();
9357
9358 if (context)
9359 {
9360 if (context->getClientVersion() < 3)
9361 {
9362 return gl::error(GL_INVALID_OPERATION);
9363 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009364
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009365 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9366 if (!programBinary)
9367 {
9368 return gl::error(GL_INVALID_OPERATION);
9369 }
9370
9371 if (!programBinary->setUniform3uiv(location, count, value))
9372 {
9373 return gl::error(GL_INVALID_OPERATION);
9374 }
9375 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009376 }
9377 catch(std::bad_alloc&)
9378 {
9379 return gl::error(GL_OUT_OF_MEMORY);
9380 }
9381}
9382
9383void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9384{
9385 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9386 location, count, value);
9387
9388 try
9389 {
9390 gl::Context *context = gl::getNonLostContext();
9391
9392 if (context)
9393 {
9394 if (context->getClientVersion() < 3)
9395 {
9396 return gl::error(GL_INVALID_OPERATION);
9397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009398
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009399 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9400 if (!programBinary)
9401 {
9402 return gl::error(GL_INVALID_OPERATION);
9403 }
9404
9405 if (!programBinary->setUniform4uiv(location, count, value))
9406 {
9407 return gl::error(GL_INVALID_OPERATION);
9408 }
9409 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009410 }
9411 catch(std::bad_alloc&)
9412 {
9413 return gl::error(GL_OUT_OF_MEMORY);
9414 }
9415}
9416
9417void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9418{
9419 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9420 buffer, drawbuffer, value);
9421
9422 try
9423 {
9424 gl::Context *context = gl::getNonLostContext();
9425
9426 if (context)
9427 {
9428 if (context->getClientVersion() < 3)
9429 {
9430 return gl::error(GL_INVALID_OPERATION);
9431 }
9432 }
9433
9434 UNIMPLEMENTED();
9435 }
9436 catch(std::bad_alloc&)
9437 {
9438 return gl::error(GL_OUT_OF_MEMORY);
9439 }
9440}
9441
9442void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9443{
9444 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9445 buffer, drawbuffer, value);
9446
9447 try
9448 {
9449 gl::Context *context = gl::getNonLostContext();
9450
9451 if (context)
9452 {
9453 if (context->getClientVersion() < 3)
9454 {
9455 return gl::error(GL_INVALID_OPERATION);
9456 }
9457 }
9458
9459 UNIMPLEMENTED();
9460 }
9461 catch(std::bad_alloc&)
9462 {
9463 return gl::error(GL_OUT_OF_MEMORY);
9464 }
9465}
9466
9467void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9468{
9469 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9470 buffer, drawbuffer, value);
9471
9472 try
9473 {
9474 gl::Context *context = gl::getNonLostContext();
9475
9476 if (context)
9477 {
9478 if (context->getClientVersion() < 3)
9479 {
9480 return gl::error(GL_INVALID_OPERATION);
9481 }
9482 }
9483
9484 UNIMPLEMENTED();
9485 }
9486 catch(std::bad_alloc&)
9487 {
9488 return gl::error(GL_OUT_OF_MEMORY);
9489 }
9490}
9491
9492void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9493{
9494 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9495 buffer, drawbuffer, depth, stencil);
9496
9497 try
9498 {
9499 gl::Context *context = gl::getNonLostContext();
9500
9501 if (context)
9502 {
9503 if (context->getClientVersion() < 3)
9504 {
9505 return gl::error(GL_INVALID_OPERATION);
9506 }
9507 }
9508
9509 UNIMPLEMENTED();
9510 }
9511 catch(std::bad_alloc&)
9512 {
9513 return gl::error(GL_OUT_OF_MEMORY);
9514 }
9515}
9516
9517const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9518{
9519 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9520
9521 try
9522 {
9523 gl::Context *context = gl::getNonLostContext();
9524
9525 if (context)
9526 {
9527 if (context->getClientVersion() < 3)
9528 {
9529 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009531
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009532 if (name != GL_EXTENSIONS)
9533 {
9534 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9535 }
9536
9537 if (index >= context->getNumExtensions())
9538 {
9539 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9540 }
9541
9542 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9543 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009544 }
9545 catch(std::bad_alloc&)
9546 {
9547 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9548 }
9549
9550 return NULL;
9551}
9552
9553void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9554{
9555 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9556 readTarget, writeTarget, readOffset, writeOffset, size);
9557
9558 try
9559 {
9560 gl::Context *context = gl::getNonLostContext();
9561
9562 if (context)
9563 {
9564 if (context->getClientVersion() < 3)
9565 {
9566 return gl::error(GL_INVALID_OPERATION);
9567 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009568
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009569 gl::Buffer *readBuffer = NULL;
9570 switch (readTarget)
9571 {
9572 case GL_ARRAY_BUFFER:
9573 readBuffer = context->getArrayBuffer();
9574 break;
9575 case GL_COPY_READ_BUFFER:
9576 readBuffer = context->getCopyReadBuffer();
9577 break;
9578 case GL_COPY_WRITE_BUFFER:
9579 readBuffer = context->getCopyWriteBuffer();
9580 break;
9581 case GL_ELEMENT_ARRAY_BUFFER:
9582 readBuffer = context->getElementArrayBuffer();
9583 break;
9584 case GL_PIXEL_PACK_BUFFER:
9585 readBuffer = context->getPixelPackBuffer();
9586 break;
9587 case GL_PIXEL_UNPACK_BUFFER:
9588 readBuffer = context->getPixelUnpackBuffer();
9589 break;
9590 case GL_TRANSFORM_FEEDBACK_BUFFER:
9591 readBuffer = context->getGenericTransformFeedbackBuffer();
9592 break;
9593 case GL_UNIFORM_BUFFER:
9594 readBuffer = context->getGenericUniformBuffer();
9595 break;
9596 default:
9597 return gl::error(GL_INVALID_ENUM);
9598 }
9599
9600 gl::Buffer *writeBuffer = NULL;
9601 switch (writeTarget)
9602 {
9603 case GL_ARRAY_BUFFER:
9604 writeBuffer = context->getArrayBuffer();
9605 break;
9606 case GL_COPY_READ_BUFFER:
9607 writeBuffer = context->getCopyReadBuffer();
9608 break;
9609 case GL_COPY_WRITE_BUFFER:
9610 writeBuffer = context->getCopyWriteBuffer();
9611 break;
9612 case GL_ELEMENT_ARRAY_BUFFER:
9613 writeBuffer = context->getElementArrayBuffer();
9614 break;
9615 case GL_PIXEL_PACK_BUFFER:
9616 writeBuffer = context->getPixelPackBuffer();
9617 break;
9618 case GL_PIXEL_UNPACK_BUFFER:
9619 writeBuffer = context->getPixelUnpackBuffer();
9620 break;
9621 case GL_TRANSFORM_FEEDBACK_BUFFER:
9622 writeBuffer = context->getGenericTransformFeedbackBuffer();
9623 break;
9624 case GL_UNIFORM_BUFFER:
9625 writeBuffer = context->getGenericUniformBuffer();
9626 break;
9627 default:
9628 return gl::error(GL_INVALID_ENUM);
9629 }
9630
9631 if (!readBuffer || !writeBuffer)
9632 {
9633 return gl::error(GL_INVALID_OPERATION);
9634 }
9635
9636 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9637 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9638 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9639 {
9640 return gl::error(GL_INVALID_VALUE);
9641 }
9642
9643 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9644 {
9645 return gl::error(GL_INVALID_VALUE);
9646 }
9647
9648 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9649
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009650 // if size is zero, the copy is a successful no-op
9651 if (size > 0)
9652 {
9653 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9654 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009655 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009656 }
9657 catch(std::bad_alloc&)
9658 {
9659 return gl::error(GL_OUT_OF_MEMORY);
9660 }
9661}
9662
9663void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9664{
9665 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9666 program, uniformCount, uniformNames, uniformIndices);
9667
9668 try
9669 {
9670 gl::Context *context = gl::getNonLostContext();
9671
9672 if (context)
9673 {
9674 if (context->getClientVersion() < 3)
9675 {
9676 return gl::error(GL_INVALID_OPERATION);
9677 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009678
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009679 if (uniformCount < 0)
9680 {
9681 return gl::error(GL_INVALID_VALUE);
9682 }
9683
9684 gl::Program *programObject = context->getProgram(program);
9685
9686 if (!programObject)
9687 {
9688 if (context->getShader(program))
9689 {
9690 return gl::error(GL_INVALID_OPERATION);
9691 }
9692 else
9693 {
9694 return gl::error(GL_INVALID_VALUE);
9695 }
9696 }
9697
9698 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9699 if (!programObject->isLinked() || !programBinary)
9700 {
9701 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9702 {
9703 uniformIndices[uniformId] = GL_INVALID_INDEX;
9704 }
9705 }
9706 else
9707 {
9708 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9709 {
9710 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9711 }
9712 }
9713 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009714 }
9715 catch(std::bad_alloc&)
9716 {
9717 return gl::error(GL_OUT_OF_MEMORY);
9718 }
9719}
9720
9721void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9722{
9723 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9724 program, uniformCount, uniformIndices, pname, params);
9725
9726 try
9727 {
9728 gl::Context *context = gl::getNonLostContext();
9729
9730 if (context)
9731 {
9732 if (context->getClientVersion() < 3)
9733 {
9734 return gl::error(GL_INVALID_OPERATION);
9735 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009736
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009737 if (uniformCount < 0)
9738 {
9739 return gl::error(GL_INVALID_VALUE);
9740 }
9741
9742 gl::Program *programObject = context->getProgram(program);
9743
9744 if (!programObject)
9745 {
9746 if (context->getShader(program))
9747 {
9748 return gl::error(GL_INVALID_OPERATION);
9749 }
9750 else
9751 {
9752 return gl::error(GL_INVALID_VALUE);
9753 }
9754 }
9755
9756 switch (pname)
9757 {
9758 case GL_UNIFORM_TYPE:
9759 case GL_UNIFORM_SIZE:
9760 case GL_UNIFORM_NAME_LENGTH:
9761 case GL_UNIFORM_BLOCK_INDEX:
9762 case GL_UNIFORM_OFFSET:
9763 case GL_UNIFORM_ARRAY_STRIDE:
9764 case GL_UNIFORM_MATRIX_STRIDE:
9765 case GL_UNIFORM_IS_ROW_MAJOR:
9766 break;
9767 default:
9768 return gl::error(GL_INVALID_ENUM);
9769 }
9770
9771 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9772
9773 if (!programBinary && uniformCount > 0)
9774 {
9775 return gl::error(GL_INVALID_VALUE);
9776 }
9777
9778 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9779 {
9780 const GLuint index = uniformIndices[uniformId];
9781
9782 if (index >= (GLuint)programBinary->getActiveUniformCount())
9783 {
9784 return gl::error(GL_INVALID_VALUE);
9785 }
9786 }
9787
9788 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9789 {
9790 const GLuint index = uniformIndices[uniformId];
9791 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9792 }
9793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009794 }
9795 catch(std::bad_alloc&)
9796 {
9797 return gl::error(GL_OUT_OF_MEMORY);
9798 }
9799}
9800
9801GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9802{
9803 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9804
9805 try
9806 {
9807 gl::Context *context = gl::getNonLostContext();
9808
9809 if (context)
9810 {
9811 if (context->getClientVersion() < 3)
9812 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009813 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009814 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009815
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009816 gl::Program *programObject = context->getProgram(program);
9817
9818 if (!programObject)
9819 {
9820 if (context->getShader(program))
9821 {
9822 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9823 }
9824 else
9825 {
9826 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9827 }
9828 }
9829
9830 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9831 if (!programBinary)
9832 {
9833 return GL_INVALID_INDEX;
9834 }
9835
9836 return programBinary->getUniformBlockIndex(uniformBlockName);
9837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009838 }
9839 catch(std::bad_alloc&)
9840 {
9841 return gl::error(GL_OUT_OF_MEMORY, 0);
9842 }
9843
9844 return 0;
9845}
9846
9847void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9848{
9849 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9850 program, uniformBlockIndex, pname, params);
9851
9852 try
9853 {
9854 gl::Context *context = gl::getNonLostContext();
9855
9856 if (context)
9857 {
9858 if (context->getClientVersion() < 3)
9859 {
9860 return gl::error(GL_INVALID_OPERATION);
9861 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009862 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009863
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009864 if (!programObject)
9865 {
9866 if (context->getShader(program))
9867 {
9868 return gl::error(GL_INVALID_OPERATION);
9869 }
9870 else
9871 {
9872 return gl::error(GL_INVALID_VALUE);
9873 }
9874 }
9875
9876 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9877
9878 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9879 {
9880 return gl::error(GL_INVALID_VALUE);
9881 }
9882
9883 switch (pname)
9884 {
9885 case GL_UNIFORM_BLOCK_BINDING:
9886 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9887 break;
9888
9889 case GL_UNIFORM_BLOCK_DATA_SIZE:
9890 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9891 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9892 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9893 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9894 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9895 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9896 break;
9897
9898 default:
9899 return gl::error(GL_INVALID_ENUM);
9900 }
9901 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009902 }
9903 catch(std::bad_alloc&)
9904 {
9905 return gl::error(GL_OUT_OF_MEMORY);
9906 }
9907}
9908
9909void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9910{
9911 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9912 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9913
9914 try
9915 {
9916 gl::Context *context = gl::getNonLostContext();
9917
9918 if (context)
9919 {
9920 if (context->getClientVersion() < 3)
9921 {
9922 return gl::error(GL_INVALID_OPERATION);
9923 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009924
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009925 gl::Program *programObject = context->getProgram(program);
9926
9927 if (!programObject)
9928 {
9929 if (context->getShader(program))
9930 {
9931 return gl::error(GL_INVALID_OPERATION);
9932 }
9933 else
9934 {
9935 return gl::error(GL_INVALID_VALUE);
9936 }
9937 }
9938
9939 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9940
9941 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9942 {
9943 return gl::error(GL_INVALID_VALUE);
9944 }
9945
9946 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
9947 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009948 }
9949 catch(std::bad_alloc&)
9950 {
9951 return gl::error(GL_OUT_OF_MEMORY);
9952 }
9953}
9954
9955void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9956{
9957 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9958 program, uniformBlockIndex, uniformBlockBinding);
9959
9960 try
9961 {
9962 gl::Context *context = gl::getNonLostContext();
9963
9964 if (context)
9965 {
9966 if (context->getClientVersion() < 3)
9967 {
9968 return gl::error(GL_INVALID_OPERATION);
9969 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009970
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00009971 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
9972 {
9973 return gl::error(GL_INVALID_VALUE);
9974 }
9975
9976 gl::Program *programObject = context->getProgram(program);
9977
9978 if (!programObject)
9979 {
9980 if (context->getShader(program))
9981 {
9982 return gl::error(GL_INVALID_OPERATION);
9983 }
9984 else
9985 {
9986 return gl::error(GL_INVALID_VALUE);
9987 }
9988 }
9989
9990 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9991
9992 // if never linked, there won't be any uniform blocks
9993 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9994 {
9995 return gl::error(GL_INVALID_VALUE);
9996 }
9997
9998 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9999 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010000 }
10001 catch(std::bad_alloc&)
10002 {
10003 return gl::error(GL_OUT_OF_MEMORY);
10004 }
10005}
10006
10007void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
10008{
10009 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
10010 mode, first, count, instanceCount);
10011
10012 try
10013 {
10014 gl::Context *context = gl::getNonLostContext();
10015
10016 if (context)
10017 {
10018 if (context->getClientVersion() < 3)
10019 {
10020 return gl::error(GL_INVALID_OPERATION);
10021 }
10022 }
10023
10024 UNIMPLEMENTED();
10025 }
10026 catch(std::bad_alloc&)
10027 {
10028 return gl::error(GL_OUT_OF_MEMORY);
10029 }
10030}
10031
10032void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
10033{
10034 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
10035 mode, count, type, indices, instanceCount);
10036
10037 try
10038 {
10039 gl::Context *context = gl::getNonLostContext();
10040
10041 if (context)
10042 {
10043 if (context->getClientVersion() < 3)
10044 {
10045 return gl::error(GL_INVALID_OPERATION);
10046 }
10047 }
10048
10049 UNIMPLEMENTED();
10050 }
10051 catch(std::bad_alloc&)
10052 {
10053 return gl::error(GL_OUT_OF_MEMORY);
10054 }
10055}
10056
10057GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
10058{
10059 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
10060
10061 try
10062 {
10063 gl::Context *context = gl::getNonLostContext();
10064
10065 if (context)
10066 {
10067 if (context->getClientVersion() < 3)
10068 {
10069 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
10070 }
10071 }
10072
10073 UNIMPLEMENTED();
10074 }
10075 catch(std::bad_alloc&)
10076 {
10077 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
10078 }
10079
10080 return NULL;
10081}
10082
10083GLboolean __stdcall glIsSync(GLsync sync)
10084{
10085 EVENT("(GLsync sync = 0x%0.8p)", sync);
10086
10087 try
10088 {
10089 gl::Context *context = gl::getNonLostContext();
10090
10091 if (context)
10092 {
10093 if (context->getClientVersion() < 3)
10094 {
10095 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10096 }
10097 }
10098
10099 UNIMPLEMENTED();
10100 }
10101 catch(std::bad_alloc&)
10102 {
10103 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10104 }
10105
10106 return GL_FALSE;
10107}
10108
10109void __stdcall glDeleteSync(GLsync sync)
10110{
10111 EVENT("(GLsync sync = 0x%0.8p)", sync);
10112
10113 try
10114 {
10115 gl::Context *context = gl::getNonLostContext();
10116
10117 if (context)
10118 {
10119 if (context->getClientVersion() < 3)
10120 {
10121 return gl::error(GL_INVALID_OPERATION);
10122 }
10123 }
10124
10125 UNIMPLEMENTED();
10126 }
10127 catch(std::bad_alloc&)
10128 {
10129 return gl::error(GL_OUT_OF_MEMORY);
10130 }
10131}
10132
10133GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10134{
10135 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10136 sync, flags, timeout);
10137
10138 try
10139 {
10140 gl::Context *context = gl::getNonLostContext();
10141
10142 if (context)
10143 {
10144 if (context->getClientVersion() < 3)
10145 {
10146 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10147 }
10148 }
10149
10150 UNIMPLEMENTED();
10151 }
10152 catch(std::bad_alloc&)
10153 {
10154 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10155 }
10156
10157 return GL_FALSE;
10158}
10159
10160void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10161{
10162 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10163 sync, flags, timeout);
10164
10165 try
10166 {
10167 gl::Context *context = gl::getNonLostContext();
10168
10169 if (context)
10170 {
10171 if (context->getClientVersion() < 3)
10172 {
10173 return gl::error(GL_INVALID_OPERATION);
10174 }
10175 }
10176
10177 UNIMPLEMENTED();
10178 }
10179 catch(std::bad_alloc&)
10180 {
10181 return gl::error(GL_OUT_OF_MEMORY);
10182 }
10183}
10184
10185void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10186{
10187 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10188 pname, params);
10189
10190 try
10191 {
10192 gl::Context *context = gl::getNonLostContext();
10193
10194 if (context)
10195 {
10196 if (context->getClientVersion() < 3)
10197 {
10198 return gl::error(GL_INVALID_OPERATION);
10199 }
10200 }
10201
10202 UNIMPLEMENTED();
10203 }
10204 catch(std::bad_alloc&)
10205 {
10206 return gl::error(GL_OUT_OF_MEMORY);
10207 }
10208}
10209
10210void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10211{
10212 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10213 sync, pname, bufSize, length, values);
10214
10215 try
10216 {
10217 gl::Context *context = gl::getNonLostContext();
10218
10219 if (context)
10220 {
10221 if (context->getClientVersion() < 3)
10222 {
10223 return gl::error(GL_INVALID_OPERATION);
10224 }
10225 }
10226
10227 UNIMPLEMENTED();
10228 }
10229 catch(std::bad_alloc&)
10230 {
10231 return gl::error(GL_OUT_OF_MEMORY);
10232 }
10233}
10234
10235void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10236{
10237 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10238 target, index, data);
10239
10240 try
10241 {
10242 gl::Context *context = gl::getNonLostContext();
10243
10244 if (context)
10245 {
10246 if (context->getClientVersion() < 3)
10247 {
10248 return gl::error(GL_INVALID_OPERATION);
10249 }
10250 }
10251
10252 UNIMPLEMENTED();
10253 }
10254 catch(std::bad_alloc&)
10255 {
10256 return gl::error(GL_OUT_OF_MEMORY);
10257 }
10258}
10259
10260void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10261{
10262 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10263 target, pname, params);
10264
10265 try
10266 {
10267 gl::Context *context = gl::getNonLostContext();
10268
10269 if (context)
10270 {
10271 if (context->getClientVersion() < 3)
10272 {
10273 return gl::error(GL_INVALID_OPERATION);
10274 }
10275 }
10276
10277 UNIMPLEMENTED();
10278 }
10279 catch(std::bad_alloc&)
10280 {
10281 return gl::error(GL_OUT_OF_MEMORY);
10282 }
10283}
10284
10285void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10286{
10287 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10288
10289 try
10290 {
10291 gl::Context *context = gl::getNonLostContext();
10292
10293 if (context)
10294 {
10295 if (context->getClientVersion() < 3)
10296 {
10297 return gl::error(GL_INVALID_OPERATION);
10298 }
10299 }
10300
10301 UNIMPLEMENTED();
10302 }
10303 catch(std::bad_alloc&)
10304 {
10305 return gl::error(GL_OUT_OF_MEMORY);
10306 }
10307}
10308
10309void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10310{
10311 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10312
10313 try
10314 {
10315 gl::Context *context = gl::getNonLostContext();
10316
10317 if (context)
10318 {
10319 if (context->getClientVersion() < 3)
10320 {
10321 return gl::error(GL_INVALID_OPERATION);
10322 }
10323 }
10324
10325 UNIMPLEMENTED();
10326 }
10327 catch(std::bad_alloc&)
10328 {
10329 return gl::error(GL_OUT_OF_MEMORY);
10330 }
10331}
10332
10333GLboolean __stdcall glIsSampler(GLuint sampler)
10334{
10335 EVENT("(GLuint sampler = %u)", sampler);
10336
10337 try
10338 {
10339 gl::Context *context = gl::getNonLostContext();
10340
10341 if (context)
10342 {
10343 if (context->getClientVersion() < 3)
10344 {
10345 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10346 }
10347 }
10348
10349 UNIMPLEMENTED();
10350 }
10351 catch(std::bad_alloc&)
10352 {
10353 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10354 }
10355
10356 return GL_FALSE;
10357}
10358
10359void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10360{
10361 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10362
10363 try
10364 {
10365 gl::Context *context = gl::getNonLostContext();
10366
10367 if (context)
10368 {
10369 if (context->getClientVersion() < 3)
10370 {
10371 return gl::error(GL_INVALID_OPERATION);
10372 }
10373 }
10374
10375 UNIMPLEMENTED();
10376 }
10377 catch(std::bad_alloc&)
10378 {
10379 return gl::error(GL_OUT_OF_MEMORY);
10380 }
10381}
10382
10383void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10384{
10385 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10386
10387 try
10388 {
10389 gl::Context *context = gl::getNonLostContext();
10390
10391 if (context)
10392 {
10393 if (context->getClientVersion() < 3)
10394 {
10395 return gl::error(GL_INVALID_OPERATION);
10396 }
10397 }
10398
10399 UNIMPLEMENTED();
10400 }
10401 catch(std::bad_alloc&)
10402 {
10403 return gl::error(GL_OUT_OF_MEMORY);
10404 }
10405}
10406
10407void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10408{
10409 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10410 sampler, pname, param);
10411
10412 try
10413 {
10414 gl::Context *context = gl::getNonLostContext();
10415
10416 if (context)
10417 {
10418 if (context->getClientVersion() < 3)
10419 {
10420 return gl::error(GL_INVALID_OPERATION);
10421 }
10422 }
10423
10424 UNIMPLEMENTED();
10425 }
10426 catch(std::bad_alloc&)
10427 {
10428 return gl::error(GL_OUT_OF_MEMORY);
10429 }
10430}
10431
10432void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10433{
10434 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10435
10436 try
10437 {
10438 gl::Context *context = gl::getNonLostContext();
10439
10440 if (context)
10441 {
10442 if (context->getClientVersion() < 3)
10443 {
10444 return gl::error(GL_INVALID_OPERATION);
10445 }
10446 }
10447
10448 UNIMPLEMENTED();
10449 }
10450 catch(std::bad_alloc&)
10451 {
10452 return gl::error(GL_OUT_OF_MEMORY);
10453 }
10454}
10455
10456void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10457{
10458 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10459
10460 try
10461 {
10462 gl::Context *context = gl::getNonLostContext();
10463
10464 if (context)
10465 {
10466 if (context->getClientVersion() < 3)
10467 {
10468 return gl::error(GL_INVALID_OPERATION);
10469 }
10470 }
10471
10472 UNIMPLEMENTED();
10473 }
10474 catch(std::bad_alloc&)
10475 {
10476 return gl::error(GL_OUT_OF_MEMORY);
10477 }
10478}
10479
10480void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10481{
10482 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10483
10484 try
10485 {
10486 gl::Context *context = gl::getNonLostContext();
10487
10488 if (context)
10489 {
10490 if (context->getClientVersion() < 3)
10491 {
10492 return gl::error(GL_INVALID_OPERATION);
10493 }
10494 }
10495
10496 UNIMPLEMENTED();
10497 }
10498 catch(std::bad_alloc&)
10499 {
10500 return gl::error(GL_OUT_OF_MEMORY);
10501 }
10502}
10503
10504void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10505{
10506 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10507
10508 try
10509 {
10510 gl::Context *context = gl::getNonLostContext();
10511
10512 if (context)
10513 {
10514 if (context->getClientVersion() < 3)
10515 {
10516 return gl::error(GL_INVALID_OPERATION);
10517 }
10518 }
10519
10520 UNIMPLEMENTED();
10521 }
10522 catch(std::bad_alloc&)
10523 {
10524 return gl::error(GL_OUT_OF_MEMORY);
10525 }
10526}
10527
10528void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10529{
10530 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10531
10532 try
10533 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010534 if (index >= gl::MAX_VERTEX_ATTRIBS)
10535 {
10536 return gl::error(GL_INVALID_VALUE);
10537 }
10538
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010539 gl::Context *context = gl::getNonLostContext();
10540
10541 if (context)
10542 {
10543 if (context->getClientVersion() < 3)
10544 {
10545 return gl::error(GL_INVALID_OPERATION);
10546 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010547
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010548 context->setVertexAttribDivisor(index, divisor);
10549 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010550 }
10551 catch(std::bad_alloc&)
10552 {
10553 return gl::error(GL_OUT_OF_MEMORY);
10554 }
10555}
10556
10557void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10558{
10559 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10560
10561 try
10562 {
10563 gl::Context *context = gl::getNonLostContext();
10564
10565 if (context)
10566 {
10567 if (context->getClientVersion() < 3)
10568 {
10569 return gl::error(GL_INVALID_OPERATION);
10570 }
10571 }
10572
10573 UNIMPLEMENTED();
10574 }
10575 catch(std::bad_alloc&)
10576 {
10577 return gl::error(GL_OUT_OF_MEMORY);
10578 }
10579}
10580
10581void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10582{
10583 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10584
10585 try
10586 {
10587 gl::Context *context = gl::getNonLostContext();
10588
10589 if (context)
10590 {
10591 if (context->getClientVersion() < 3)
10592 {
10593 return gl::error(GL_INVALID_OPERATION);
10594 }
10595 }
10596
10597 UNIMPLEMENTED();
10598 }
10599 catch(std::bad_alloc&)
10600 {
10601 return gl::error(GL_OUT_OF_MEMORY);
10602 }
10603}
10604
10605void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10606{
10607 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10608
10609 try
10610 {
10611 gl::Context *context = gl::getNonLostContext();
10612
10613 if (context)
10614 {
10615 if (context->getClientVersion() < 3)
10616 {
10617 return gl::error(GL_INVALID_OPERATION);
10618 }
10619 }
10620
10621 UNIMPLEMENTED();
10622 }
10623 catch(std::bad_alloc&)
10624 {
10625 return gl::error(GL_OUT_OF_MEMORY);
10626 }
10627}
10628
10629GLboolean __stdcall glIsTransformFeedback(GLuint id)
10630{
10631 EVENT("(GLuint id = %u)", id);
10632
10633 try
10634 {
10635 gl::Context *context = gl::getNonLostContext();
10636
10637 if (context)
10638 {
10639 if (context->getClientVersion() < 3)
10640 {
10641 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10642 }
10643 }
10644
10645 UNIMPLEMENTED();
10646 }
10647 catch(std::bad_alloc&)
10648 {
10649 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10650 }
10651
10652 return GL_FALSE;
10653}
10654
10655void __stdcall glPauseTransformFeedback(void)
10656{
10657 EVENT("(void)");
10658
10659 try
10660 {
10661 gl::Context *context = gl::getNonLostContext();
10662
10663 if (context)
10664 {
10665 if (context->getClientVersion() < 3)
10666 {
10667 return gl::error(GL_INVALID_OPERATION);
10668 }
10669 }
10670
10671 UNIMPLEMENTED();
10672 }
10673 catch(std::bad_alloc&)
10674 {
10675 return gl::error(GL_OUT_OF_MEMORY);
10676 }
10677}
10678
10679void __stdcall glResumeTransformFeedback(void)
10680{
10681 EVENT("(void)");
10682
10683 try
10684 {
10685 gl::Context *context = gl::getNonLostContext();
10686
10687 if (context)
10688 {
10689 if (context->getClientVersion() < 3)
10690 {
10691 return gl::error(GL_INVALID_OPERATION);
10692 }
10693 }
10694
10695 UNIMPLEMENTED();
10696 }
10697 catch(std::bad_alloc&)
10698 {
10699 return gl::error(GL_OUT_OF_MEMORY);
10700 }
10701}
10702
10703void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10704{
10705 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10706 program, bufSize, length, binaryFormat, binary);
10707
10708 try
10709 {
10710 gl::Context *context = gl::getNonLostContext();
10711
10712 if (context)
10713 {
10714 if (context->getClientVersion() < 3)
10715 {
10716 return gl::error(GL_INVALID_OPERATION);
10717 }
10718 }
10719
10720 UNIMPLEMENTED();
10721 }
10722 catch(std::bad_alloc&)
10723 {
10724 return gl::error(GL_OUT_OF_MEMORY);
10725 }
10726}
10727
10728void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10729{
10730 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10731 program, binaryFormat, binary, length);
10732
10733 try
10734 {
10735 gl::Context *context = gl::getNonLostContext();
10736
10737 if (context)
10738 {
10739 if (context->getClientVersion() < 3)
10740 {
10741 return gl::error(GL_INVALID_OPERATION);
10742 }
10743 }
10744
10745 UNIMPLEMENTED();
10746 }
10747 catch(std::bad_alloc&)
10748 {
10749 return gl::error(GL_OUT_OF_MEMORY);
10750 }
10751}
10752
10753void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10754{
10755 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10756 program, pname, value);
10757
10758 try
10759 {
10760 gl::Context *context = gl::getNonLostContext();
10761
10762 if (context)
10763 {
10764 if (context->getClientVersion() < 3)
10765 {
10766 return gl::error(GL_INVALID_OPERATION);
10767 }
10768 }
10769
10770 UNIMPLEMENTED();
10771 }
10772 catch(std::bad_alloc&)
10773 {
10774 return gl::error(GL_OUT_OF_MEMORY);
10775 }
10776}
10777
10778void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10779{
10780 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10781 target, numAttachments, attachments);
10782
10783 try
10784 {
10785 gl::Context *context = gl::getNonLostContext();
10786
10787 if (context)
10788 {
10789 if (context->getClientVersion() < 3)
10790 {
10791 return gl::error(GL_INVALID_OPERATION);
10792 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010793
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010794 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10795 {
10796 return;
10797 }
10798
10799 int maxDimension = context->getMaximumRenderbufferDimension();
10800 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010802 }
10803 catch(std::bad_alloc&)
10804 {
10805 return gl::error(GL_OUT_OF_MEMORY);
10806 }
10807}
10808
10809void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10810{
10811 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10812 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10813 target, numAttachments, attachments, x, y, width, height);
10814
10815 try
10816 {
10817 gl::Context *context = gl::getNonLostContext();
10818
10819 if (context)
10820 {
10821 if (context->getClientVersion() < 3)
10822 {
10823 return gl::error(GL_INVALID_OPERATION);
10824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010825
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010826 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10827 {
10828 return;
10829 }
10830
10831 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10832 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010833 }
10834 catch(std::bad_alloc&)
10835 {
10836 return gl::error(GL_OUT_OF_MEMORY);
10837 }
10838}
10839
10840void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10841{
10842 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10843 target, levels, internalformat, width, height);
10844
10845 try
10846 {
10847 gl::Context *context = gl::getNonLostContext();
10848
10849 if (context)
10850 {
10851 if (context->getClientVersion() < 3)
10852 {
10853 return gl::error(GL_INVALID_OPERATION);
10854 }
10855 }
10856
10857 UNIMPLEMENTED();
10858 }
10859 catch(std::bad_alloc&)
10860 {
10861 return gl::error(GL_OUT_OF_MEMORY);
10862 }
10863}
10864
10865void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10866{
10867 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10868 "GLsizei height = %d, GLsizei depth = %d)",
10869 target, levels, internalformat, width, height, depth);
10870
10871 try
10872 {
10873 gl::Context *context = gl::getNonLostContext();
10874
10875 if (context)
10876 {
10877 if (context->getClientVersion() < 3)
10878 {
10879 return gl::error(GL_INVALID_OPERATION);
10880 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010882 }
10883 catch(std::bad_alloc&)
10884 {
10885 return gl::error(GL_OUT_OF_MEMORY);
10886 }
10887}
10888
10889void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10890{
10891 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10892 "GLint* params = 0x%0.8p)",
10893 target, internalformat, pname, bufSize, params);
10894
10895 try
10896 {
10897 gl::Context *context = gl::getNonLostContext();
10898
10899 if (context)
10900 {
10901 if (context->getClientVersion() < 3)
10902 {
10903 return gl::error(GL_INVALID_OPERATION);
10904 }
10905 }
10906
10907 UNIMPLEMENTED();
10908 }
10909 catch(std::bad_alloc&)
10910 {
10911 return gl::error(GL_OUT_OF_MEMORY);
10912 }
10913}
10914
10915// Extension functions
10916
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010917void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10918 GLbitfield mask, GLenum filter)
10919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010920 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010921 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10922 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10923 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10924
10925 try
10926 {
10927 switch (filter)
10928 {
10929 case GL_NEAREST:
10930 break;
10931 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010932 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010933 }
10934
10935 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010937 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010938 }
10939
10940 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10941 {
10942 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010944 }
10945
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010946 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010947
10948 if (context)
10949 {
10950 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10951 {
10952 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010953 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010954 }
10955
10956 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10957 }
10958 }
10959 catch(std::bad_alloc&)
10960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010962 }
10963}
10964
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010965void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10966 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010967{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010968 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010969 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010970 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010971 target, level, internalformat, width, height, depth, border, format, type, pixels);
10972
10973 try
10974 {
10975 UNIMPLEMENTED(); // FIXME
10976 }
10977 catch(std::bad_alloc&)
10978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010979 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010980 }
10981}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010982
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010983void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10984 GLenum *binaryFormat, void *binary)
10985{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010986 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 +000010987 program, bufSize, length, binaryFormat, binary);
10988
10989 try
10990 {
10991 gl::Context *context = gl::getNonLostContext();
10992
10993 if (context)
10994 {
10995 gl::Program *programObject = context->getProgram(program);
10996
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010997 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010999 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011000 }
11001
11002 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
11003
11004 if (!programBinary)
11005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011006 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011007 }
11008
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011009 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011011 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011012 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011013
11014 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011015 }
11016 }
11017 catch(std::bad_alloc&)
11018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011019 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011020 }
11021}
11022
11023void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
11024 const void *binary, GLint length)
11025{
11026 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
11027 program, binaryFormat, binary, length);
11028
11029 try
11030 {
11031 gl::Context *context = gl::getNonLostContext();
11032
11033 if (context)
11034 {
11035 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
11036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011037 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011038 }
11039
11040 gl::Program *programObject = context->getProgram(program);
11041
11042 if (!programObject)
11043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011044 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011045 }
11046
daniel@transgaming.com95d29422012-07-24 18:36:10 +000011047 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011048 }
11049 }
11050 catch(std::bad_alloc&)
11051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011052 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011053 }
11054}
11055
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011056void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
11057{
11058 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
11059
11060 try
11061 {
11062 gl::Context *context = gl::getNonLostContext();
11063
11064 if (context)
11065 {
11066 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
11067 {
11068 return gl::error(GL_INVALID_VALUE);
11069 }
11070
11071 if (context->getDrawFramebufferHandle() == 0)
11072 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011073 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011074 {
11075 return gl::error(GL_INVALID_OPERATION);
11076 }
11077
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011078 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011079 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011080 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011081 }
11082 }
11083 else
11084 {
11085 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11086 {
11087 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
11088 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
11089 {
11090 return gl::error(GL_INVALID_OPERATION);
11091 }
11092 }
11093 }
11094
11095 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
11096
11097 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11098 {
11099 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
11100 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011101
11102 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
11103 {
11104 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
11105 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011106 }
11107 }
11108 catch (std::bad_alloc&)
11109 {
11110 return gl::error(GL_OUT_OF_MEMORY);
11111 }
11112}
11113
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011114__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
11115{
11116 struct Extension
11117 {
11118 const char *name;
11119 __eglMustCastToProperFunctionPointerType address;
11120 };
11121
11122 static const Extension glExtensions[] =
11123 {
11124 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011125 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011126 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011127 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11128 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11129 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11130 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11131 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11132 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11133 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011134 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011135 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011136 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11137 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11138 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11139 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011140 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11141 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11142 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11143 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11144 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11145 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11146 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011147 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011148 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11149 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11150 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011151 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11152 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011153
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011154 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011155 {
11156 if (strcmp(procname, glExtensions[ext].name) == 0)
11157 {
11158 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11159 }
11160 }
11161
11162 return NULL;
11163}
11164
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011165// Non-public functions used by EGL
11166
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011167bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011168{
11169 EVENT("(egl::Surface* surface = 0x%0.8p)",
11170 surface);
11171
11172 try
11173 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011174 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011175
11176 if (context)
11177 {
11178 gl::Texture2D *textureObject = context->getTexture2D();
11179
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011180 if (textureObject->isImmutable())
11181 {
11182 return false;
11183 }
11184
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011185 if (textureObject)
11186 {
11187 textureObject->bindTexImage(surface);
11188 }
11189 }
11190 }
11191 catch(std::bad_alloc&)
11192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011193 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011194 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011195
11196 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011197}
11198
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011199}