blob: 77a0855cd39dec2d57f9c6794f8019710666dd7c [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"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height, GLsizei depth)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000025{
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000026 if (level < 0 || width < 0 || height < 0 || depth < 0)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000027 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000041 if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000042 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000225bool validateES3TexImageFormat(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
226 GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
227 GLint border, GLenum format, GLenum type)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000228{
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000229 // Validate image size
230 if (level < 0 || width < 0 || height < 0 || depth < 0 )
231 {
232 return gl::error(GL_INVALID_VALUE, false);
233 }
234
235 if (isCompressed)
236 {
237 if (width != 1 && width != 2 && width % 4 != 0)
238 {
239 return gl::error(GL_INVALID_OPERATION, false);
240 }
241
242 if (height != 1 && height != 2 && height % 4 != 0)
243 {
244 return gl::error(GL_INVALID_OPERATION, false);
245 }
246 }
247
248 // Verify zero border
249 if (border != 0)
250 {
251 return gl::error(GL_INVALID_VALUE, false);
252 }
253
254 // Validate dimensions based on Context limits and validate the texture
255 if (level > context->getMaximumTextureLevel())
256 {
257 return gl::error(GL_INVALID_VALUE, false);
258 }
259
260 gl::Texture *texture = NULL;
261 bool textureCompressed = false;
262 GLenum textureInternalFormat = GL_NONE;
263 GLint textureLevelWidth = 0;
264 GLint textureLevelHeight = 0;
265 GLint textureLevelDepth = 0;
266 switch (target)
267 {
268 case GL_TEXTURE_2D:
269 {
270 if (width > (context->getMaximum2DTextureDimension() >> level) ||
271 height > (context->getMaximum2DTextureDimension() >> level))
272 {
273 return gl::error(GL_INVALID_VALUE, false);
274 }
275
276 gl::Texture2D *texture2d = context->getTexture2D();
277 if (texture2d)
278 {
279 textureCompressed = texture2d->isCompressed(level);
280 textureInternalFormat = texture2d->getInternalFormat(level);
281 textureLevelWidth = texture2d->getWidth(level);
282 textureLevelHeight = texture2d->getHeight(level);
283 textureLevelDepth = 1;
284 texture = texture2d;
285 }
286 }
287 break;
288
289 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
290 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
291 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
292 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
293 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
294 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
295 {
296 if (width != height)
297 {
298 return gl::error(GL_INVALID_VALUE, false);
299 }
300
301 if (width > (context->getMaximumCubeTextureDimension() >> level))
302 {
303 return gl::error(GL_INVALID_VALUE, false);
304 }
305
306 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
307 if (textureCube)
308 {
309 textureCompressed = textureCube->isCompressed(target, level);
310 textureInternalFormat = textureCube->getInternalFormat(target, level);
311 textureLevelWidth = textureCube->getWidth(target, level);
312 textureLevelHeight = textureCube->getHeight(target, level);
313 textureLevelDepth = 1;
314 texture = textureCube;
315 }
316 }
317 break;
318
319 case GL_TEXTURE_3D:
320 {
321 if (width > (context->getMaximum3DTextureDimension() >> level) ||
322 height > (context->getMaximum3DTextureDimension() >> level) ||
323 depth > (context->getMaximum3DTextureDimension() >> level))
324 {
325 return gl::error(GL_INVALID_VALUE, false);
326 }
327
328 gl::Texture3D *texture3d = context->getTexture3D();
329 if (texture3d)
330 {
331 textureCompressed = texture3d->isCompressed(level);
332 textureInternalFormat = texture3d->getInternalFormat(level);
333 textureLevelWidth = texture3d->getWidth(level);
334 textureLevelHeight = texture3d->getHeight(level);
335 textureLevelDepth = texture3d->getDepth(level);
336 texture = texture3d;
337 }
338 }
339 break;
340
341 default:
342 return gl::error(GL_INVALID_ENUM, false);
343 }
344
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000345 if (!texture)
346 {
347 return gl::error(GL_INVALID_OPERATION, false);
348 }
349
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000350 if (texture->isImmutable())
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000351 {
352 return gl::error(GL_INVALID_OPERATION, false);
353 }
354
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000355 // Validate texture formats
356 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
357 if (isCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000358 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000359 if (!gl::IsValidES3CompressedFormat(actualInternalFormat))
360 {
361 return gl::error(GL_INVALID_ENUM, false);
362 }
363
364 if (target == GL_TEXTURE_3D)
365 {
366 return gl::error(GL_INVALID_OPERATION, false);
367 }
368 }
369 else
370 {
371 GLenum err;
372 if (!gl::IsValidES3FormatCombination(actualInternalFormat, format, type, &err))
373 {
374 return gl::error(err, false);
375 }
376
377 if ((target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) &&
378 (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000379 {
380 return gl::error(GL_INVALID_OPERATION, false);
381 }
382 }
383
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000384 // Validate sub image parameters
385 if (isSubImage)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000386 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000387 if (isCompressed != textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000388 {
389 return gl::error(GL_INVALID_OPERATION, false);
390 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000391
392 if (format != GL_NONE)
393 {
394 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
395 if (internalformat != textureInternalFormat)
396 {
397 return gl::error(GL_INVALID_OPERATION, false);
398 }
399 }
400
401 if (isCompressed)
402 {
403 if ((width % 4 != 0 && width != textureLevelWidth) ||
404 (height % 4 != 0 && height != textureLevelHeight))
405 {
406 return gl::error(GL_INVALID_OPERATION, false);
407 }
408 }
409
410 if (width == 0 || height == 0 || depth == 0)
411 {
412 return false;
413 }
414
415 if (xoffset < 0 || yoffset < 0 || zoffset < 0)
416 {
417 return gl::error(GL_INVALID_VALUE, false);
418 }
419
420 if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
421 std::numeric_limits<GLsizei>::max() - yoffset < height ||
422 std::numeric_limits<GLsizei>::max() - zoffset < depth)
423 {
424 return gl::error(GL_INVALID_VALUE, false);
425 }
426
427 if (xoffset + width > textureLevelWidth ||
428 yoffset + height > textureLevelHeight ||
429 zoffset + depth > textureLevelDepth)
430 {
431 return gl::error(GL_INVALID_VALUE, false);
432 }
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000433 }
434
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000435 return true;
436}
437
438bool validateCopyTexImageParameters(gl::Context *context, GLenum target, bool isCompressed, GLint level,
439 GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
440 GLsizei width, GLsizei height)
441{
442 if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000443 {
444 return gl::error(GL_INVALID_VALUE, false);
445 }
446
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000447 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
448 {
449 return gl::error(GL_INVALID_VALUE, false);
450 }
451
452 if (width == 0 || height == 0)
453 {
454 return false;
455 }
456
457 if (level > context->getMaximumTextureLevel())
458 {
459 return gl::error(GL_INVALID_VALUE, false);
460 }
461
462 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
463
464 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
465 {
466 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
467 }
468
469 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
470 {
471 return gl::error(GL_INVALID_OPERATION, false);
472 }
473
474 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
475 GLenum colorbufferFormat = source->getInternalFormat();
476 gl::Texture *texture = NULL;
477 GLenum textureFormat = GL_RGBA;
478 bool textureCompressed = false;
479 GLint textureLevelWidth = 0;
480 GLint textureLevelHeight = 0;
481 GLint textureLevelDepth = 0;
482 switch (target)
483 {
484 case GL_TEXTURE_2D:
485 {
486 gl::Texture2D *texture2d = context->getTexture2D();
487 if (texture2d)
488 {
489 textureFormat = gl::ExtractFormat(texture2d->getInternalFormat(level));
490 textureCompressed = texture2d->isCompressed(level);
491 textureLevelWidth = texture2d->getWidth(level);
492 textureLevelHeight = texture2d->getHeight(level);
493 textureLevelDepth = 1;
494 texture = texture2d;
495 }
496 }
497 break;
498
499 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
500 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
501 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
502 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
503 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
504 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
505 {
506 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
507 if (textureCube)
508 {
509 textureFormat = gl::ExtractFormat(textureCube->getInternalFormat(target, level));
510 textureCompressed = textureCube->isCompressed(target, level);
511 textureLevelWidth = textureCube->getWidth(target, level);
512 textureLevelHeight = textureCube->getHeight(target, level);
513 textureLevelDepth = 1;
514 texture = textureCube;
515 }
516 }
517 break;
518
519 case GL_TEXTURE_3D:
520 {
521 gl::Texture3D *texture3d = context->getTexture3D();
522 if (texture3d)
523 {
524 textureFormat = gl::ExtractFormat(texture3d->getInternalFormat(level));
525 textureCompressed = texture3d->isCompressed(level);
526 textureLevelWidth = texture3d->getWidth(level);
527 textureLevelHeight = texture3d->getHeight(level);
528 textureLevelDepth = texture3d->getDepth(level);
529 texture = texture3d;
530 }
531 }
532 break;
533
534 default:
535 return gl::error(GL_INVALID_ENUM, false);
536 }
537
538 if (!texture)
539 {
540 return gl::error(GL_INVALID_OPERATION, false);
541 }
542
543 if (isCompressed != textureCompressed)
544 {
545 return gl::error(GL_INVALID_OPERATION, false);
546 }
547
548 if (isCompressed)
549 {
550 if ((width % 4 != 0 && width != textureLevelWidth) ||
551 (height % 4 != 0 && height != textureLevelHeight))
552 {
553 return gl::error(GL_INVALID_OPERATION, false);
554 }
555 }
556
557 if (xoffset + width > textureLevelWidth ||
558 yoffset + height > textureLevelHeight ||
559 zoffset >= textureLevelDepth)
560 {
561 return gl::error(GL_INVALID_VALUE, false);
562 }
563
564 if (!gl::IsValidES3CopyTexImageCombination(textureFormat, colorbufferFormat))
565 {
566 return gl::error(GL_INVALID_OPERATION, false);
567 }
568
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000569 return true;
570}
571
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000572// check for combinations of format and type that are valid for ReadPixels
573bool validReadFormatType(GLenum format, GLenum type)
574{
575 switch (format)
576 {
577 case GL_RGBA:
578 switch (type)
579 {
580 case GL_UNSIGNED_BYTE:
581 break;
582 default:
583 return false;
584 }
585 break;
586 case GL_BGRA_EXT:
587 switch (type)
588 {
589 case GL_UNSIGNED_BYTE:
590 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
591 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
592 break;
593 default:
594 return false;
595 }
596 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000597 default:
598 return false;
599 }
600 return true;
601}
602
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000603extern "C"
604{
605
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000606// OpenGL ES 2.0 functions
607
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000608void __stdcall glActiveTexture(GLenum texture)
609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000610 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000611
612 try
613 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000615
616 if (context)
617 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000618 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000621 }
622
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000623 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000624 }
625 }
626 catch(std::bad_alloc&)
627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000629 }
630}
631
632void __stdcall glAttachShader(GLuint program, GLuint shader)
633{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000634 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000635
636 try
637 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000639
640 if (context)
641 {
642 gl::Program *programObject = context->getProgram(program);
643 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000644
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000645 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000647 if (context->getShader(program))
648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000650 }
651 else
652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000653 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000654 }
655 }
656
657 if (!shaderObject)
658 {
659 if (context->getProgram(shader))
660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000661 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000662 }
663 else
664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000665 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000666 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000667 }
668
669 if (!programObject->attachShader(shaderObject))
670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000672 }
673 }
674 }
675 catch(std::bad_alloc&)
676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000677 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000678 }
679}
680
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000681void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
682{
683 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
684
685 try
686 {
687 switch (target)
688 {
689 case GL_ANY_SAMPLES_PASSED_EXT:
690 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
691 break;
692 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000693 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000694 }
695
696 if (id == 0)
697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000699 }
700
701 gl::Context *context = gl::getNonLostContext();
702
703 if (context)
704 {
705 context->beginQuery(target, id);
706 }
707 }
708 catch(std::bad_alloc&)
709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000711 }
712}
713
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000714void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000716 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717
718 try
719 {
720 if (index >= gl::MAX_VERTEX_ATTRIBS)
721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000722 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000723 }
724
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000725 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000726
727 if (context)
728 {
729 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000730
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000731 if (!programObject)
732 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000733 if (context->getShader(program))
734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000735 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000736 }
737 else
738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000739 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000740 }
741 }
742
743 if (strncmp(name, "gl_", 3) == 0)
744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000745 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746 }
747
748 programObject->bindAttributeLocation(index, name);
749 }
750 }
751 catch(std::bad_alloc&)
752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000753 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754 }
755}
756
757void __stdcall glBindBuffer(GLenum target, GLuint buffer)
758{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000759 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000760
761 try
762 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000764
765 if (context)
766 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000767 // Check ES3 specific targets
768 switch (target)
769 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000770 case GL_COPY_READ_BUFFER:
771 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000772 case GL_PIXEL_PACK_BUFFER:
773 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000774 case GL_UNIFORM_BUFFER:
775 case GL_TRANSFORM_FEEDBACK_BUFFER:
776 if (context->getClientVersion() < 3)
777 {
778 return gl::error(GL_INVALID_ENUM);
779 }
780 }
781
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782 switch (target)
783 {
784 case GL_ARRAY_BUFFER:
785 context->bindArrayBuffer(buffer);
786 return;
787 case GL_ELEMENT_ARRAY_BUFFER:
788 context->bindElementArrayBuffer(buffer);
789 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000790 case GL_COPY_READ_BUFFER:
791 context->bindCopyReadBuffer(buffer);
792 return;
793 case GL_COPY_WRITE_BUFFER:
794 context->bindCopyWriteBuffer(buffer);
795 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000796 case GL_PIXEL_PACK_BUFFER:
797 context->bindPixelPackBuffer(buffer);
798 return;
799 case GL_PIXEL_UNPACK_BUFFER:
800 context->bindPixelUnpackBuffer(buffer);
801 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000802 case GL_UNIFORM_BUFFER:
803 context->bindGenericUniformBuffer(buffer);
804 return;
805 case GL_TRANSFORM_FEEDBACK_BUFFER:
806 context->bindGenericUniformBuffer(buffer);
807 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000808 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810 }
811 }
812 }
813 catch(std::bad_alloc&)
814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000815 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000816 }
817}
818
819void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000821 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000822
823 try
824 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000825 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000827 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000828 }
829
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000830 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000831
832 if (context)
833 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000834 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
835 {
836 context->bindReadFramebuffer(framebuffer);
837 }
838
839 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
840 {
841 context->bindDrawFramebuffer(framebuffer);
842 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000843 }
844 }
845 catch(std::bad_alloc&)
846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000847 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848 }
849}
850
851void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
852{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000853 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000854
855 try
856 {
857 if (target != GL_RENDERBUFFER)
858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000859 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860 }
861
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000862 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000863
864 if (context)
865 {
866 context->bindRenderbuffer(renderbuffer);
867 }
868 }
869 catch(std::bad_alloc&)
870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000871 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872 }
873}
874
875void __stdcall glBindTexture(GLenum target, GLuint texture)
876{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000877 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000878
879 try
880 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882
883 if (context)
884 {
885 gl::Texture *textureObject = context->getTexture(texture);
886
887 if (textureObject && textureObject->getTarget() != target && texture != 0)
888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000889 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000890 }
891
892 switch (target)
893 {
894 case GL_TEXTURE_2D:
895 context->bindTexture2D(texture);
896 return;
897 case GL_TEXTURE_CUBE_MAP:
898 context->bindTextureCubeMap(texture);
899 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000900 case GL_TEXTURE_3D:
901 if (context->getClientVersion() < 3)
902 {
903 return gl::error(GL_INVALID_ENUM);
904 }
905 context->bindTexture3D(texture);
906 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000908 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000909 }
910 }
911 }
912 catch(std::bad_alloc&)
913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915 }
916}
917
918void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000920 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000921 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000922
923 try
924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000925 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000926
927 if (context)
928 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000929 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930 }
931 }
932 catch(std::bad_alloc&)
933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000935 }
936}
937
938void __stdcall glBlendEquation(GLenum mode)
939{
940 glBlendEquationSeparate(mode, mode);
941}
942
943void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
944{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000945 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000946
947 try
948 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000949 gl::Context *context = gl::getNonLostContext();
950
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000951 switch (modeRGB)
952 {
953 case GL_FUNC_ADD:
954 case GL_FUNC_SUBTRACT:
955 case GL_FUNC_REVERSE_SUBTRACT:
956 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000957
958 case GL_MIN:
959 case GL_MAX:
960 if (context && context->getClientVersion() < 3)
961 {
962 return gl::error(GL_INVALID_ENUM);
963 }
964 break;
965
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000966 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000967 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000968 }
969
970 switch (modeAlpha)
971 {
972 case GL_FUNC_ADD:
973 case GL_FUNC_SUBTRACT:
974 case GL_FUNC_REVERSE_SUBTRACT:
975 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000976
977 case GL_MIN:
978 case GL_MAX:
979 if (context && context->getClientVersion() < 3)
980 {
981 return gl::error(GL_INVALID_ENUM);
982 }
983 break;
984
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000985 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000986 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000987 }
988
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000989 if (context)
990 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000991 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000992 }
993 }
994 catch(std::bad_alloc&)
995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000996 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997 }
998}
999
1000void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1001{
1002 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1003}
1004
1005void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1006{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001007 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 +00001008 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001009
1010 try
1011 {
1012 switch (srcRGB)
1013 {
1014 case GL_ZERO:
1015 case GL_ONE:
1016 case GL_SRC_COLOR:
1017 case GL_ONE_MINUS_SRC_COLOR:
1018 case GL_DST_COLOR:
1019 case GL_ONE_MINUS_DST_COLOR:
1020 case GL_SRC_ALPHA:
1021 case GL_ONE_MINUS_SRC_ALPHA:
1022 case GL_DST_ALPHA:
1023 case GL_ONE_MINUS_DST_ALPHA:
1024 case GL_CONSTANT_COLOR:
1025 case GL_ONE_MINUS_CONSTANT_COLOR:
1026 case GL_CONSTANT_ALPHA:
1027 case GL_ONE_MINUS_CONSTANT_ALPHA:
1028 case GL_SRC_ALPHA_SATURATE:
1029 break;
1030 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001031 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001032 }
1033
1034 switch (dstRGB)
1035 {
1036 case GL_ZERO:
1037 case GL_ONE:
1038 case GL_SRC_COLOR:
1039 case GL_ONE_MINUS_SRC_COLOR:
1040 case GL_DST_COLOR:
1041 case GL_ONE_MINUS_DST_COLOR:
1042 case GL_SRC_ALPHA:
1043 case GL_ONE_MINUS_SRC_ALPHA:
1044 case GL_DST_ALPHA:
1045 case GL_ONE_MINUS_DST_ALPHA:
1046 case GL_CONSTANT_COLOR:
1047 case GL_ONE_MINUS_CONSTANT_COLOR:
1048 case GL_CONSTANT_ALPHA:
1049 case GL_ONE_MINUS_CONSTANT_ALPHA:
1050 break;
1051 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001052 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053 }
1054
1055 switch (srcAlpha)
1056 {
1057 case GL_ZERO:
1058 case GL_ONE:
1059 case GL_SRC_COLOR:
1060 case GL_ONE_MINUS_SRC_COLOR:
1061 case GL_DST_COLOR:
1062 case GL_ONE_MINUS_DST_COLOR:
1063 case GL_SRC_ALPHA:
1064 case GL_ONE_MINUS_SRC_ALPHA:
1065 case GL_DST_ALPHA:
1066 case GL_ONE_MINUS_DST_ALPHA:
1067 case GL_CONSTANT_COLOR:
1068 case GL_ONE_MINUS_CONSTANT_COLOR:
1069 case GL_CONSTANT_ALPHA:
1070 case GL_ONE_MINUS_CONSTANT_ALPHA:
1071 case GL_SRC_ALPHA_SATURATE:
1072 break;
1073 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001074 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001075 }
1076
1077 switch (dstAlpha)
1078 {
1079 case GL_ZERO:
1080 case GL_ONE:
1081 case GL_SRC_COLOR:
1082 case GL_ONE_MINUS_SRC_COLOR:
1083 case GL_DST_COLOR:
1084 case GL_ONE_MINUS_DST_COLOR:
1085 case GL_SRC_ALPHA:
1086 case GL_ONE_MINUS_SRC_ALPHA:
1087 case GL_DST_ALPHA:
1088 case GL_ONE_MINUS_DST_ALPHA:
1089 case GL_CONSTANT_COLOR:
1090 case GL_ONE_MINUS_CONSTANT_COLOR:
1091 case GL_CONSTANT_ALPHA:
1092 case GL_ONE_MINUS_CONSTANT_ALPHA:
1093 break;
1094 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001095 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001096 }
1097
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001098 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1099 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1100
1101 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1102 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1103
1104 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001105 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001106 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 +00001107 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001108 }
1109
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111
1112 if (context)
1113 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001114 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001115 }
1116 }
1117 catch(std::bad_alloc&)
1118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001120 }
1121}
1122
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001123void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001124{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001125 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 +00001126 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001127
1128 try
1129 {
1130 if (size < 0)
1131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001132 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001133 }
1134
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001135 gl::Context *context = gl::getNonLostContext();
1136
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001137 switch (usage)
1138 {
1139 case GL_STREAM_DRAW:
1140 case GL_STATIC_DRAW:
1141 case GL_DYNAMIC_DRAW:
1142 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001143
1144 case GL_STREAM_READ:
1145 case GL_STREAM_COPY:
1146 case GL_STATIC_READ:
1147 case GL_STATIC_COPY:
1148 case GL_DYNAMIC_READ:
1149 case GL_DYNAMIC_COPY:
1150 if (context && context->getClientVersion() < 3)
1151 {
1152 return gl::error(GL_INVALID_ENUM);
1153 }
1154 break;
1155
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001157 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 }
1159
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160 if (context)
1161 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001162 // Check ES3 specific targets
1163 switch (target)
1164 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001165 case GL_COPY_READ_BUFFER:
1166 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001167 case GL_PIXEL_PACK_BUFFER:
1168 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001169 case GL_UNIFORM_BUFFER:
1170 case GL_TRANSFORM_FEEDBACK_BUFFER:
1171 if (context->getClientVersion() < 3)
1172 {
1173 return gl::error(GL_INVALID_ENUM);
1174 }
1175 }
1176
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001177 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001178
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001179 switch (target)
1180 {
1181 case GL_ARRAY_BUFFER:
1182 buffer = context->getArrayBuffer();
1183 break;
1184 case GL_ELEMENT_ARRAY_BUFFER:
1185 buffer = context->getElementArrayBuffer();
1186 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001187 case GL_COPY_READ_BUFFER:
1188 buffer = context->getCopyReadBuffer();
1189 break;
1190 case GL_COPY_WRITE_BUFFER:
1191 buffer = context->getCopyWriteBuffer();
1192 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001193 case GL_PIXEL_PACK_BUFFER:
1194 buffer = context->getPixelPackBuffer();
1195 break;
1196 case GL_PIXEL_UNPACK_BUFFER:
1197 buffer = context->getPixelUnpackBuffer();
1198 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001199 case GL_TRANSFORM_FEEDBACK_BUFFER:
1200 buffer = context->getGenericTransformFeedbackBuffer();
1201 break;
1202 case GL_UNIFORM_BUFFER:
1203 buffer = context->getGenericUniformBuffer();
1204 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001205 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001206 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001207 }
1208
1209 if (!buffer)
1210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001211 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001212 }
1213
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001214 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001215 }
1216 }
1217 catch(std::bad_alloc&)
1218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001219 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001220 }
1221}
1222
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001223void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001224{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001225 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 +00001226 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001227
1228 try
1229 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001230 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001232 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 }
1234
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001235 if (data == NULL)
1236 {
1237 return;
1238 }
1239
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001241
1242 if (context)
1243 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001244 // Check ES3 specific targets
1245 switch (target)
1246 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001247 case GL_COPY_READ_BUFFER:
1248 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001249 case GL_PIXEL_PACK_BUFFER:
1250 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001251 case GL_UNIFORM_BUFFER:
1252 case GL_TRANSFORM_FEEDBACK_BUFFER:
1253 if (context->getClientVersion() < 3)
1254 {
1255 return gl::error(GL_INVALID_ENUM);
1256 }
1257 }
1258
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001259 gl::Buffer *buffer;
1260
1261 switch (target)
1262 {
1263 case GL_ARRAY_BUFFER:
1264 buffer = context->getArrayBuffer();
1265 break;
1266 case GL_ELEMENT_ARRAY_BUFFER:
1267 buffer = context->getElementArrayBuffer();
1268 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001269 case GL_COPY_READ_BUFFER:
1270 buffer = context->getCopyReadBuffer();
1271 break;
1272 case GL_COPY_WRITE_BUFFER:
1273 buffer = context->getCopyWriteBuffer();
1274 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001275 case GL_PIXEL_PACK_BUFFER:
1276 buffer = context->getPixelPackBuffer();
1277 break;
1278 case GL_PIXEL_UNPACK_BUFFER:
1279 buffer = context->getPixelUnpackBuffer();
1280 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001281 case GL_TRANSFORM_FEEDBACK_BUFFER:
1282 buffer = context->getGenericTransformFeedbackBuffer();
1283 break;
1284 case GL_UNIFORM_BUFFER:
1285 buffer = context->getGenericUniformBuffer();
1286 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001287 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001288 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001289 }
1290
1291 if (!buffer)
1292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001293 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001294 }
1295
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001296 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001298 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001299 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001300
1301 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001303 }
1304 catch(std::bad_alloc&)
1305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307 }
1308}
1309
1310GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001312 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001313
1314 try
1315 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001316 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001318 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001319 }
1320
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001322
1323 if (context)
1324 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001325 gl::Framebuffer *framebuffer = NULL;
1326 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1327 {
1328 framebuffer = context->getReadFramebuffer();
1329 }
1330 else
1331 {
1332 framebuffer = context->getDrawFramebuffer();
1333 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001334
1335 return framebuffer->completeness();
1336 }
1337 }
1338 catch(std::bad_alloc&)
1339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001340 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001341 }
1342
1343 return 0;
1344}
1345
1346void __stdcall glClear(GLbitfield mask)
1347{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001348 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349
1350 try
1351 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001353
1354 if (context)
1355 {
1356 context->clear(mask);
1357 }
1358 }
1359 catch(std::bad_alloc&)
1360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001362 }
1363}
1364
1365void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001367 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001368 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001369
1370 try
1371 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001373
1374 if (context)
1375 {
1376 context->setClearColor(red, green, blue, alpha);
1377 }
1378 }
1379 catch(std::bad_alloc&)
1380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001381 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382 }
1383}
1384
1385void __stdcall glClearDepthf(GLclampf depth)
1386{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001387 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001388
1389 try
1390 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001391 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392
1393 if (context)
1394 {
1395 context->setClearDepth(depth);
1396 }
1397 }
1398 catch(std::bad_alloc&)
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001401 }
1402}
1403
1404void __stdcall glClearStencil(GLint s)
1405{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001406 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001407
1408 try
1409 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001411
1412 if (context)
1413 {
1414 context->setClearStencil(s);
1415 }
1416 }
1417 catch(std::bad_alloc&)
1418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420 }
1421}
1422
1423void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1424{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001425 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001426 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427
1428 try
1429 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001430 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431
1432 if (context)
1433 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001434 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001435 }
1436 }
1437 catch(std::bad_alloc&)
1438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001439 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440 }
1441}
1442
1443void __stdcall glCompileShader(GLuint shader)
1444{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001445 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446
1447 try
1448 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001449 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450
1451 if (context)
1452 {
1453 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001454
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001455 if (!shaderObject)
1456 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001457 if (context->getProgram(shader))
1458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001460 }
1461 else
1462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001463 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001464 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465 }
1466
1467 shaderObject->compile();
1468 }
1469 }
1470 catch(std::bad_alloc&)
1471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001472 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001473 }
1474}
1475
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001476void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1477 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001479 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001480 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481 target, level, internalformat, width, height, border, imageSize, data);
1482
1483 try
1484 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001485 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001488 }
1489
daniel@transgaming.com01868132010-08-24 19:21:17 +00001490 switch (internalformat)
1491 {
1492 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1493 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001494 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1495 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001496 break;
1497 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001498 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001499 }
1500
1501 if (border != 0)
1502 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001503 return gl::error(GL_INVALID_OPERATION);
1504 }
1505
1506 if (width != 1 && width != 2 && width % 4 != 0)
1507 {
1508 return gl::error(GL_INVALID_OPERATION);
1509 }
1510
1511 if (height != 1 && height != 2 && height % 4 != 0)
1512 {
1513 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001514 }
1515
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001516 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001517
1518 if (context)
1519 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001520 if (level > context->getMaximumTextureLevel())
1521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001522 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001523 }
1524
1525 switch (target)
1526 {
1527 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001528 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1529 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001531 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001532 }
1533 break;
1534 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1535 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1536 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1537 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1538 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1539 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1540 if (width != height)
1541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001542 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001543 }
1544
1545 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1546 height > (context->getMaximumCubeTextureDimension() >> level))
1547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001548 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001549 }
1550 break;
1551 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001553 }
1554
gman@chromium.org50c526d2011-08-10 05:19:44 +00001555 switch (internalformat) {
1556 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1557 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1558 if (!context->supportsDXT1Textures())
1559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001560 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001561 }
1562 break;
1563 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1564 if (!context->supportsDXT3Textures())
1565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001566 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001567 }
1568 break;
1569 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1570 if (!context->supportsDXT5Textures())
1571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001573 }
1574 break;
1575 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001576 }
1577
1578 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001580 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001581 }
1582
1583 if (target == GL_TEXTURE_2D)
1584 {
1585 gl::Texture2D *texture = context->getTexture2D();
1586
1587 if (!texture)
1588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001589 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001590 }
1591
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001592 if (texture->isImmutable())
1593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001594 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001595 }
1596
daniel@transgaming.com01868132010-08-24 19:21:17 +00001597 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1598 }
1599 else
1600 {
1601 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1602
1603 if (!texture)
1604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001605 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001606 }
1607
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001608 if (texture->isImmutable())
1609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001610 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001611 }
1612
daniel@transgaming.com01868132010-08-24 19:21:17 +00001613 switch (target)
1614 {
1615 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1616 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1617 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1618 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1619 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1620 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1621 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1622 break;
1623 default: UNREACHABLE();
1624 }
1625 }
1626 }
1627
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628 }
1629 catch(std::bad_alloc&)
1630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001631 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632 }
1633}
1634
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001635void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1636 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001637{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001638 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001639 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001640 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1642
1643 try
1644 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001645 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001648 }
1649
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001650 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001653 }
1654
daniel@transgaming.com01868132010-08-24 19:21:17 +00001655 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001656 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001657 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1658 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001659 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1660 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001661 break;
1662 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001663 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001664 }
1665
daniel@transgaming.com01868132010-08-24 19:21:17 +00001666 if (width == 0 || height == 0 || data == NULL)
1667 {
1668 return;
1669 }
1670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001671 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001672
1673 if (context)
1674 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001675 if (level > context->getMaximumTextureLevel())
1676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001678 }
1679
gman@chromium.org50c526d2011-08-10 05:19:44 +00001680 switch (format) {
1681 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1682 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1683 if (!context->supportsDXT1Textures())
1684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001686 }
1687 break;
1688 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1689 if (!context->supportsDXT3Textures())
1690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001691 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001692 }
1693 break;
1694 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1695 if (!context->supportsDXT5Textures())
1696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001697 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001698 }
1699 break;
1700 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001701 }
1702
1703 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001706 }
1707
1708 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001710 return gl::error(GL_INVALID_OPERATION); // we wait to check the offsets until this point, because the multiple-of-four restriction
gman@chromium.org50c526d2011-08-10 05:19:44 +00001711 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001712 }
1713
1714 if (target == GL_TEXTURE_2D)
1715 {
1716 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001717 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001718 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001719 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001720 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001721 }
1722 else if (gl::IsCubemapTextureTarget(target))
1723 {
1724 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001725 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001726 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001727 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001728 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001729 }
1730 else
1731 {
1732 UNREACHABLE();
1733 }
1734 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001735 }
1736 catch(std::bad_alloc&)
1737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001739 }
1740}
1741
1742void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001744 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001745 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001746 target, level, internalformat, x, y, width, height, border);
1747
1748 try
1749 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001750 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001752 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001753 }
1754
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001755 if (border != 0)
1756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001757 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001758 }
1759
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001760 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001761
1762 if (context)
1763 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001764 if (level > context->getMaximumTextureLevel())
1765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001767 }
1768
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001769 switch (target)
1770 {
1771 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001772 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1773 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001775 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001776 }
1777 break;
1778 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1779 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1780 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1781 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1782 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1783 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1784 if (width != height)
1785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001787 }
1788
1789 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1790 height > (context->getMaximumCubeTextureDimension() >> level))
1791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001793 }
1794 break;
1795 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001796 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001797 }
1798
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001799 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001800
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001801 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001804 }
1805
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001806 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001808 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001809 }
1810
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001811 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001812 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001813
1814 // [OpenGL ES 2.0.24] table 3.9
1815 switch (internalformat)
1816 {
1817 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001818 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001819 colorbufferFormat != GL_RGBA4 &&
1820 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001821 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001822 colorbufferFormat != GL_RGBA8_OES)
1823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001824 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001825 }
1826 break;
1827 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001828 case GL_RGB:
1829 if (colorbufferFormat != GL_RGB565 &&
1830 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001831 colorbufferFormat != GL_RGBA4 &&
1832 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001833 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001834 colorbufferFormat != GL_RGBA8_OES)
1835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001836 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001837 }
1838 break;
1839 case GL_LUMINANCE_ALPHA:
1840 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001841 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001842 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001843 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001844 colorbufferFormat != GL_RGBA8_OES)
1845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001846 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001847 }
1848 break;
1849 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1850 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001851 if (context->supportsDXT1Textures())
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001854 }
1855 else
1856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001857 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001858 }
1859 break;
1860 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1861 if (context->supportsDXT3Textures())
1862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001863 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001864 }
1865 else
1866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001867 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001868 }
1869 break;
1870 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1871 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001873 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001874 }
1875 else
1876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001877 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001878 }
1879 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001880 case GL_DEPTH_COMPONENT:
1881 case GL_DEPTH_COMPONENT16:
1882 case GL_DEPTH_COMPONENT32_OES:
1883 case GL_DEPTH_STENCIL_OES:
1884 case GL_DEPTH24_STENCIL8_OES:
1885 if (context->supportsDepthTextures())
1886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001887 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001888 }
1889 else
1890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001892 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001893 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001894 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001895 }
1896
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001897 if (target == GL_TEXTURE_2D)
1898 {
1899 gl::Texture2D *texture = context->getTexture2D();
1900
1901 if (!texture)
1902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001903 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001904 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001905
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001906 if (texture->isImmutable())
1907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001908 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001909 }
1910
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001911 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001912 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001913 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001914 {
1915 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1916
1917 if (!texture)
1918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001919 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001920 }
1921
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001922 if (texture->isImmutable())
1923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001924 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001925 }
1926
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001927 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001928 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001929 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001930 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001931 }
1932 catch(std::bad_alloc&)
1933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001935 }
1936}
1937
1938void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001940 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001941 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001942 target, level, xoffset, yoffset, x, y, width, height);
1943
1944 try
1945 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001946 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001949 }
1950
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001951 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 }
1955
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001956 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001958 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001959 }
1960
1961 if (width == 0 || height == 0)
1962 {
1963 return;
1964 }
1965
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001966 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001967
1968 if (context)
1969 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001970 if (level > context->getMaximumTextureLevel())
1971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001972 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001973 }
1974
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001975 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001976
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001977 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001979 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001980 }
1981
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001982 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001984 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001985 }
1986
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001987 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001988 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001989 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001990 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001991
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001992 if (target == GL_TEXTURE_2D)
1993 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001994 gl::Texture2D *tex2d = context->getTexture2D();
1995
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001996 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001997 {
1998 return; // error already registered by validateSubImageParams
1999 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002000 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002001 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002002 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002003 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002004 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002005 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2006
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002007 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002008 {
2009 return; // error already registered by validateSubImageParams
2010 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002011 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002012 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002013 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002014 else UNREACHABLE();
2015
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002016 // [OpenGL ES 2.0.24] table 3.9
2017 switch (textureFormat)
2018 {
2019 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002020 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002021 colorbufferFormat != GL_RGBA4 &&
2022 colorbufferFormat != GL_RGB5_A1 &&
2023 colorbufferFormat != GL_RGBA8_OES)
2024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002025 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002026 }
2027 break;
2028 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002029 case GL_RGB:
2030 if (colorbufferFormat != GL_RGB565 &&
2031 colorbufferFormat != GL_RGB8_OES &&
2032 colorbufferFormat != GL_RGBA4 &&
2033 colorbufferFormat != GL_RGB5_A1 &&
2034 colorbufferFormat != GL_RGBA8_OES)
2035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002036 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002037 }
2038 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002039 case GL_LUMINANCE_ALPHA:
2040 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002041 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002042 colorbufferFormat != GL_RGB5_A1 &&
2043 colorbufferFormat != GL_RGBA8_OES)
2044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002045 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002046 }
2047 break;
2048 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2049 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002050 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2051 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002052 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002053 case GL_DEPTH_COMPONENT:
2054 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002056 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002057 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002058 }
2059
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002060 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002061 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002062 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002063
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002064 catch(std::bad_alloc&)
2065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068}
2069
2070GLuint __stdcall glCreateProgram(void)
2071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002072 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002073
2074 try
2075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002077
2078 if (context)
2079 {
2080 return context->createProgram();
2081 }
2082 }
2083 catch(std::bad_alloc&)
2084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002085 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086 }
2087
2088 return 0;
2089}
2090
2091GLuint __stdcall glCreateShader(GLenum type)
2092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002093 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002094
2095 try
2096 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002098
2099 if (context)
2100 {
2101 switch (type)
2102 {
2103 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002104 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105 return context->createShader(type);
2106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002107 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002108 }
2109 }
2110 }
2111 catch(std::bad_alloc&)
2112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002113 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002114 }
2115
2116 return 0;
2117}
2118
2119void __stdcall glCullFace(GLenum mode)
2120{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002121 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002122
2123 try
2124 {
2125 switch (mode)
2126 {
2127 case GL_FRONT:
2128 case GL_BACK:
2129 case GL_FRONT_AND_BACK:
2130 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002131 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132
2133 if (context)
2134 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002135 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002136 }
2137 }
2138 break;
2139 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002140 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141 }
2142 }
2143 catch(std::bad_alloc&)
2144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002145 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002146 }
2147}
2148
2149void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002151 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002152
2153 try
2154 {
2155 if (n < 0)
2156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002157 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158 }
2159
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002160 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161
2162 if (context)
2163 {
2164 for (int i = 0; i < n; i++)
2165 {
2166 context->deleteBuffer(buffers[i]);
2167 }
2168 }
2169 }
2170 catch(std::bad_alloc&)
2171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002172 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002173 }
2174}
2175
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002176void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002178 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002179
2180 try
2181 {
2182 if (n < 0)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002185 }
2186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002187 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002188
2189 if (context)
2190 {
2191 for (int i = 0; i < n; i++)
2192 {
2193 context->deleteFence(fences[i]);
2194 }
2195 }
2196 }
2197 catch(std::bad_alloc&)
2198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002199 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002200 }
2201}
2202
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002203void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2204{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002205 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002206
2207 try
2208 {
2209 if (n < 0)
2210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002211 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002212 }
2213
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002214 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215
2216 if (context)
2217 {
2218 for (int i = 0; i < n; i++)
2219 {
2220 if (framebuffers[i] != 0)
2221 {
2222 context->deleteFramebuffer(framebuffers[i]);
2223 }
2224 }
2225 }
2226 }
2227 catch(std::bad_alloc&)
2228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 }
2231}
2232
2233void __stdcall glDeleteProgram(GLuint program)
2234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002235 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002236
2237 try
2238 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002239 if (program == 0)
2240 {
2241 return;
2242 }
2243
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002244 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 if (context)
2247 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002248 if (!context->getProgram(program))
2249 {
2250 if(context->getShader(program))
2251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002252 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002253 }
2254 else
2255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002256 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002257 }
2258 }
2259
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002260 context->deleteProgram(program);
2261 }
2262 }
2263 catch(std::bad_alloc&)
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267}
2268
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002269void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2270{
2271 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2272
2273 try
2274 {
2275 if (n < 0)
2276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002277 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002278 }
2279
2280 gl::Context *context = gl::getNonLostContext();
2281
2282 if (context)
2283 {
2284 for (int i = 0; i < n; i++)
2285 {
2286 context->deleteQuery(ids[i]);
2287 }
2288 }
2289 }
2290 catch(std::bad_alloc&)
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002293 }
2294}
2295
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002296void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2297{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002298 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002299
2300 try
2301 {
2302 if (n < 0)
2303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305 }
2306
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002307 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002308
2309 if (context)
2310 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002311 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 {
2313 context->deleteRenderbuffer(renderbuffers[i]);
2314 }
2315 }
2316 }
2317 catch(std::bad_alloc&)
2318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002319 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002320 }
2321}
2322
2323void __stdcall glDeleteShader(GLuint shader)
2324{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002325 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326
2327 try
2328 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002329 if (shader == 0)
2330 {
2331 return;
2332 }
2333
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335
2336 if (context)
2337 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002338 if (!context->getShader(shader))
2339 {
2340 if(context->getProgram(shader))
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002343 }
2344 else
2345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002346 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002347 }
2348 }
2349
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350 context->deleteShader(shader);
2351 }
2352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362
2363 try
2364 {
2365 if (n < 0)
2366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002367 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368 }
2369
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002370 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371
2372 if (context)
2373 {
2374 for (int i = 0; i < n; i++)
2375 {
2376 if (textures[i] != 0)
2377 {
2378 context->deleteTexture(textures[i]);
2379 }
2380 }
2381 }
2382 }
2383 catch(std::bad_alloc&)
2384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002385 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002386 }
2387}
2388
2389void __stdcall glDepthFunc(GLenum func)
2390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002391 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392
2393 try
2394 {
2395 switch (func)
2396 {
2397 case GL_NEVER:
2398 case GL_ALWAYS:
2399 case GL_LESS:
2400 case GL_LEQUAL:
2401 case GL_EQUAL:
2402 case GL_GREATER:
2403 case GL_GEQUAL:
2404 case GL_NOTEQUAL:
2405 break;
2406 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002407 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002408 }
2409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002411
2412 if (context)
2413 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002414 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415 }
2416 }
2417 catch(std::bad_alloc&)
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002420 }
2421}
2422
2423void __stdcall glDepthMask(GLboolean flag)
2424{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002425 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426
2427 try
2428 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002429 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430
2431 if (context)
2432 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002433 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002434 }
2435 }
2436 catch(std::bad_alloc&)
2437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002438 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439 }
2440}
2441
2442void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002444 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445
2446 try
2447 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449
2450 if (context)
2451 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002452 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453 }
2454 }
2455 catch(std::bad_alloc&)
2456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002457 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002458 }
2459}
2460
2461void __stdcall glDetachShader(GLuint program, GLuint shader)
2462{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002463 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464
2465 try
2466 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468
2469 if (context)
2470 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002471
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 gl::Program *programObject = context->getProgram(program);
2473 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002474
2475 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002476 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002477 gl::Shader *shaderByProgramHandle;
2478 shaderByProgramHandle = context->getShader(program);
2479 if (!shaderByProgramHandle)
2480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002481 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002482 }
2483 else
2484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002485 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002486 }
2487 }
2488
2489 if (!shaderObject)
2490 {
2491 gl::Program *programByShaderHandle = context->getProgram(shader);
2492 if (!programByShaderHandle)
2493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002494 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002495 }
2496 else
2497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002498 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002499 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500 }
2501
2502 if (!programObject->detachShader(shaderObject))
2503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002504 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002506 }
2507 }
2508 catch(std::bad_alloc&)
2509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002510 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002511 }
2512}
2513
2514void __stdcall glDisable(GLenum cap)
2515{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002516 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517
2518 try
2519 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002520 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521
2522 if (context)
2523 {
2524 switch (cap)
2525 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002526 case GL_CULL_FACE: context->setCullFace(false); break;
2527 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2528 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2529 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2530 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2531 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2532 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2533 case GL_BLEND: context->setBlend(false); break;
2534 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002536 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002537 }
2538 }
2539 }
2540 catch(std::bad_alloc&)
2541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002543 }
2544}
2545
2546void __stdcall glDisableVertexAttribArray(GLuint index)
2547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002548 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002549
2550 try
2551 {
2552 if (index >= gl::MAX_VERTEX_ATTRIBS)
2553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002554 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555 }
2556
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002557 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558
2559 if (context)
2560 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002561 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002562 }
2563 }
2564 catch(std::bad_alloc&)
2565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567 }
2568}
2569
2570void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2571{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002572 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002573
2574 try
2575 {
2576 if (count < 0 || first < 0)
2577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002579 }
2580
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002581 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002582
2583 if (context)
2584 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002585 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586 }
2587 }
2588 catch(std::bad_alloc&)
2589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002590 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591 }
2592}
2593
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002594void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2595{
2596 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2597
2598 try
2599 {
2600 if (count < 0 || first < 0 || primcount < 0)
2601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002602 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002603 }
2604
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002605 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002606 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002607 gl::Context *context = gl::getNonLostContext();
2608
2609 if (context)
2610 {
2611 context->drawArrays(mode, first, count, primcount);
2612 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002613 }
2614 }
2615 catch(std::bad_alloc&)
2616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002617 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002618 }
2619}
2620
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002621void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002622{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002623 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 +00002624 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002625
2626 try
2627 {
2628 if (count < 0)
2629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002630 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631 }
2632
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002633 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634
2635 if (context)
2636 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002637 switch (type)
2638 {
2639 case GL_UNSIGNED_BYTE:
2640 case GL_UNSIGNED_SHORT:
2641 break;
2642 case GL_UNSIGNED_INT:
2643 if (!context->supports32bitIndices())
2644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002645 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002646 }
2647 break;
2648 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002650 }
2651
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002652 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002653 }
2654 }
2655 catch(std::bad_alloc&)
2656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002658 }
2659}
2660
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002661void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2662{
2663 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2664 mode, count, type, indices, primcount);
2665
2666 try
2667 {
2668 if (count < 0 || primcount < 0)
2669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002670 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002671 }
2672
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002673 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002674 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002675 gl::Context *context = gl::getNonLostContext();
2676
2677 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002678 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002679 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002680 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002681 case GL_UNSIGNED_BYTE:
2682 case GL_UNSIGNED_SHORT:
2683 break;
2684 case GL_UNSIGNED_INT:
2685 if (!context->supports32bitIndices())
2686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002687 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002688 }
2689 break;
2690 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002692 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002693
2694 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002695 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002696 }
2697 }
2698 catch(std::bad_alloc&)
2699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002700 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002701 }
2702}
2703
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002704void __stdcall glEnable(GLenum cap)
2705{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002706 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002707
2708 try
2709 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002710 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002711
2712 if (context)
2713 {
2714 switch (cap)
2715 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002716 case GL_CULL_FACE: context->setCullFace(true); break;
2717 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2718 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2719 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2720 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2721 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2722 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2723 case GL_BLEND: context->setBlend(true); break;
2724 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002726 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002727 }
2728 }
2729 }
2730 catch(std::bad_alloc&)
2731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002732 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733 }
2734}
2735
2736void __stdcall glEnableVertexAttribArray(GLuint index)
2737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002738 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002739
2740 try
2741 {
2742 if (index >= gl::MAX_VERTEX_ATTRIBS)
2743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002745 }
2746
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002748
2749 if (context)
2750 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002751 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752 }
2753 }
2754 catch(std::bad_alloc&)
2755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002757 }
2758}
2759
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002760void __stdcall glEndQueryEXT(GLenum target)
2761{
2762 EVENT("GLenum target = 0x%X)", target);
2763
2764 try
2765 {
2766 switch (target)
2767 {
2768 case GL_ANY_SAMPLES_PASSED_EXT:
2769 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2770 break;
2771 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002772 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002773 }
2774
2775 gl::Context *context = gl::getNonLostContext();
2776
2777 if (context)
2778 {
2779 context->endQuery(target);
2780 }
2781 }
2782 catch(std::bad_alloc&)
2783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002784 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002785 }
2786}
2787
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002788void __stdcall glFinishFenceNV(GLuint fence)
2789{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002790 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002791
2792 try
2793 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002794 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002795
2796 if (context)
2797 {
2798 gl::Fence* fenceObject = context->getFence(fence);
2799
2800 if (fenceObject == NULL)
2801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002802 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002803 }
2804
2805 fenceObject->finishFence();
2806 }
2807 }
2808 catch(std::bad_alloc&)
2809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002810 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002811 }
2812}
2813
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002814void __stdcall glFinish(void)
2815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002816 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002817
2818 try
2819 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821
2822 if (context)
2823 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002824 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825 }
2826 }
2827 catch(std::bad_alloc&)
2828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002830 }
2831}
2832
2833void __stdcall glFlush(void)
2834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002835 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002836
2837 try
2838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002840
2841 if (context)
2842 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002843 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002844 }
2845 }
2846 catch(std::bad_alloc&)
2847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002849 }
2850}
2851
2852void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002854 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002855 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002856
2857 try
2858 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002859 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002860 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002862 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002863 }
2864
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866
2867 if (context)
2868 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002869 gl::Framebuffer *framebuffer = NULL;
2870 GLuint framebufferHandle = 0;
2871 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2872 {
2873 framebuffer = context->getReadFramebuffer();
2874 framebufferHandle = context->getReadFramebufferHandle();
2875 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002876 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002877 {
2878 framebuffer = context->getDrawFramebuffer();
2879 framebufferHandle = context->getDrawFramebufferHandle();
2880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002881
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002882 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002884 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002885 }
2886
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002887 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002888 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002889 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2890
2891 if (colorAttachment >= context->getMaximumRenderTargets())
2892 {
2893 return gl::error(GL_INVALID_VALUE);
2894 }
2895
2896 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2897 }
2898 else
2899 {
2900 switch (attachment)
2901 {
2902 case GL_DEPTH_ATTACHMENT:
2903 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2904 break;
2905 case GL_STENCIL_ATTACHMENT:
2906 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2907 break;
2908 default:
2909 return gl::error(GL_INVALID_ENUM);
2910 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002911 }
2912 }
2913 }
2914 catch(std::bad_alloc&)
2915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002916 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002917 }
2918}
2919
2920void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2921{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002922 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002923 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924
2925 try
2926 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002927 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_ENUM);
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 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002936 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2937 {
2938 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2939
2940 if (colorAttachment >= context->getMaximumRenderTargets())
2941 {
2942 return gl::error(GL_INVALID_VALUE);
2943 }
2944 }
2945 else
2946 {
2947 switch (attachment)
2948 {
2949 case GL_DEPTH_ATTACHMENT:
2950 case GL_STENCIL_ATTACHMENT:
2951 break;
2952 default:
2953 return gl::error(GL_INVALID_ENUM);
2954 }
2955 }
2956
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002957 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002959 textarget = GL_NONE;
2960 }
2961 else
2962 {
2963 gl::Texture *tex = context->getTexture(texture);
2964
2965 if (tex == NULL)
2966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002967 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002968 }
2969
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002970 switch (textarget)
2971 {
2972 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002973 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002974 if (tex->getTarget() != GL_TEXTURE_2D)
2975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002976 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002977 }
2978 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002979 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002981 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002982 }
2983 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002984 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002985
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002986 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002988 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002990 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002991 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002992 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002993 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002995 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002996 }
2997 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002998 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003000 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003001 }
3002 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003003 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003004
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003005 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003006 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003007 }
3008
3009 if (level != 0)
3010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003011 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003012 }
3013 }
3014
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003015 gl::Framebuffer *framebuffer = NULL;
3016 GLuint framebufferHandle = 0;
3017 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3018 {
3019 framebuffer = context->getReadFramebuffer();
3020 framebufferHandle = context->getReadFramebufferHandle();
3021 }
3022 else
3023 {
3024 framebuffer = context->getDrawFramebuffer();
3025 framebufferHandle = context->getDrawFramebufferHandle();
3026 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003028 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003030 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003031 }
3032
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003033 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003034 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003035 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3036
3037 if (colorAttachment >= context->getMaximumRenderTargets())
3038 {
3039 return gl::error(GL_INVALID_VALUE);
3040 }
3041
3042 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3043 }
3044 else
3045 {
3046 switch (attachment)
3047 {
3048 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3049 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3050 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003051 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003052 }
3053 }
3054 catch(std::bad_alloc&)
3055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 }
3058}
3059
3060void __stdcall glFrontFace(GLenum mode)
3061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003062 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063
3064 try
3065 {
3066 switch (mode)
3067 {
3068 case GL_CW:
3069 case GL_CCW:
3070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003072
3073 if (context)
3074 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003075 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 }
3077 }
3078 break;
3079 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003080 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 }
3082 }
3083 catch(std::bad_alloc&)
3084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086 }
3087}
3088
3089void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003091 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003092
3093 try
3094 {
3095 if (n < 0)
3096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003097 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003098 }
3099
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003100 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101
3102 if (context)
3103 {
3104 for (int i = 0; i < n; i++)
3105 {
3106 buffers[i] = context->createBuffer();
3107 }
3108 }
3109 }
3110 catch(std::bad_alloc&)
3111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003112 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003113 }
3114}
3115
3116void __stdcall glGenerateMipmap(GLenum target)
3117{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003118 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003119
3120 try
3121 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003122 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003123
3124 if (context)
3125 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003126 switch (target)
3127 {
3128 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003129 {
3130 gl::Texture2D *tex2d = context->getTexture2D();
3131
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003132 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003134 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003135 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003136 if (tex2d->isDepth(0))
3137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003138 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003139 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003140
3141 tex2d->generateMipmaps();
3142 break;
3143 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003144
3145 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003146 {
3147 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3148
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003149 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003151 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003152 }
3153
3154 texcube->generateMipmaps();
3155 break;
3156 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003157
3158 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003159 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003160 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003161 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162 }
3163 catch(std::bad_alloc&)
3164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003165 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003166 }
3167}
3168
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003169void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3170{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003171 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003172
3173 try
3174 {
3175 if (n < 0)
3176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003177 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003178 }
3179
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003180 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003181
3182 if (context)
3183 {
3184 for (int i = 0; i < n; i++)
3185 {
3186 fences[i] = context->createFence();
3187 }
3188 }
3189 }
3190 catch(std::bad_alloc&)
3191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003192 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003193 }
3194}
3195
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003196void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003198 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003199
3200 try
3201 {
3202 if (n < 0)
3203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003204 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205 }
3206
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003208
3209 if (context)
3210 {
3211 for (int i = 0; i < n; i++)
3212 {
3213 framebuffers[i] = context->createFramebuffer();
3214 }
3215 }
3216 }
3217 catch(std::bad_alloc&)
3218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003219 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003220 }
3221}
3222
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003223void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3224{
3225 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3226
3227 try
3228 {
3229 if (n < 0)
3230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003231 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003232 }
3233
3234 gl::Context *context = gl::getNonLostContext();
3235
3236 if (context)
3237 {
3238 for (int i = 0; i < n; i++)
3239 {
3240 ids[i] = context->createQuery();
3241 }
3242 }
3243 }
3244 catch(std::bad_alloc&)
3245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003247 }
3248}
3249
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003250void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003252 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003253
3254 try
3255 {
3256 if (n < 0)
3257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259 }
3260
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262
3263 if (context)
3264 {
3265 for (int i = 0; i < n; i++)
3266 {
3267 renderbuffers[i] = context->createRenderbuffer();
3268 }
3269 }
3270 }
3271 catch(std::bad_alloc&)
3272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003274 }
3275}
3276
3277void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3278{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003279 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280
3281 try
3282 {
3283 if (n < 0)
3284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003286 }
3287
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003288 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003289
3290 if (context)
3291 {
3292 for (int i = 0; i < n; i++)
3293 {
3294 textures[i] = context->createTexture();
3295 }
3296 }
3297 }
3298 catch(std::bad_alloc&)
3299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003301 }
3302}
3303
daniel@transgaming.com85423182010-04-22 13:35:27 +00003304void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003306 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003307 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308 program, index, bufsize, length, size, type, name);
3309
3310 try
3311 {
3312 if (bufsize < 0)
3313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315 }
3316
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003317 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003318
3319 if (context)
3320 {
3321 gl::Program *programObject = context->getProgram(program);
3322
3323 if (!programObject)
3324 {
3325 if (context->getShader(program))
3326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003327 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003328 }
3329 else
3330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003332 }
3333 }
3334
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003335 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003337 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003338 }
3339
3340 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003342 }
3343 catch(std::bad_alloc&)
3344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003345 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003346 }
3347}
3348
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003349void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003351 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003352 "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 +00003353 program, index, bufsize, length, size, type, name);
3354
3355 try
3356 {
3357 if (bufsize < 0)
3358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
3361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003363
3364 if (context)
3365 {
3366 gl::Program *programObject = context->getProgram(program);
3367
3368 if (!programObject)
3369 {
3370 if (context->getShader(program))
3371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003372 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003373 }
3374 else
3375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003377 }
3378 }
3379
3380 if (index >= (GLuint)programObject->getActiveUniformCount())
3381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003383 }
3384
3385 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3386 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003387 }
3388 catch(std::bad_alloc&)
3389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391 }
3392}
3393
3394void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003396 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 +00003397 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003398
3399 try
3400 {
3401 if (maxcount < 0)
3402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003404 }
3405
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003406 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003407
3408 if (context)
3409 {
3410 gl::Program *programObject = context->getProgram(program);
3411
3412 if (!programObject)
3413 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003414 if (context->getShader(program))
3415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003417 }
3418 else
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003421 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003422 }
3423
3424 return programObject->getAttachedShaders(maxcount, count, shaders);
3425 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 }
3427 catch(std::bad_alloc&)
3428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 }
3431}
3432
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003433int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003435 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436
3437 try
3438 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003440
3441 if (context)
3442 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003443
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003444 gl::Program *programObject = context->getProgram(program);
3445
3446 if (!programObject)
3447 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003448 if (context->getShader(program))
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003451 }
3452 else
3453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003454 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003455 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456 }
3457
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003458 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003459 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003461 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003462 }
3463
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003464 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003465 }
3466 }
3467 catch(std::bad_alloc&)
3468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003469 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003470 }
3471
3472 return -1;
3473}
3474
3475void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3476{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003477 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478
3479 try
3480 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003481 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003482
3483 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003484 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003485 if (!(context->getBooleanv(pname, params)))
3486 {
3487 GLenum nativeType;
3488 unsigned int numParams = 0;
3489 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003490 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003491
3492 if (numParams == 0)
3493 return; // it is known that the pname is valid, but there are no parameters to return
3494
3495 if (nativeType == GL_FLOAT)
3496 {
3497 GLfloat *floatParams = NULL;
3498 floatParams = new GLfloat[numParams];
3499
3500 context->getFloatv(pname, floatParams);
3501
3502 for (unsigned int i = 0; i < numParams; ++i)
3503 {
3504 if (floatParams[i] == 0.0f)
3505 params[i] = GL_FALSE;
3506 else
3507 params[i] = GL_TRUE;
3508 }
3509
3510 delete [] floatParams;
3511 }
3512 else if (nativeType == GL_INT)
3513 {
3514 GLint *intParams = NULL;
3515 intParams = new GLint[numParams];
3516
3517 context->getIntegerv(pname, intParams);
3518
3519 for (unsigned int i = 0; i < numParams; ++i)
3520 {
3521 if (intParams[i] == 0)
3522 params[i] = GL_FALSE;
3523 else
3524 params[i] = GL_TRUE;
3525 }
3526
3527 delete [] intParams;
3528 }
3529 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003530 }
3531 }
3532 catch(std::bad_alloc&)
3533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 }
3536}
3537
3538void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003540 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 +00003541
3542 try
3543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003545
3546 if (context)
3547 {
3548 gl::Buffer *buffer;
3549
3550 switch (target)
3551 {
3552 case GL_ARRAY_BUFFER:
3553 buffer = context->getArrayBuffer();
3554 break;
3555 case GL_ELEMENT_ARRAY_BUFFER:
3556 buffer = context->getElementArrayBuffer();
3557 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003558 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003559 }
3560
3561 if (!buffer)
3562 {
3563 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003564 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003565 }
3566
3567 switch (pname)
3568 {
3569 case GL_BUFFER_USAGE:
3570 *params = buffer->usage();
3571 break;
3572 case GL_BUFFER_SIZE:
3573 *params = buffer->size();
3574 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003575 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003576 }
3577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003578 }
3579 catch(std::bad_alloc&)
3580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003581 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003582 }
3583}
3584
3585GLenum __stdcall glGetError(void)
3586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003587 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588
3589 gl::Context *context = gl::getContext();
3590
3591 if (context)
3592 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003593 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003594 }
3595
3596 return GL_NO_ERROR;
3597}
3598
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003599void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003601 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003602
3603 try
3604 {
3605
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003606 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003607
3608 if (context)
3609 {
3610 gl::Fence *fenceObject = context->getFence(fence);
3611
3612 if (fenceObject == NULL)
3613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003614 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003615 }
3616
3617 fenceObject->getFenceiv(pname, params);
3618 }
3619 }
3620 catch(std::bad_alloc&)
3621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003622 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003623 }
3624}
3625
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003628 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629
3630 try
3631 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003632 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003633
3634 if (context)
3635 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003636 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003637 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003638 GLenum nativeType;
3639 unsigned int numParams = 0;
3640 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003641 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003642
3643 if (numParams == 0)
3644 return; // it is known that the pname is valid, but that there are no parameters to return.
3645
3646 if (nativeType == GL_BOOL)
3647 {
3648 GLboolean *boolParams = NULL;
3649 boolParams = new GLboolean[numParams];
3650
3651 context->getBooleanv(pname, boolParams);
3652
3653 for (unsigned int i = 0; i < numParams; ++i)
3654 {
3655 if (boolParams[i] == GL_FALSE)
3656 params[i] = 0.0f;
3657 else
3658 params[i] = 1.0f;
3659 }
3660
3661 delete [] boolParams;
3662 }
3663 else if (nativeType == GL_INT)
3664 {
3665 GLint *intParams = NULL;
3666 intParams = new GLint[numParams];
3667
3668 context->getIntegerv(pname, intParams);
3669
3670 for (unsigned int i = 0; i < numParams; ++i)
3671 {
3672 params[i] = (GLfloat)intParams[i];
3673 }
3674
3675 delete [] intParams;
3676 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003677 }
3678 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679 }
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 glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3687{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003688 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 +00003689 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003690
3691 try
3692 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003693 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003694
3695 if (context)
3696 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003697 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003700 }
3701
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003702 gl::Framebuffer *framebuffer = NULL;
3703 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3704 {
3705 if(context->getReadFramebufferHandle() == 0)
3706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003707 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003708 }
3709
3710 framebuffer = context->getReadFramebuffer();
3711 }
3712 else
3713 {
3714 if (context->getDrawFramebufferHandle() == 0)
3715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003716 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003717 }
3718
3719 framebuffer = context->getDrawFramebuffer();
3720 }
3721
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003722 GLenum attachmentType;
3723 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003724
3725 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003726 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003727 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3728
3729 if (colorAttachment >= context->getMaximumRenderTargets())
3730 {
3731 return gl::error(GL_INVALID_ENUM);
3732 }
3733
3734 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3735 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3736 }
3737 else
3738 {
3739 switch (attachment)
3740 {
3741 case GL_DEPTH_ATTACHMENT:
3742 attachmentType = framebuffer->getDepthbufferType();
3743 attachmentHandle = framebuffer->getDepthbufferHandle();
3744 break;
3745 case GL_STENCIL_ATTACHMENT:
3746 attachmentType = framebuffer->getStencilbufferType();
3747 attachmentHandle = framebuffer->getStencilbufferHandle();
3748 break;
3749 default: return gl::error(GL_INVALID_ENUM);
3750 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003751 }
3752
3753 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003754 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003755 {
3756 attachmentObjectType = attachmentType;
3757 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003758 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003759 {
3760 attachmentObjectType = GL_TEXTURE;
3761 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003762 else
3763 {
3764 UNREACHABLE();
3765 return;
3766 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003767
3768 switch (pname)
3769 {
3770 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3771 *params = attachmentObjectType;
3772 break;
3773 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3774 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3775 {
3776 *params = attachmentHandle;
3777 }
3778 else
3779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003780 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003781 }
3782 break;
3783 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3784 if (attachmentObjectType == GL_TEXTURE)
3785 {
3786 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3787 }
3788 else
3789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003790 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003791 }
3792 break;
3793 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3794 if (attachmentObjectType == GL_TEXTURE)
3795 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003796 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003797 {
3798 *params = attachmentType;
3799 }
3800 else
3801 {
3802 *params = 0;
3803 }
3804 }
3805 else
3806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003807 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003808 }
3809 break;
3810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003812 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003813 }
3814 }
3815 catch(std::bad_alloc&)
3816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003818 }
3819}
3820
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003821GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3822{
3823 EVENT("()");
3824
3825 try
3826 {
3827 gl::Context *context = gl::getContext();
3828
3829 if (context)
3830 {
3831 return context->getResetStatus();
3832 }
3833
3834 return GL_NO_ERROR;
3835 }
3836 catch(std::bad_alloc&)
3837 {
3838 return GL_OUT_OF_MEMORY;
3839 }
3840}
3841
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003842void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3843{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003844 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
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.com777f2672010-04-07 03:25:16 +00003852 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003853 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003854 GLenum nativeType;
3855 unsigned int numParams = 0;
3856 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003857 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003859 if (numParams == 0)
3860 return; // it is known that pname is valid, but there are no parameters to return
3861
3862 if (nativeType == GL_BOOL)
3863 {
3864 GLboolean *boolParams = NULL;
3865 boolParams = new GLboolean[numParams];
3866
3867 context->getBooleanv(pname, boolParams);
3868
3869 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003871 if (boolParams[i] == GL_FALSE)
3872 params[i] = 0;
3873 else
3874 params[i] = 1;
3875 }
3876
3877 delete [] boolParams;
3878 }
3879 else if (nativeType == GL_FLOAT)
3880 {
3881 GLfloat *floatParams = NULL;
3882 floatParams = new GLfloat[numParams];
3883
3884 context->getFloatv(pname, floatParams);
3885
3886 for (unsigned int i = 0; i < numParams; ++i)
3887 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003888 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 +00003889 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003890 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003891 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003892 else
3893 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 +00003894 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003895
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003896 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003897 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003898 }
3899 }
3900 }
3901 catch(std::bad_alloc&)
3902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003903 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003904 }
3905}
3906
3907void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3908{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003909 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003910
3911 try
3912 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003913 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914
3915 if (context)
3916 {
3917 gl::Program *programObject = context->getProgram(program);
3918
3919 if (!programObject)
3920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003921 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922 }
3923
3924 switch (pname)
3925 {
3926 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003927 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 return;
3929 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003930 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931 return;
3932 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003933 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003934 return;
3935 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003936 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003937 return;
3938 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003939 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940 return;
3941 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003942 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003943 return;
3944 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003945 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003946 return;
3947 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003948 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003949 return;
3950 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003951 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003952 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003953 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003954 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003955 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003956 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003957 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003958 }
3959 }
3960 }
3961 catch(std::bad_alloc&)
3962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003964 }
3965}
3966
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003967void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003969 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 +00003970 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003971
3972 try
3973 {
3974 if (bufsize < 0)
3975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003976 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977 }
3978
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003979 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003980
3981 if (context)
3982 {
3983 gl::Program *programObject = context->getProgram(program);
3984
3985 if (!programObject)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003988 }
3989
3990 programObject->getInfoLog(bufsize, length, infolog);
3991 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992 }
3993 catch(std::bad_alloc&)
3994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996 }
3997}
3998
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003999void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4000{
4001 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4002
4003 try
4004 {
4005 switch (pname)
4006 {
4007 case GL_CURRENT_QUERY_EXT:
4008 break;
4009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004011 }
4012
4013 gl::Context *context = gl::getNonLostContext();
4014
4015 if (context)
4016 {
4017 params[0] = context->getActiveQuery(target);
4018 }
4019 }
4020 catch(std::bad_alloc&)
4021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004023 }
4024}
4025
4026void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4027{
4028 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4029
4030 try
4031 {
4032 switch (pname)
4033 {
4034 case GL_QUERY_RESULT_EXT:
4035 case GL_QUERY_RESULT_AVAILABLE_EXT:
4036 break;
4037 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004038 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004039 }
4040 gl::Context *context = gl::getNonLostContext();
4041
4042 if (context)
4043 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004044 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4045
4046 if (!queryObject)
4047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004048 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004049 }
4050
4051 if (context->getActiveQuery(queryObject->getType()) == id)
4052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004053 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004054 }
4055
4056 switch(pname)
4057 {
4058 case GL_QUERY_RESULT_EXT:
4059 params[0] = queryObject->getResult();
4060 break;
4061 case GL_QUERY_RESULT_AVAILABLE_EXT:
4062 params[0] = queryObject->isResultAvailable();
4063 break;
4064 default:
4065 ASSERT(false);
4066 }
4067 }
4068 }
4069 catch(std::bad_alloc&)
4070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004071 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004072 }
4073}
4074
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004077 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 +00004078
4079 try
4080 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004082
4083 if (context)
4084 {
4085 if (target != GL_RENDERBUFFER)
4086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004087 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004088 }
4089
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004090 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004092 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004093 }
4094
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004095 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004096
4097 switch (pname)
4098 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004099 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4100 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4101 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4102 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4103 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4104 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4105 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4106 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4107 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004108 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004109 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004110 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004111 *params = renderbuffer->getSamples();
4112 }
4113 else
4114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004115 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004116 }
4117 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004119 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004120 }
4121 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004122 }
4123 catch(std::bad_alloc&)
4124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126 }
4127}
4128
4129void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4130{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004131 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004132
4133 try
4134 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004135 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136
4137 if (context)
4138 {
4139 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141 if (!shaderObject)
4142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004143 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144 }
4145
4146 switch (pname)
4147 {
4148 case GL_SHADER_TYPE:
4149 *params = shaderObject->getType();
4150 return;
4151 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004152 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153 return;
4154 case GL_COMPILE_STATUS:
4155 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4156 return;
4157 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004158 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159 return;
4160 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004161 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004162 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004163 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4164 *params = shaderObject->getTranslatedSourceLength();
4165 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004166 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004167 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004168 }
4169 }
4170 }
4171 catch(std::bad_alloc&)
4172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004174 }
4175}
4176
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004177void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004178{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004179 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 +00004180 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004181
4182 try
4183 {
4184 if (bufsize < 0)
4185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004186 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004187 }
4188
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004190
4191 if (context)
4192 {
4193 gl::Shader *shaderObject = context->getShader(shader);
4194
4195 if (!shaderObject)
4196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004197 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004198 }
4199
4200 shaderObject->getInfoLog(bufsize, length, infolog);
4201 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202 }
4203 catch(std::bad_alloc&)
4204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206 }
4207}
4208
4209void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004211 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 +00004212 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004213
4214 try
4215 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004216 switch (shadertype)
4217 {
4218 case GL_VERTEX_SHADER:
4219 case GL_FRAGMENT_SHADER:
4220 break;
4221 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004222 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004223 }
4224
4225 switch (precisiontype)
4226 {
4227 case GL_LOW_FLOAT:
4228 case GL_MEDIUM_FLOAT:
4229 case GL_HIGH_FLOAT:
4230 // Assume IEEE 754 precision
4231 range[0] = 127;
4232 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004233 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004234 break;
4235 case GL_LOW_INT:
4236 case GL_MEDIUM_INT:
4237 case GL_HIGH_INT:
4238 // Some (most) hardware only supports single-precision floating-point numbers,
4239 // which can accurately represent integers up to +/-16777216
4240 range[0] = 24;
4241 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004242 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004243 break;
4244 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004245 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004246 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247 }
4248 catch(std::bad_alloc&)
4249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004251 }
4252}
4253
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004254void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004256 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 +00004257 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004258
4259 try
4260 {
4261 if (bufsize < 0)
4262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004263 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264 }
4265
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004267
4268 if (context)
4269 {
4270 gl::Shader *shaderObject = context->getShader(shader);
4271
4272 if (!shaderObject)
4273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004274 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004275 }
4276
4277 shaderObject->getSource(bufsize, length, source);
4278 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004279 }
4280 catch(std::bad_alloc&)
4281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004283 }
4284}
4285
zmo@google.coma574f782011-10-03 21:45:23 +00004286void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4287{
4288 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4289 shader, bufsize, length, source);
4290
4291 try
4292 {
4293 if (bufsize < 0)
4294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004295 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004296 }
4297
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004298 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004299
4300 if (context)
4301 {
4302 gl::Shader *shaderObject = context->getShader(shader);
4303
4304 if (!shaderObject)
4305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004306 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004307 }
4308
4309 shaderObject->getTranslatedSource(bufsize, length, source);
4310 }
4311 }
4312 catch(std::bad_alloc&)
4313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004314 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004315 }
4316}
4317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318const GLubyte* __stdcall glGetString(GLenum name)
4319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004320 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321
4322 try
4323 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004325
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 switch (name)
4327 {
4328 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004329 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004331 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004332 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00004333 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00004335 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004336 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004337 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004339 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340 }
4341 }
4342 catch(std::bad_alloc&)
4343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004344 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004346}
4347
4348void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4349{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004350 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 +00004351
4352 try
4353 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004355
4356 if (context)
4357 {
4358 gl::Texture *texture;
4359
4360 switch (target)
4361 {
4362 case GL_TEXTURE_2D:
4363 texture = context->getTexture2D();
4364 break;
4365 case GL_TEXTURE_CUBE_MAP:
4366 texture = context->getTextureCubeMap();
4367 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004368 case GL_TEXTURE_3D:
4369 if (context->getClientVersion() < 3)
4370 {
4371 return gl::error(GL_INVALID_ENUM);
4372 }
4373 texture = context->getTexture3D();
4374 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004375 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004376 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004377 }
4378
4379 switch (pname)
4380 {
4381 case GL_TEXTURE_MAG_FILTER:
4382 *params = (GLfloat)texture->getMagFilter();
4383 break;
4384 case GL_TEXTURE_MIN_FILTER:
4385 *params = (GLfloat)texture->getMinFilter();
4386 break;
4387 case GL_TEXTURE_WRAP_S:
4388 *params = (GLfloat)texture->getWrapS();
4389 break;
4390 case GL_TEXTURE_WRAP_T:
4391 *params = (GLfloat)texture->getWrapT();
4392 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004393 case GL_TEXTURE_WRAP_R:
4394 if (context->getClientVersion() < 3)
4395 {
4396 return gl::error(GL_INVALID_ENUM);
4397 }
4398 *params = (GLfloat)texture->getWrapR();
4399 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004400 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4401 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4402 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004403 case GL_TEXTURE_USAGE_ANGLE:
4404 *params = (GLfloat)texture->getUsage();
4405 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004406 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4407 if (!context->supportsTextureFilterAnisotropy())
4408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004409 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004410 }
4411 *params = (GLfloat)texture->getMaxAnisotropy();
4412 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004413 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004414 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004415 }
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
4424void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004426 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 +00004427
4428 try
4429 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004430 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004431
4432 if (context)
4433 {
4434 gl::Texture *texture;
4435
4436 switch (target)
4437 {
4438 case GL_TEXTURE_2D:
4439 texture = context->getTexture2D();
4440 break;
4441 case GL_TEXTURE_CUBE_MAP:
4442 texture = context->getTextureCubeMap();
4443 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004444 case GL_TEXTURE_3D:
4445 if (context->getClientVersion() < 3)
4446 {
4447 return gl::error(GL_INVALID_ENUM);
4448 }
4449 texture = context->getTexture3D();
4450 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004451 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004452 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004453 }
4454
4455 switch (pname)
4456 {
4457 case GL_TEXTURE_MAG_FILTER:
4458 *params = texture->getMagFilter();
4459 break;
4460 case GL_TEXTURE_MIN_FILTER:
4461 *params = texture->getMinFilter();
4462 break;
4463 case GL_TEXTURE_WRAP_S:
4464 *params = texture->getWrapS();
4465 break;
4466 case GL_TEXTURE_WRAP_T:
4467 *params = texture->getWrapT();
4468 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004469 case GL_TEXTURE_WRAP_R:
4470 if (context->getClientVersion() < 3)
4471 {
4472 return gl::error(GL_INVALID_ENUM);
4473 }
4474 *params = texture->getWrapR();
4475 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004476 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4477 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4478 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004479 case GL_TEXTURE_USAGE_ANGLE:
4480 *params = texture->getUsage();
4481 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004482 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4483 if (!context->supportsTextureFilterAnisotropy())
4484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004486 }
4487 *params = (GLint)texture->getMaxAnisotropy();
4488 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004489 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004490 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004491 }
4492 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004493 }
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.com4f39fd92010-03-08 20:26:45 +00004497 }
4498}
4499
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004500void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4501{
4502 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4503 program, location, bufSize, params);
4504
4505 try
4506 {
4507 if (bufSize < 0)
4508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004509 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004510 }
4511
4512 gl::Context *context = gl::getNonLostContext();
4513
4514 if (context)
4515 {
4516 if (program == 0)
4517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004518 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004519 }
4520
4521 gl::Program *programObject = context->getProgram(program);
4522
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004523 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004525 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004526 }
4527
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004528 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4529 if (!programBinary)
4530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004531 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004532 }
4533
4534 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004536 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004537 }
4538 }
4539 }
4540 catch(std::bad_alloc&)
4541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004543 }
4544}
4545
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004546void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004548 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004549
4550 try
4551 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004553
4554 if (context)
4555 {
4556 if (program == 0)
4557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004559 }
4560
4561 gl::Program *programObject = context->getProgram(program);
4562
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004563 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004566 }
4567
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004568 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4569 if (!programBinary)
4570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004571 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004572 }
4573
4574 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004576 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004577 }
4578 }
4579 }
4580 catch(std::bad_alloc&)
4581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004582 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004583 }
4584}
4585
4586void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4587{
4588 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4589 program, location, bufSize, params);
4590
4591 try
4592 {
4593 if (bufSize < 0)
4594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004595 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004596 }
4597
4598 gl::Context *context = gl::getNonLostContext();
4599
4600 if (context)
4601 {
4602 if (program == 0)
4603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004605 }
4606
4607 gl::Program *programObject = context->getProgram(program);
4608
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004609 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004611 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004612 }
4613
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004614 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4615 if (!programBinary)
4616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004617 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004618 }
4619
4620 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004623 }
4624 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 }
4626 catch(std::bad_alloc&)
4627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629 }
4630}
4631
4632void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4633{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004634 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004635
4636 try
4637 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004639
4640 if (context)
4641 {
4642 if (program == 0)
4643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004645 }
4646
4647 gl::Program *programObject = context->getProgram(program);
4648
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004649 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004651 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004652 }
4653
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004654 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4655 if (!programBinary)
4656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004657 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004658 }
4659
4660 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004663 }
4664 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004665 }
4666 catch(std::bad_alloc&)
4667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004669 }
4670}
4671
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004672int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004674 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675
4676 try
4677 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679
4680 if (strstr(name, "gl_") == name)
4681 {
4682 return -1;
4683 }
4684
4685 if (context)
4686 {
4687 gl::Program *programObject = context->getProgram(program);
4688
4689 if (!programObject)
4690 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004691 if (context->getShader(program))
4692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004693 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004694 }
4695 else
4696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004697 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004698 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004699 }
4700
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004701 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004702 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004705 }
4706
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004707 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004708 }
4709 }
4710 catch(std::bad_alloc&)
4711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004712 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004713 }
4714
4715 return -1;
4716}
4717
4718void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004720 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004721
4722 try
4723 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004724 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725
daniel@transgaming.come0078962010-04-15 20:45:08 +00004726 if (context)
4727 {
4728 if (index >= gl::MAX_VERTEX_ATTRIBS)
4729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004731 }
4732
daniel@transgaming.com83921382011-01-08 05:46:00 +00004733 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004734
daniel@transgaming.come0078962010-04-15 20:45:08 +00004735 switch (pname)
4736 {
4737 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004738 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004739 break;
4740 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004741 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004742 break;
4743 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004744 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004745 break;
4746 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004747 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004748 break;
4749 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004750 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004751 break;
4752 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004753 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004754 break;
4755 case GL_CURRENT_VERTEX_ATTRIB:
4756 for (int i = 0; i < 4; ++i)
4757 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004758 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004759 }
4760 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004761 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4762 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4763 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004764 *params = (GLfloat)attribState.mDivisor;
4765 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004766 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004767 }
4768 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770 catch(std::bad_alloc&)
4771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773 }
4774}
4775
4776void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004778 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779
4780 try
4781 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004782 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004783
daniel@transgaming.come0078962010-04-15 20:45:08 +00004784 if (context)
4785 {
4786 if (index >= gl::MAX_VERTEX_ATTRIBS)
4787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004789 }
4790
daniel@transgaming.com83921382011-01-08 05:46:00 +00004791 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004792
daniel@transgaming.come0078962010-04-15 20:45:08 +00004793 switch (pname)
4794 {
4795 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004796 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004797 break;
4798 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004799 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004800 break;
4801 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004802 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004803 break;
4804 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004805 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004806 break;
4807 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004808 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004809 break;
4810 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004811 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004812 break;
4813 case GL_CURRENT_VERTEX_ATTRIB:
4814 for (int i = 0; i < 4; ++i)
4815 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004816 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004817 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4818 }
4819 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004820 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4821 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4822 // the same constant.
4823 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004824 *params = (GLint)attribState.mDivisor;
4825 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004826 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004827 }
4828 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829 }
4830 catch(std::bad_alloc&)
4831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004833 }
4834}
4835
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004836void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004837{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004838 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839
4840 try
4841 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004843
daniel@transgaming.come0078962010-04-15 20:45:08 +00004844 if (context)
4845 {
4846 if (index >= gl::MAX_VERTEX_ATTRIBS)
4847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004848 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004849 }
4850
4851 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004854 }
4855
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004856 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004857 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004858 }
4859 catch(std::bad_alloc&)
4860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004861 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862 }
4863}
4864
4865void __stdcall glHint(GLenum target, GLenum mode)
4866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004867 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868
4869 try
4870 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004871 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004872 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004873 case GL_FASTEST:
4874 case GL_NICEST:
4875 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004876 break;
4877 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004878 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004879 }
4880
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004881 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004882 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004883 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004884 case GL_GENERATE_MIPMAP_HINT:
4885 if (context) context->setGenerateMipmapHint(mode);
4886 break;
4887 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4888 if (context) context->setFragmentShaderDerivativeHint(mode);
4889 break;
4890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004892 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004893 }
4894 catch(std::bad_alloc&)
4895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004896 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004897 }
4898}
4899
4900GLboolean __stdcall glIsBuffer(GLuint buffer)
4901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004902 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004903
4904 try
4905 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004906 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907
4908 if (context && buffer)
4909 {
4910 gl::Buffer *bufferObject = context->getBuffer(buffer);
4911
4912 if (bufferObject)
4913 {
4914 return GL_TRUE;
4915 }
4916 }
4917 }
4918 catch(std::bad_alloc&)
4919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004920 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004921 }
4922
4923 return GL_FALSE;
4924}
4925
4926GLboolean __stdcall glIsEnabled(GLenum cap)
4927{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004928 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004929
4930 try
4931 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004932 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933
4934 if (context)
4935 {
4936 switch (cap)
4937 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004938 case GL_CULL_FACE: return context->isCullFaceEnabled();
4939 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4940 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4941 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4942 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4943 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4944 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4945 case GL_BLEND: return context->isBlendEnabled();
4946 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004948 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949 }
4950 }
4951 }
4952 catch(std::bad_alloc&)
4953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004954 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
4956
4957 return false;
4958}
4959
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004960GLboolean __stdcall glIsFenceNV(GLuint fence)
4961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004962 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004963
4964 try
4965 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004966 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004967
4968 if (context)
4969 {
4970 gl::Fence *fenceObject = context->getFence(fence);
4971
4972 if (fenceObject == NULL)
4973 {
4974 return GL_FALSE;
4975 }
4976
4977 return fenceObject->isFence();
4978 }
4979 }
4980 catch(std::bad_alloc&)
4981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004982 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004983 }
4984
4985 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004986}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004987
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4989{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004990 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991
4992 try
4993 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995
4996 if (context && framebuffer)
4997 {
4998 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4999
5000 if (framebufferObject)
5001 {
5002 return GL_TRUE;
5003 }
5004 }
5005 }
5006 catch(std::bad_alloc&)
5007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005008 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005009 }
5010
5011 return GL_FALSE;
5012}
5013
5014GLboolean __stdcall glIsProgram(GLuint program)
5015{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005016 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005017
5018 try
5019 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005021
5022 if (context && program)
5023 {
5024 gl::Program *programObject = context->getProgram(program);
5025
5026 if (programObject)
5027 {
5028 return GL_TRUE;
5029 }
5030 }
5031 }
5032 catch(std::bad_alloc&)
5033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005034 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035 }
5036
5037 return GL_FALSE;
5038}
5039
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005040GLboolean __stdcall glIsQueryEXT(GLuint id)
5041{
5042 EVENT("(GLuint id = %d)", id);
5043
5044 try
5045 {
5046 if (id == 0)
5047 {
5048 return GL_FALSE;
5049 }
5050
5051 gl::Context *context = gl::getNonLostContext();
5052
5053 if (context)
5054 {
5055 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5056
5057 if (queryObject)
5058 {
5059 return GL_TRUE;
5060 }
5061 }
5062 }
5063 catch(std::bad_alloc&)
5064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005065 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005066 }
5067
5068 return GL_FALSE;
5069}
5070
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005073 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
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.com4f39fd92010-03-08 20:26:45 +00005078
5079 if (context && renderbuffer)
5080 {
5081 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5082
5083 if (renderbufferObject)
5084 {
5085 return GL_TRUE;
5086 }
5087 }
5088 }
5089 catch(std::bad_alloc&)
5090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005091 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005092 }
5093
5094 return GL_FALSE;
5095}
5096
5097GLboolean __stdcall glIsShader(GLuint shader)
5098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005099 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100
5101 try
5102 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005103 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005104
5105 if (context && shader)
5106 {
5107 gl::Shader *shaderObject = context->getShader(shader);
5108
5109 if (shaderObject)
5110 {
5111 return GL_TRUE;
5112 }
5113 }
5114 }
5115 catch(std::bad_alloc&)
5116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005117 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118 }
5119
5120 return GL_FALSE;
5121}
5122
5123GLboolean __stdcall glIsTexture(GLuint texture)
5124{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005125 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005126
5127 try
5128 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005129 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005130
5131 if (context && texture)
5132 {
5133 gl::Texture *textureObject = context->getTexture(texture);
5134
5135 if (textureObject)
5136 {
5137 return GL_TRUE;
5138 }
5139 }
5140 }
5141 catch(std::bad_alloc&)
5142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005143 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005144 }
5145
5146 return GL_FALSE;
5147}
5148
5149void __stdcall glLineWidth(GLfloat width)
5150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005151 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005152
5153 try
5154 {
5155 if (width <= 0.0f)
5156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005157 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005158 }
5159
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005160 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005161
5162 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005164 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 }
5166 }
5167 catch(std::bad_alloc&)
5168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170 }
5171}
5172
5173void __stdcall glLinkProgram(GLuint program)
5174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005175 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176
5177 try
5178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180
5181 if (context)
5182 {
5183 gl::Program *programObject = context->getProgram(program);
5184
5185 if (!programObject)
5186 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005187 if (context->getShader(program))
5188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005189 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005190 }
5191 else
5192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005193 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005195 }
5196
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005197 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198 }
5199 }
5200 catch(std::bad_alloc&)
5201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005202 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203 }
5204}
5205
5206void __stdcall glPixelStorei(GLenum pname, GLint param)
5207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005208 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005209
5210 try
5211 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005213
5214 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005216 switch (pname)
5217 {
5218 case GL_UNPACK_ALIGNMENT:
5219 if (param != 1 && param != 2 && param != 4 && param != 8)
5220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005222 }
5223
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005224 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005225 break;
5226
5227 case GL_PACK_ALIGNMENT:
5228 if (param != 1 && param != 2 && param != 4 && param != 8)
5229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005230 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005231 }
5232
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005233 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005234 break;
5235
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005236 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5237 context->setPackReverseRowOrder(param != 0);
5238 break;
5239
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005240 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005241 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005242 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005243 }
5244 }
5245 catch(std::bad_alloc&)
5246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248 }
5249}
5250
5251void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005253 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005254
5255 try
5256 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005258
5259 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005261 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 }
5263 }
5264 catch(std::bad_alloc&)
5265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267 }
5268}
5269
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005270void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5271 GLenum format, GLenum type, GLsizei bufSize,
5272 GLvoid *data)
5273{
5274 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5275 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5276 x, y, width, height, format, type, bufSize, data);
5277
5278 try
5279 {
5280 if (width < 0 || height < 0 || bufSize < 0)
5281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005283 }
5284
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005285 gl::Context *context = gl::getNonLostContext();
5286
5287 if (context)
5288 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005289 GLenum currentFormat, currentType;
5290
5291 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5292 // and attempting to read back if that's the case is an error. The error will be registered
5293 // by getCurrentReadFormat.
5294 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5295 return;
5296
5297 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005300 }
5301
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005302 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5303 }
5304 }
5305 catch(std::bad_alloc&)
5306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005308 }
5309}
5310
5311void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5312 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005314 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005315 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005316 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005317
5318 try
5319 {
5320 if (width < 0 || height < 0)
5321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005322 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323 }
5324
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326
5327 if (context)
5328 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005329 GLenum currentFormat, currentType;
5330
5331 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5332 // and attempting to read back if that's the case is an error. The error will be registered
5333 // by getCurrentReadFormat.
5334 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5335 return;
5336
5337 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005339 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005340 }
5341
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005342 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005343 }
5344 }
5345 catch(std::bad_alloc&)
5346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005347 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005348 }
5349}
5350
5351void __stdcall glReleaseShaderCompiler(void)
5352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005353 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354
5355 try
5356 {
5357 gl::Shader::releaseCompiler();
5358 }
5359 catch(std::bad_alloc&)
5360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005362 }
5363}
5364
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005365void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005367 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 +00005368 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005369
5370 try
5371 {
5372 switch (target)
5373 {
5374 case GL_RENDERBUFFER:
5375 break;
5376 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005377 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005378 }
5379
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005380 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005382 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005383 }
5384
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005385 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005387 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005388 }
5389
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005390 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391
5392 if (context)
5393 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005394 if (width > context->getMaximumRenderbufferDimension() ||
5395 height > context->getMaximumRenderbufferDimension() ||
5396 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005398 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005399 }
5400
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005401 GLuint handle = context->getRenderbufferHandle();
5402 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005404 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405 }
5406
5407 switch (internalformat)
5408 {
5409 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005410 case GL_RGBA4:
5411 case GL_RGB5_A1:
5412 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005413 case GL_RGB8_OES:
5414 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005416 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005417 break;
5418 case GL_SRGB8_ALPHA8:
5419 case GL_RGB10_A2:
5420 case GL_RG8:
5421 case GL_R8:
5422 if (context->getClientVersion() < 3)
5423 {
5424 return gl::error(GL_INVALID_ENUM);
5425 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005426 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005429 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005430
5431 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 }
5433 }
5434 catch(std::bad_alloc&)
5435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005436 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005437 }
5438}
5439
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005440void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5441{
5442 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5443}
5444
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5446{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005447 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448
5449 try
5450 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005451 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005452
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005453 if (context)
5454 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005455 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456 }
5457 }
5458 catch(std::bad_alloc&)
5459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005461 }
5462}
5463
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005464void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005466 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005467
5468 try
5469 {
5470 if (condition != GL_ALL_COMPLETED_NV)
5471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005472 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005473 }
5474
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005475 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005476
5477 if (context)
5478 {
5479 gl::Fence *fenceObject = context->getFence(fence);
5480
5481 if (fenceObject == NULL)
5482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005483 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005484 }
5485
5486 fenceObject->setFence(condition);
5487 }
5488 }
5489 catch(std::bad_alloc&)
5490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005491 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005492 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005493}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005494
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005497 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 +00005498
5499 try
5500 {
5501 if (width < 0 || height < 0)
5502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 }
5505
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005506 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005507
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005508 if (context)
5509 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005510 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005511 }
5512 }
5513 catch(std::bad_alloc&)
5514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005515 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005516 }
5517}
5518
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005519void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005521 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005522 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005523 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005524
5525 try
5526 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005527 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005528 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529 }
5530 catch(std::bad_alloc&)
5531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005532 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533 }
5534}
5535
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005536void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005538 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 +00005539 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005540
5541 try
5542 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005543 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005545 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 }
5547
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005548 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549
5550 if (context)
5551 {
5552 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005553
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005554 if (!shaderObject)
5555 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005556 if (context->getProgram(shader))
5557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005558 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005559 }
5560 else
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005563 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005564 }
5565
5566 shaderObject->setSource(count, string, length);
5567 }
5568 }
5569 catch(std::bad_alloc&)
5570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572 }
5573}
5574
5575void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5576{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005577 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578}
5579
5580void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5581{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005582 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 +00005583
5584 try
5585 {
5586 switch (face)
5587 {
5588 case GL_FRONT:
5589 case GL_BACK:
5590 case GL_FRONT_AND_BACK:
5591 break;
5592 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005593 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594 }
5595
5596 switch (func)
5597 {
5598 case GL_NEVER:
5599 case GL_ALWAYS:
5600 case GL_LESS:
5601 case GL_LEQUAL:
5602 case GL_EQUAL:
5603 case GL_GEQUAL:
5604 case GL_GREATER:
5605 case GL_NOTEQUAL:
5606 break;
5607 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005608 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 }
5610
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005611 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005612
5613 if (context)
5614 {
5615 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5616 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005617 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 }
5619
5620 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5621 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005622 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624 }
5625 }
5626 catch(std::bad_alloc&)
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630}
5631
5632void __stdcall glStencilMask(GLuint mask)
5633{
5634 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5635}
5636
5637void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5638{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005639 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640
5641 try
5642 {
5643 switch (face)
5644 {
5645 case GL_FRONT:
5646 case GL_BACK:
5647 case GL_FRONT_AND_BACK:
5648 break;
5649 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005650 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 }
5652
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005653 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005654
5655 if (context)
5656 {
5657 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5658 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005659 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005660 }
5661
5662 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5663 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005664 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666 }
5667 }
5668 catch(std::bad_alloc&)
5669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 }
5672}
5673
5674void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5675{
5676 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5677}
5678
5679void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005681 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 +00005682 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005683
5684 try
5685 {
5686 switch (face)
5687 {
5688 case GL_FRONT:
5689 case GL_BACK:
5690 case GL_FRONT_AND_BACK:
5691 break;
5692 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005693 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005694 }
5695
5696 switch (fail)
5697 {
5698 case GL_ZERO:
5699 case GL_KEEP:
5700 case GL_REPLACE:
5701 case GL_INCR:
5702 case GL_DECR:
5703 case GL_INVERT:
5704 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005705 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 break;
5707 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709 }
5710
5711 switch (zfail)
5712 {
5713 case GL_ZERO:
5714 case GL_KEEP:
5715 case GL_REPLACE:
5716 case GL_INCR:
5717 case GL_DECR:
5718 case GL_INVERT:
5719 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005720 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005721 break;
5722 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005724 }
5725
5726 switch (zpass)
5727 {
5728 case GL_ZERO:
5729 case GL_KEEP:
5730 case GL_REPLACE:
5731 case GL_INCR:
5732 case GL_DECR:
5733 case GL_INVERT:
5734 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005735 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 break;
5737 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005739 }
5740
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005741 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005742
5743 if (context)
5744 {
5745 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5746 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005747 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748 }
5749
5750 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5751 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005752 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753 }
5754 }
5755 }
5756 catch(std::bad_alloc&)
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759 }
5760}
5761
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005762GLboolean __stdcall glTestFenceNV(GLuint fence)
5763{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005764 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005765
5766 try
5767 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005768 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005769
5770 if (context)
5771 {
5772 gl::Fence *fenceObject = context->getFence(fence);
5773
5774 if (fenceObject == NULL)
5775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005777 }
5778
5779 return fenceObject->testFence();
5780 }
5781 }
5782 catch(std::bad_alloc&)
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005785 }
5786
5787 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005788}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005789
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005790void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5791 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005793 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 +00005794 "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 +00005795 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796
5797 try
5798 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005799 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005803
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005804 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005806 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005807 }
5808
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005809 // validate <type> by itself (used as secondary key below)
5810 switch (type)
5811 {
5812 case GL_UNSIGNED_BYTE:
5813 case GL_UNSIGNED_SHORT_5_6_5:
5814 case GL_UNSIGNED_SHORT_4_4_4_4:
5815 case GL_UNSIGNED_SHORT_5_5_5_1:
5816 case GL_UNSIGNED_SHORT:
5817 case GL_UNSIGNED_INT:
5818 case GL_UNSIGNED_INT_24_8_OES:
5819 case GL_HALF_FLOAT_OES:
5820 case GL_FLOAT:
5821 break;
5822 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005824 }
5825
5826 // validate <format> + <type> combinations
5827 // - invalid <format> -> sets INVALID_ENUM
5828 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005829 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005830 {
5831 case GL_ALPHA:
5832 case GL_LUMINANCE:
5833 case GL_LUMINANCE_ALPHA:
5834 switch (type)
5835 {
5836 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005837 case GL_FLOAT:
5838 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005839 break;
5840 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005841 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005842 }
5843 break;
5844 case GL_RGB:
5845 switch (type)
5846 {
5847 case GL_UNSIGNED_BYTE:
5848 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005849 case GL_FLOAT:
5850 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 break;
5852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005853 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005854 }
5855 break;
5856 case GL_RGBA:
5857 switch (type)
5858 {
5859 case GL_UNSIGNED_BYTE:
5860 case GL_UNSIGNED_SHORT_4_4_4_4:
5861 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005862 case GL_FLOAT:
5863 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005864 break;
5865 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005866 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005867 }
5868 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005869 case GL_BGRA_EXT:
5870 switch (type)
5871 {
5872 case GL_UNSIGNED_BYTE:
5873 break;
5874 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005875 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005876 }
5877 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005878 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5879 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005880 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5881 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005882 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005883 case GL_DEPTH_COMPONENT:
5884 switch (type)
5885 {
5886 case GL_UNSIGNED_SHORT:
5887 case GL_UNSIGNED_INT:
5888 break;
5889 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005890 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005891 }
5892 break;
5893 case GL_DEPTH_STENCIL_OES:
5894 switch (type)
5895 {
5896 case GL_UNSIGNED_INT_24_8_OES:
5897 break;
5898 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005899 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005900 }
5901 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005902 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005903 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005904 }
5905
5906 if (border != 0)
5907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
5910
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912
5913 if (context)
5914 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005915 if (level > context->getMaximumTextureLevel())
5916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005918 }
5919
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005920 switch (target)
5921 {
5922 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005923 if (width > (context->getMaximum2DTextureDimension() >> level) ||
5924 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005927 }
5928 break;
5929 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5930 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5931 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5932 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5933 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5934 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5935 if (width != height)
5936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005937 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005938 }
5939
5940 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5941 height > (context->getMaximumCubeTextureDimension() >> level))
5942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005944 }
5945 break;
5946 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005947 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005948 }
5949
gman@chromium.org50c526d2011-08-10 05:19:44 +00005950 switch (format) {
5951 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5952 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5953 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005955 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005956 }
5957 else
5958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005959 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005960 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005961 break;
5962 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5963 if (context->supportsDXT3Textures())
5964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005966 }
5967 else
5968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005969 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005970 }
5971 break;
5972 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5973 if (context->supportsDXT5Textures())
5974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005975 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005976 }
5977 else
5978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005979 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005980 }
5981 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005982 case GL_DEPTH_COMPONENT:
5983 case GL_DEPTH_STENCIL_OES:
5984 if (!context->supportsDepthTextures())
5985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005986 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005987 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005988 if (target != GL_TEXTURE_2D)
5989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005990 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005991 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005992 // OES_depth_texture supports loading depth data and multiple levels,
5993 // but ANGLE_depth_texture does not
5994 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005997 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005998 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005999 default:
6000 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006001 }
6002
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006003 if (type == GL_FLOAT)
6004 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006005 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006007 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006008 }
6009 }
6010 else if (type == GL_HALF_FLOAT_OES)
6011 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006012 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006014 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006015 }
6016 }
6017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 if (target == GL_TEXTURE_2D)
6019 {
6020 gl::Texture2D *texture = context->getTexture2D();
6021
6022 if (!texture)
6023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006024 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006025 }
6026
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006027 if (texture->isImmutable())
6028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006029 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006030 }
6031
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006032 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033 }
6034 else
6035 {
6036 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6037
6038 if (!texture)
6039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006040 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041 }
6042
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006043 if (texture->isImmutable())
6044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006045 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006046 }
6047
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006048 switch (target)
6049 {
6050 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006051 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006052 break;
6053 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006054 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 break;
6056 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006057 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 break;
6059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006060 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 break;
6062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006063 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 break;
6065 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006066 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006067 break;
6068 default: UNREACHABLE();
6069 }
6070 }
6071 }
6072 }
6073 catch(std::bad_alloc&)
6074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006075 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006076 }
6077}
6078
6079void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6080{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006081 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6082
6083 try
6084 {
6085 gl::Context *context = gl::getNonLostContext();
6086
6087 if (context)
6088 {
6089 gl::Texture *texture;
6090
6091 switch (target)
6092 {
6093 case GL_TEXTURE_2D:
6094 texture = context->getTexture2D();
6095 break;
6096 case GL_TEXTURE_CUBE_MAP:
6097 texture = context->getTextureCubeMap();
6098 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006099 case GL_TEXTURE_3D:
6100 if (context->getClientVersion() < 3)
6101 {
6102 return gl::error(GL_INVALID_ENUM);
6103 }
6104 texture = context->getTexture3D();
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006105 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006106 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006107 }
6108
6109 switch (pname)
6110 {
6111 case GL_TEXTURE_WRAP_S:
6112 if (!texture->setWrapS((GLenum)param))
6113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006114 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006115 }
6116 break;
6117 case GL_TEXTURE_WRAP_T:
6118 if (!texture->setWrapT((GLenum)param))
6119 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006120 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006121 }
6122 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006123 case GL_TEXTURE_WRAP_R:
6124 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6125 {
6126 return gl::error(GL_INVALID_ENUM);
6127 }
6128 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006129 case GL_TEXTURE_MIN_FILTER:
6130 if (!texture->setMinFilter((GLenum)param))
6131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006132 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006133 }
6134 break;
6135 case GL_TEXTURE_MAG_FILTER:
6136 if (!texture->setMagFilter((GLenum)param))
6137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006138 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006139 }
6140 break;
6141 case GL_TEXTURE_USAGE_ANGLE:
6142 if (!texture->setUsage((GLenum)param))
6143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006144 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006145 }
6146 break;
6147 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6148 if (!context->supportsTextureFilterAnisotropy())
6149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006151 }
6152 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006154 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006155 }
6156 break;
6157 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006158 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006159 }
6160 }
6161 }
6162 catch(std::bad_alloc&)
6163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006164 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006165 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006166}
6167
6168void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6169{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006170 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006171}
6172
6173void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006175 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006176
6177 try
6178 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006179 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006180
6181 if (context)
6182 {
6183 gl::Texture *texture;
6184
6185 switch (target)
6186 {
6187 case GL_TEXTURE_2D:
6188 texture = context->getTexture2D();
6189 break;
6190 case GL_TEXTURE_CUBE_MAP:
6191 texture = context->getTextureCubeMap();
6192 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006193 case GL_TEXTURE_3D:
6194 if (context->getClientVersion() < 3)
6195 {
6196 return gl::error(GL_INVALID_ENUM);
6197 }
6198 texture = context->getTexture3D();
6199 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006200 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006201 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006202 }
6203
6204 switch (pname)
6205 {
6206 case GL_TEXTURE_WRAP_S:
6207 if (!texture->setWrapS((GLenum)param))
6208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006209 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006210 }
6211 break;
6212 case GL_TEXTURE_WRAP_T:
6213 if (!texture->setWrapT((GLenum)param))
6214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006216 }
6217 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006218 case GL_TEXTURE_WRAP_R:
6219 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6220 {
6221 return gl::error(GL_INVALID_ENUM);
6222 }
6223 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006224 case GL_TEXTURE_MIN_FILTER:
6225 if (!texture->setMinFilter((GLenum)param))
6226 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006227 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006228 }
6229 break;
6230 case GL_TEXTURE_MAG_FILTER:
6231 if (!texture->setMagFilter((GLenum)param))
6232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006233 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006234 }
6235 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006236 case GL_TEXTURE_USAGE_ANGLE:
6237 if (!texture->setUsage((GLenum)param))
6238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006240 }
6241 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006242 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6243 if (!context->supportsTextureFilterAnisotropy())
6244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006245 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006246 }
6247 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006250 }
6251 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006252 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254 }
6255 }
6256 }
6257 catch(std::bad_alloc&)
6258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006260 }
6261}
6262
6263void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6264{
6265 glTexParameteri(target, pname, *params);
6266}
6267
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006268void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6269{
6270 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6271 target, levels, internalformat, width, height);
6272
6273 try
6274 {
6275 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006277 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006278 }
6279
6280 if (width < 1 || height < 1 || levels < 1)
6281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006283 }
6284
6285 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006288 }
6289
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006290 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006293 }
6294
6295 GLenum format = gl::ExtractFormat(internalformat);
6296 GLenum type = gl::ExtractType(internalformat);
6297
6298 if (format == GL_NONE || type == GL_NONE)
6299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006300 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006301 }
6302
6303 gl::Context *context = gl::getNonLostContext();
6304
6305 if (context)
6306 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006307 switch (target)
6308 {
6309 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006310 if (width > context->getMaximum2DTextureDimension() ||
6311 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006313 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006314 }
6315 break;
6316 case GL_TEXTURE_CUBE_MAP:
6317 if (width > context->getMaximumCubeTextureDimension() ||
6318 height > context->getMaximumCubeTextureDimension())
6319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006320 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006321 }
6322 break;
6323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006325 }
6326
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006327 if (levels != 1 && !context->supportsNonPower2Texture())
6328 {
6329 if (!gl::isPow2(width) || !gl::isPow2(height))
6330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006331 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006332 }
6333 }
6334
daniel@transgaming.come1077362011-11-11 04:16:50 +00006335 switch (internalformat)
6336 {
6337 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6338 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6339 if (!context->supportsDXT1Textures())
6340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006341 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006342 }
6343 break;
6344 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6345 if (!context->supportsDXT3Textures())
6346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006347 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006348 }
6349 break;
6350 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6351 if (!context->supportsDXT5Textures())
6352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006353 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006354 }
6355 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006356 case GL_RGBA32F_EXT:
6357 case GL_RGB32F_EXT:
6358 case GL_ALPHA32F_EXT:
6359 case GL_LUMINANCE32F_EXT:
6360 case GL_LUMINANCE_ALPHA32F_EXT:
6361 if (!context->supportsFloat32Textures())
6362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006363 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006364 }
6365 break;
6366 case GL_RGBA16F_EXT:
6367 case GL_RGB16F_EXT:
6368 case GL_ALPHA16F_EXT:
6369 case GL_LUMINANCE16F_EXT:
6370 case GL_LUMINANCE_ALPHA16F_EXT:
6371 if (!context->supportsFloat16Textures())
6372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006373 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006374 }
6375 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006376 case GL_DEPTH_COMPONENT16:
6377 case GL_DEPTH_COMPONENT32_OES:
6378 case GL_DEPTH24_STENCIL8_OES:
6379 if (!context->supportsDepthTextures())
6380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006381 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006382 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006383 if (target != GL_TEXTURE_2D)
6384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006385 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006386 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006387 // ANGLE_depth_texture only supports 1-level textures
6388 if (levels != 1)
6389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006391 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006392 break;
6393 default:
6394 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006395 }
6396
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006397 if (target == GL_TEXTURE_2D)
6398 {
6399 gl::Texture2D *texture = context->getTexture2D();
6400
6401 if (!texture || texture->id() == 0)
6402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006403 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006404 }
6405
6406 if (texture->isImmutable())
6407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006409 }
6410
6411 texture->storage(levels, internalformat, width, height);
6412 }
6413 else if (target == GL_TEXTURE_CUBE_MAP)
6414 {
6415 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6416
6417 if (!texture || texture->id() == 0)
6418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006419 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006420 }
6421
6422 if (texture->isImmutable())
6423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006424 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006425 }
6426
6427 texture->storage(levels, internalformat, width);
6428 }
6429 else UNREACHABLE();
6430 }
6431 }
6432 catch(std::bad_alloc&)
6433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006434 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006435 }
6436}
6437
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006438void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6439 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006440{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006441 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006442 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006443 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006444 target, level, xoffset, yoffset, width, height, format, type, pixels);
6445
6446 try
6447 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006448 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006450 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006451 }
6452
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006453 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006455 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006456 }
6457
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006458 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006460 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006461 }
6462
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006463 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006464 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006465 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006466 }
6467
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006468 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006469
6470 if (context)
6471 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006472 if (level > context->getMaximumTextureLevel())
6473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006474 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006475 }
6476
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006477 if (format == GL_FLOAT)
6478 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006479 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006481 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006482 }
6483 }
6484 else if (format == GL_HALF_FLOAT_OES)
6485 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006486 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006488 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006489 }
6490 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006491 else if (gl::IsDepthTexture(format))
6492 {
6493 if (!context->supportsDepthTextures())
6494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006495 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006496 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006497 if (target != GL_TEXTURE_2D)
6498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006500 }
6501 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006502 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006503 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006504
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006505 if (width == 0 || height == 0 || pixels == NULL)
6506 {
6507 return;
6508 }
6509
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006510 if (target == GL_TEXTURE_2D)
6511 {
6512 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006513 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006514 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006515 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006516 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006517 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006518 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006519 {
6520 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006521 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006522 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006523 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006524 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006525 }
6526 else
6527 {
6528 UNREACHABLE();
6529 }
6530 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006531 }
6532 catch(std::bad_alloc&)
6533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006535 }
6536}
6537
6538void __stdcall glUniform1f(GLint location, GLfloat x)
6539{
6540 glUniform1fv(location, 1, &x);
6541}
6542
6543void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006545 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006546
6547 try
6548 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006549 if (count < 0)
6550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006552 }
6553
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006554 if (location == -1)
6555 {
6556 return;
6557 }
6558
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006560
6561 if (context)
6562 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006563 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006564 if (!programBinary)
6565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006566 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006567 }
6568
6569 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006571 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006572 }
6573 }
6574 }
6575 catch(std::bad_alloc&)
6576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006577 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006578 }
6579}
6580
6581void __stdcall glUniform1i(GLint location, GLint x)
6582{
6583 glUniform1iv(location, 1, &x);
6584}
6585
6586void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6587{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006588 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006589
6590 try
6591 {
6592 if (count < 0)
6593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006594 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006595 }
6596
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006597 if (location == -1)
6598 {
6599 return;
6600 }
6601
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006602 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006603
6604 if (context)
6605 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006606 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006607 if (!programBinary)
6608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006609 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006610 }
6611
6612 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006614 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006615 }
6616 }
6617 }
6618 catch(std::bad_alloc&)
6619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006621 }
6622}
6623
6624void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6625{
6626 GLfloat xy[2] = {x, y};
6627
6628 glUniform2fv(location, 1, (GLfloat*)&xy);
6629}
6630
6631void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006633 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006634
6635 try
6636 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006637 if (count < 0)
6638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006640 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006641
6642 if (location == -1)
6643 {
6644 return;
6645 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006646
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006647 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006648
6649 if (context)
6650 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006651 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006652 if (!programBinary)
6653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006654 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006655 }
6656
6657 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006659 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006660 }
6661 }
6662 }
6663 catch(std::bad_alloc&)
6664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006665 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006666 }
6667}
6668
6669void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6670{
6671 GLint xy[4] = {x, y};
6672
6673 glUniform2iv(location, 1, (GLint*)&xy);
6674}
6675
6676void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006678 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006679
6680 try
6681 {
6682 if (count < 0)
6683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006684 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006685 }
6686
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006687 if (location == -1)
6688 {
6689 return;
6690 }
6691
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006692 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006693
6694 if (context)
6695 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006696 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006697 if (!programBinary)
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006700 }
6701
6702 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006704 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006705 }
6706 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006707 }
6708 catch(std::bad_alloc&)
6709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006711 }
6712}
6713
6714void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6715{
6716 GLfloat xyz[3] = {x, y, z};
6717
6718 glUniform3fv(location, 1, (GLfloat*)&xyz);
6719}
6720
6721void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006723 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006724
6725 try
6726 {
6727 if (count < 0)
6728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006729 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006730 }
6731
6732 if (location == -1)
6733 {
6734 return;
6735 }
6736
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006737 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006738
6739 if (context)
6740 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006741 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006742 if (!programBinary)
6743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006744 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006745 }
6746
6747 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006749 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006750 }
6751 }
6752 }
6753 catch(std::bad_alloc&)
6754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006756 }
6757}
6758
6759void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6760{
6761 GLint xyz[3] = {x, y, z};
6762
6763 glUniform3iv(location, 1, (GLint*)&xyz);
6764}
6765
6766void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6767{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006768 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006769
6770 try
6771 {
6772 if (count < 0)
6773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006775 }
6776
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006777 if (location == -1)
6778 {
6779 return;
6780 }
6781
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006782 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006783
6784 if (context)
6785 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006786 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006787 if (!programBinary)
6788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006789 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006790 }
6791
6792 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006794 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006795 }
6796 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006797 }
6798 catch(std::bad_alloc&)
6799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006801 }
6802}
6803
6804void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6805{
6806 GLfloat xyzw[4] = {x, y, z, w};
6807
6808 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6809}
6810
6811void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006813 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006814
6815 try
6816 {
6817 if (count < 0)
6818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006819 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820 }
6821
6822 if (location == -1)
6823 {
6824 return;
6825 }
6826
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006827 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006828
6829 if (context)
6830 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006831 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006832 if (!programBinary)
6833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006834 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006835 }
6836
6837 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006839 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006840 }
6841 }
6842 }
6843 catch(std::bad_alloc&)
6844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006846 }
6847}
6848
6849void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6850{
6851 GLint xyzw[4] = {x, y, z, w};
6852
6853 glUniform4iv(location, 1, (GLint*)&xyzw);
6854}
6855
6856void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6857{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006858 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006859
6860 try
6861 {
6862 if (count < 0)
6863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006864 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006865 }
6866
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006867 if (location == -1)
6868 {
6869 return;
6870 }
6871
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006872 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006873
6874 if (context)
6875 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006876 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006877 if (!programBinary)
6878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006879 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006880 }
6881
6882 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006884 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006885 }
6886 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006887 }
6888 catch(std::bad_alloc&)
6889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006890 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006891 }
6892}
6893
6894void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6895{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006896 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006897 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006898
6899 try
6900 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006901 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006903 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006904 }
6905
6906 if (location == -1)
6907 {
6908 return;
6909 }
6910
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006912
6913 if (context)
6914 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006915 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6916 {
6917 return gl::error(GL_INVALID_VALUE);
6918 }
6919
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006920 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006921 if (!programBinary)
6922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006923 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006924 }
6925
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006926 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006928 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006929 }
6930 }
6931 }
6932 catch(std::bad_alloc&)
6933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006935 }
6936}
6937
6938void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6939{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006940 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006941 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006942
6943 try
6944 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006945 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006947 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006948 }
6949
6950 if (location == -1)
6951 {
6952 return;
6953 }
6954
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006955 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006956
6957 if (context)
6958 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006959 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6960 {
6961 return gl::error(GL_INVALID_VALUE);
6962 }
6963
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006964 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006965 if (!programBinary)
6966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006967 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006968 }
6969
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006970 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006972 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006973 }
6974 }
6975 }
6976 catch(std::bad_alloc&)
6977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006978 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006979 }
6980}
6981
6982void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6983{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006984 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006985 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006986
6987 try
6988 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006989 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006990 {
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
6994 if (location == -1)
6995 {
6996 return;
6997 }
6998
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006999 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007000
7001 if (context)
7002 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007003 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7004 {
7005 return gl::error(GL_INVALID_VALUE);
7006 }
7007
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007008 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007009 if (!programBinary)
7010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007011 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007012 }
7013
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007014 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007016 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007017 }
7018 }
7019 }
7020 catch(std::bad_alloc&)
7021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007023 }
7024}
7025
7026void __stdcall glUseProgram(GLuint program)
7027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007028 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007029
7030 try
7031 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007033
7034 if (context)
7035 {
7036 gl::Program *programObject = context->getProgram(program);
7037
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007038 if (!programObject && program != 0)
7039 {
7040 if (context->getShader(program))
7041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007042 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007043 }
7044 else
7045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007046 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007047 }
7048 }
7049
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007050 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007052 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007053 }
7054
7055 context->useProgram(program);
7056 }
7057 }
7058 catch(std::bad_alloc&)
7059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007061 }
7062}
7063
7064void __stdcall glValidateProgram(GLuint program)
7065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007066 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007067
7068 try
7069 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007071
7072 if (context)
7073 {
7074 gl::Program *programObject = context->getProgram(program);
7075
7076 if (!programObject)
7077 {
7078 if (context->getShader(program))
7079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007081 }
7082 else
7083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007084 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007085 }
7086 }
7087
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007088 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007089 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007090 }
7091 catch(std::bad_alloc&)
7092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007093 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007094 }
7095}
7096
7097void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7098{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007099 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007100
7101 try
7102 {
7103 if (index >= gl::MAX_VERTEX_ATTRIBS)
7104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007106 }
7107
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007108 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007109
7110 if (context)
7111 {
7112 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007113 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007114 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007115 }
7116 catch(std::bad_alloc&)
7117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007118 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007119 }
7120}
7121
7122void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7123{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007124 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007125
7126 try
7127 {
7128 if (index >= gl::MAX_VERTEX_ATTRIBS)
7129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007130 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007131 }
7132
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007133 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007134
7135 if (context)
7136 {
7137 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007138 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007139 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007140 }
7141 catch(std::bad_alloc&)
7142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007143 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144 }
7145}
7146
7147void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7148{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007149 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007150
7151 try
7152 {
7153 if (index >= gl::MAX_VERTEX_ATTRIBS)
7154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007155 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007156 }
7157
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007159
7160 if (context)
7161 {
7162 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007163 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007164 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007165 }
7166 catch(std::bad_alloc&)
7167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007168 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007169 }
7170}
7171
7172void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7173{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007174 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007175
7176 try
7177 {
7178 if (index >= gl::MAX_VERTEX_ATTRIBS)
7179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007180 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007181 }
7182
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007184
7185 if (context)
7186 {
7187 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007188 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007189 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007190 }
7191 catch(std::bad_alloc&)
7192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007193 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007194 }
7195}
7196
7197void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7198{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007199 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 +00007200
7201 try
7202 {
7203 if (index >= gl::MAX_VERTEX_ATTRIBS)
7204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007205 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007206 }
7207
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007209
7210 if (context)
7211 {
7212 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007213 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007214 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007215 }
7216 catch(std::bad_alloc&)
7217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007218 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007219 }
7220}
7221
7222void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007224 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007225
7226 try
7227 {
7228 if (index >= gl::MAX_VERTEX_ATTRIBS)
7229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007230 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007231 }
7232
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007233 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007234
7235 if (context)
7236 {
7237 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007238 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007239 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007240 }
7241 catch(std::bad_alloc&)
7242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007244 }
7245}
7246
7247void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7248{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007249 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 +00007250
7251 try
7252 {
7253 if (index >= gl::MAX_VERTEX_ATTRIBS)
7254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007255 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007256 }
7257
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007259
7260 if (context)
7261 {
7262 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007263 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007264 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007265 }
7266 catch(std::bad_alloc&)
7267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007268 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007269 }
7270}
7271
7272void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007274 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007275
7276 try
7277 {
7278 if (index >= gl::MAX_VERTEX_ATTRIBS)
7279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007281 }
7282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007284
7285 if (context)
7286 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007287 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007288 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007289 }
7290 catch(std::bad_alloc&)
7291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007292 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007293 }
7294}
7295
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007296void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7297{
7298 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7299
7300 try
7301 {
7302 if (index >= gl::MAX_VERTEX_ATTRIBS)
7303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007305 }
7306
7307 gl::Context *context = gl::getNonLostContext();
7308
7309 if (context)
7310 {
7311 context->setVertexAttribDivisor(index, divisor);
7312 }
7313 }
7314 catch(std::bad_alloc&)
7315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007316 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007317 }
7318}
7319
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007320void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007321{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007322 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007323 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007324 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007325
7326 try
7327 {
7328 if (index >= gl::MAX_VERTEX_ATTRIBS)
7329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007331 }
7332
7333 if (size < 1 || size > 4)
7334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007335 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007336 }
7337
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007338 gl::Context *context = gl::getNonLostContext();
7339
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007340 switch (type)
7341 {
7342 case GL_BYTE:
7343 case GL_UNSIGNED_BYTE:
7344 case GL_SHORT:
7345 case GL_UNSIGNED_SHORT:
7346 case GL_FIXED:
7347 case GL_FLOAT:
7348 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007349 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007350 case GL_INT:
7351 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007352 case GL_INT_2_10_10_10_REV:
7353 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007354 if (context && context->getClientVersion() < 3)
7355 {
7356 return gl::error(GL_INVALID_ENUM);
7357 }
7358 else
7359 {
7360 break;
7361 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007362 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007363 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007364 }
7365
7366 if (stride < 0)
7367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007369 }
7370
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007371 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7372 {
7373 return gl::error(GL_INVALID_OPERATION);
7374 }
7375
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007376 if (context)
7377 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007378 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7379 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007380 }
7381 }
7382 catch(std::bad_alloc&)
7383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007385 }
7386}
7387
7388void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007390 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 +00007391
7392 try
7393 {
7394 if (width < 0 || height < 0)
7395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007396 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007397 }
7398
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007399 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007400
7401 if (context)
7402 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007403 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007404 }
7405 }
7406 catch(std::bad_alloc&)
7407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007409 }
7410}
7411
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007412// OpenGL ES 3.0 functions
7413
7414void __stdcall glReadBuffer(GLenum mode)
7415{
7416 EVENT("(GLenum mode = 0x%X)", mode);
7417
7418 try
7419 {
7420 gl::Context *context = gl::getNonLostContext();
7421
7422 if (context)
7423 {
7424 if (context->getClientVersion() < 3)
7425 {
7426 return gl::error(GL_INVALID_OPERATION);
7427 }
7428 }
7429
7430 UNIMPLEMENTED();
7431 }
7432 catch(std::bad_alloc&)
7433 {
7434 return gl::error(GL_OUT_OF_MEMORY);
7435 }
7436}
7437
7438void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7439{
7440 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7441 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7442
7443 try
7444 {
7445 gl::Context *context = gl::getNonLostContext();
7446
7447 if (context)
7448 {
7449 if (context->getClientVersion() < 3)
7450 {
7451 return gl::error(GL_INVALID_OPERATION);
7452 }
7453 }
7454
7455 UNIMPLEMENTED();
7456 }
7457 catch(std::bad_alloc&)
7458 {
7459 return gl::error(GL_OUT_OF_MEMORY);
7460 }
7461}
7462
7463void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7464{
7465 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7466 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7467 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7468 target, level, internalformat, width, height, depth, border, format, type, pixels);
7469
7470 try
7471 {
7472 gl::Context *context = gl::getNonLostContext();
7473
7474 if (context)
7475 {
7476 if (context->getClientVersion() < 3)
7477 {
7478 return gl::error(GL_INVALID_OPERATION);
7479 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007480
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007481 // validateES3TexImageFormat sets the error code if there is an error
7482 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7483 0, 0, 0, width, height, depth, border, format, type))
7484 {
7485 return;
7486 }
7487
7488 switch(target)
7489 {
7490 case GL_TEXTURE_3D:
7491 {
7492 gl::Texture3D *texture = context->getTexture3D();
7493 texture->setImage(level, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7494 }
7495 break;
7496
7497 case GL_TEXTURE_2D_ARRAY:
7498 UNIMPLEMENTED();
7499 break;
7500
7501 default:
7502 return gl::error(GL_INVALID_ENUM);
7503 }
7504 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007505 }
7506 catch(std::bad_alloc&)
7507 {
7508 return gl::error(GL_OUT_OF_MEMORY);
7509 }
7510}
7511
7512void __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)
7513{
7514 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7515 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7516 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7517 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7518
7519 try
7520 {
7521 gl::Context *context = gl::getNonLostContext();
7522
7523 if (context)
7524 {
7525 if (context->getClientVersion() < 3)
7526 {
7527 return gl::error(GL_INVALID_OPERATION);
7528 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007529
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007530 if (!pixels)
7531 {
7532 return gl::error(GL_INVALID_VALUE);
7533 }
7534
7535 // validateES3TexImageFormat sets the error code if there is an error
7536 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7537 xoffset, yoffset, zoffset, width, height, depth, 0,
7538 format, type))
7539 {
7540 return;
7541 }
7542
7543 switch(target)
7544 {
7545 case GL_TEXTURE_3D:
7546 {
7547 gl::Texture3D *texture = context->getTexture3D();
7548 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7549 }
7550 break;
7551
7552 case GL_TEXTURE_2D_ARRAY:
7553 UNIMPLEMENTED();
7554 break;
7555
7556 default:
7557 return gl::error(GL_INVALID_ENUM);
7558 }
7559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007560 }
7561 catch(std::bad_alloc&)
7562 {
7563 return gl::error(GL_OUT_OF_MEMORY);
7564 }
7565}
7566
7567void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7568{
7569 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7570 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7571 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7572
7573 try
7574 {
7575 gl::Context *context = gl::getNonLostContext();
7576
7577 if (context)
7578 {
7579 if (context->getClientVersion() < 3)
7580 {
7581 return gl::error(GL_INVALID_OPERATION);
7582 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007583
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007584 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7585 x, y, width, height))
7586 {
7587 return;
7588 }
7589
7590 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7591 gl::Texture *texture = NULL;
7592 switch (target)
7593 {
7594 case GL_TEXTURE_3D:
7595 texture = context->getTexture3D();
7596 break;
7597
7598 case GL_TEXTURE_2D_ARRAY:
7599 UNIMPLEMENTED();
7600 break;
7601
7602 default:
7603 return gl::error(GL_INVALID_ENUM);
7604 }
7605
7606 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7607 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007608 }
7609 catch(std::bad_alloc&)
7610 {
7611 return gl::error(GL_OUT_OF_MEMORY);
7612 }
7613}
7614
7615void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7616{
7617 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7618 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7619 "const GLvoid* data = 0x%0.8p)",
7620 target, level, internalformat, width, height, depth, border, imageSize, data);
7621
7622 try
7623 {
7624 gl::Context *context = gl::getNonLostContext();
7625
7626 if (context)
7627 {
7628 if (context->getClientVersion() < 3)
7629 {
7630 return gl::error(GL_INVALID_OPERATION);
7631 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007632
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007633 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, internalformat))
7634 {
7635 return gl::error(GL_INVALID_VALUE);
7636 }
7637
7638 // validateES3TexImageFormat sets the error code if there is an error
7639 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7640 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7641 {
7642 return;
7643 }
7644
7645 switch(target)
7646 {
7647 case GL_TEXTURE_3D:
7648 {
7649 gl::Texture3D *texture = context->getTexture3D();
7650 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7651 }
7652 break;
7653
7654 case GL_TEXTURE_2D_ARRAY:
7655 UNIMPLEMENTED();
7656 break;
7657
7658 default:
7659 return gl::error(GL_INVALID_ENUM);
7660 }
7661 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007662 }
7663 catch(std::bad_alloc&)
7664 {
7665 return gl::error(GL_OUT_OF_MEMORY);
7666 }
7667}
7668
7669void __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)
7670{
7671 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7672 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7673 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7674 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7675
7676 try
7677 {
7678 gl::Context *context = gl::getNonLostContext();
7679
7680 if (context)
7681 {
7682 if (context->getClientVersion() < 3)
7683 {
7684 return gl::error(GL_INVALID_OPERATION);
7685 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007686
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007687 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, format))
7688 {
7689 return gl::error(GL_INVALID_VALUE);
7690 }
7691
7692 if (!data)
7693 {
7694 return gl::error(GL_INVALID_VALUE);
7695 }
7696
7697 // validateES3TexImageFormat sets the error code if there is an error
7698 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7699 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7700 {
7701 return;
7702 }
7703
7704 switch(target)
7705 {
7706 case GL_TEXTURE_3D:
7707 {
7708 gl::Texture3D *texture = context->getTexture3D();
7709 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7710 format, imageSize, data);
7711 }
7712 break;
7713
7714 case GL_TEXTURE_2D_ARRAY:
7715 UNIMPLEMENTED();
7716 break;
7717
7718 default:
7719 return gl::error(GL_INVALID_ENUM);
7720 }
7721 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007722 }
7723 catch(std::bad_alloc&)
7724 {
7725 return gl::error(GL_OUT_OF_MEMORY);
7726 }
7727}
7728
7729void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7730{
7731 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7732
7733 try
7734 {
7735 gl::Context *context = gl::getNonLostContext();
7736
7737 if (context)
7738 {
7739 if (context->getClientVersion() < 3)
7740 {
7741 return gl::error(GL_INVALID_OPERATION);
7742 }
7743 }
7744
7745 UNIMPLEMENTED();
7746 }
7747 catch(std::bad_alloc&)
7748 {
7749 return gl::error(GL_OUT_OF_MEMORY);
7750 }
7751}
7752
7753void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7754{
7755 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7756
7757 try
7758 {
7759 gl::Context *context = gl::getNonLostContext();
7760
7761 if (context)
7762 {
7763 if (context->getClientVersion() < 3)
7764 {
7765 return gl::error(GL_INVALID_OPERATION);
7766 }
7767 }
7768
7769 UNIMPLEMENTED();
7770 }
7771 catch(std::bad_alloc&)
7772 {
7773 return gl::error(GL_OUT_OF_MEMORY);
7774 }
7775}
7776
7777GLboolean __stdcall glIsQuery(GLuint id)
7778{
7779 EVENT("(GLuint id = %u)", id);
7780
7781 try
7782 {
7783 gl::Context *context = gl::getNonLostContext();
7784
7785 if (context)
7786 {
7787 if (context->getClientVersion() < 3)
7788 {
7789 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7790 }
7791 }
7792
7793 UNIMPLEMENTED();
7794 }
7795 catch(std::bad_alloc&)
7796 {
7797 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7798 }
7799
7800 return GL_FALSE;
7801}
7802
7803void __stdcall glBeginQuery(GLenum target, GLuint id)
7804{
7805 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7806
7807 try
7808 {
7809 gl::Context *context = gl::getNonLostContext();
7810
7811 if (context)
7812 {
7813 if (context->getClientVersion() < 3)
7814 {
7815 return gl::error(GL_INVALID_OPERATION);
7816 }
7817 }
7818
7819 UNIMPLEMENTED();
7820 }
7821 catch(std::bad_alloc&)
7822 {
7823 return gl::error(GL_OUT_OF_MEMORY);
7824 }
7825}
7826
7827void __stdcall glEndQuery(GLenum target)
7828{
7829 EVENT("(GLenum target = 0x%X)", target);
7830
7831 try
7832 {
7833 gl::Context *context = gl::getNonLostContext();
7834
7835 if (context)
7836 {
7837 if (context->getClientVersion() < 3)
7838 {
7839 return gl::error(GL_INVALID_OPERATION);
7840 }
7841 }
7842
7843 UNIMPLEMENTED();
7844 }
7845 catch(std::bad_alloc&)
7846 {
7847 return gl::error(GL_OUT_OF_MEMORY);
7848 }
7849}
7850
7851void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7852{
7853 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7854
7855 try
7856 {
7857 gl::Context *context = gl::getNonLostContext();
7858
7859 if (context)
7860 {
7861 if (context->getClientVersion() < 3)
7862 {
7863 return gl::error(GL_INVALID_OPERATION);
7864 }
7865 }
7866
7867 UNIMPLEMENTED();
7868 }
7869 catch(std::bad_alloc&)
7870 {
7871 return gl::error(GL_OUT_OF_MEMORY);
7872 }
7873}
7874
7875void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7876{
7877 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7878
7879 try
7880 {
7881 gl::Context *context = gl::getNonLostContext();
7882
7883 if (context)
7884 {
7885 if (context->getClientVersion() < 3)
7886 {
7887 return gl::error(GL_INVALID_OPERATION);
7888 }
7889 }
7890
7891 UNIMPLEMENTED();
7892 }
7893 catch(std::bad_alloc&)
7894 {
7895 return gl::error(GL_OUT_OF_MEMORY);
7896 }
7897}
7898
7899GLboolean __stdcall glUnmapBuffer(GLenum target)
7900{
7901 EVENT("(GLenum target = 0x%X)", target);
7902
7903 try
7904 {
7905 gl::Context *context = gl::getNonLostContext();
7906
7907 if (context)
7908 {
7909 if (context->getClientVersion() < 3)
7910 {
7911 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7912 }
7913 }
7914
7915 UNIMPLEMENTED();
7916 }
7917 catch(std::bad_alloc&)
7918 {
7919 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7920 }
7921
7922 return GL_FALSE;
7923}
7924
7925void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7926{
7927 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7928
7929 try
7930 {
7931 gl::Context *context = gl::getNonLostContext();
7932
7933 if (context)
7934 {
7935 if (context->getClientVersion() < 3)
7936 {
7937 return gl::error(GL_INVALID_OPERATION);
7938 }
7939 }
7940
7941 UNIMPLEMENTED();
7942 }
7943 catch(std::bad_alloc&)
7944 {
7945 return gl::error(GL_OUT_OF_MEMORY);
7946 }
7947}
7948
7949void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7950{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007951 try
7952 {
7953 gl::Context *context = gl::getNonLostContext();
7954
7955 if (context)
7956 {
7957 if (context->getClientVersion() < 3)
7958 {
7959 return gl::error(GL_INVALID_OPERATION);
7960 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007961
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007962 glDrawBuffersEXT(n, bufs);
7963 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007964 }
7965 catch(std::bad_alloc&)
7966 {
7967 return gl::error(GL_OUT_OF_MEMORY);
7968 }
7969}
7970
7971void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7972{
7973 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7974 location, count, transpose, value);
7975
7976 try
7977 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007978 if (count < 0)
7979 {
7980 return gl::error(GL_INVALID_VALUE);
7981 }
7982
7983 if (location == -1)
7984 {
7985 return;
7986 }
7987
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007988 gl::Context *context = gl::getNonLostContext();
7989
7990 if (context)
7991 {
7992 if (context->getClientVersion() < 3)
7993 {
7994 return gl::error(GL_INVALID_OPERATION);
7995 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007996
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007997 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7998 if (!programBinary)
7999 {
8000 return gl::error(GL_INVALID_OPERATION);
8001 }
8002
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008003 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008004 {
8005 return gl::error(GL_INVALID_OPERATION);
8006 }
8007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008008 }
8009 catch(std::bad_alloc&)
8010 {
8011 return gl::error(GL_OUT_OF_MEMORY);
8012 }
8013}
8014
8015void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8016{
8017 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8018 location, count, transpose, value);
8019
8020 try
8021 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008022 if (count < 0)
8023 {
8024 return gl::error(GL_INVALID_VALUE);
8025 }
8026
8027 if (location == -1)
8028 {
8029 return;
8030 }
8031
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008032 gl::Context *context = gl::getNonLostContext();
8033
8034 if (context)
8035 {
8036 if (context->getClientVersion() < 3)
8037 {
8038 return gl::error(GL_INVALID_OPERATION);
8039 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008040
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008041 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8042 if (!programBinary)
8043 {
8044 return gl::error(GL_INVALID_OPERATION);
8045 }
8046
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008047 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008048 {
8049 return gl::error(GL_INVALID_OPERATION);
8050 }
8051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008052 }
8053 catch(std::bad_alloc&)
8054 {
8055 return gl::error(GL_OUT_OF_MEMORY);
8056 }
8057}
8058
8059void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8060{
8061 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8062 location, count, transpose, value);
8063
8064 try
8065 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008066 if (count < 0)
8067 {
8068 return gl::error(GL_INVALID_VALUE);
8069 }
8070
8071 if (location == -1)
8072 {
8073 return;
8074 }
8075
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008076 gl::Context *context = gl::getNonLostContext();
8077
8078 if (context)
8079 {
8080 if (context->getClientVersion() < 3)
8081 {
8082 return gl::error(GL_INVALID_OPERATION);
8083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008085 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8086 if (!programBinary)
8087 {
8088 return gl::error(GL_INVALID_OPERATION);
8089 }
8090
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008091 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008092 {
8093 return gl::error(GL_INVALID_OPERATION);
8094 }
8095 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008096 }
8097 catch(std::bad_alloc&)
8098 {
8099 return gl::error(GL_OUT_OF_MEMORY);
8100 }
8101}
8102
8103void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8104{
8105 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8106 location, count, transpose, value);
8107
8108 try
8109 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008110 if (count < 0)
8111 {
8112 return gl::error(GL_INVALID_VALUE);
8113 }
8114
8115 if (location == -1)
8116 {
8117 return;
8118 }
8119
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008120 gl::Context *context = gl::getNonLostContext();
8121
8122 if (context)
8123 {
8124 if (context->getClientVersion() < 3)
8125 {
8126 return gl::error(GL_INVALID_OPERATION);
8127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008128
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008129 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8130 if (!programBinary)
8131 {
8132 return gl::error(GL_INVALID_OPERATION);
8133 }
8134
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008135 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008136 {
8137 return gl::error(GL_INVALID_OPERATION);
8138 }
8139 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008140 }
8141 catch(std::bad_alloc&)
8142 {
8143 return gl::error(GL_OUT_OF_MEMORY);
8144 }
8145}
8146
8147void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8148{
8149 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8150 location, count, transpose, value);
8151
8152 try
8153 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008154 if (count < 0)
8155 {
8156 return gl::error(GL_INVALID_VALUE);
8157 }
8158
8159 if (location == -1)
8160 {
8161 return;
8162 }
8163
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008164 gl::Context *context = gl::getNonLostContext();
8165
8166 if (context)
8167 {
8168 if (context->getClientVersion() < 3)
8169 {
8170 return gl::error(GL_INVALID_OPERATION);
8171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008172
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008173 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8174 if (!programBinary)
8175 {
8176 return gl::error(GL_INVALID_OPERATION);
8177 }
8178
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008179 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008180 {
8181 return gl::error(GL_INVALID_OPERATION);
8182 }
8183 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008184 }
8185 catch(std::bad_alloc&)
8186 {
8187 return gl::error(GL_OUT_OF_MEMORY);
8188 }
8189}
8190
8191void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8192{
8193 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8194 location, count, transpose, value);
8195
8196 try
8197 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008198 if (count < 0)
8199 {
8200 return gl::error(GL_INVALID_VALUE);
8201 }
8202
8203 if (location == -1)
8204 {
8205 return;
8206 }
8207
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008208 gl::Context *context = gl::getNonLostContext();
8209
8210 if (context)
8211 {
8212 if (context->getClientVersion() < 3)
8213 {
8214 return gl::error(GL_INVALID_OPERATION);
8215 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008216
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008217 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8218 if (!programBinary)
8219 {
8220 return gl::error(GL_INVALID_OPERATION);
8221 }
8222
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008223 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008224 {
8225 return gl::error(GL_INVALID_OPERATION);
8226 }
8227 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008228 }
8229 catch(std::bad_alloc&)
8230 {
8231 return gl::error(GL_OUT_OF_MEMORY);
8232 }
8233}
8234
8235void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8236{
8237 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8238 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8239 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8240
8241 try
8242 {
8243 gl::Context *context = gl::getNonLostContext();
8244
8245 if (context)
8246 {
8247 if (context->getClientVersion() < 3)
8248 {
8249 return gl::error(GL_INVALID_OPERATION);
8250 }
8251 }
8252
8253 UNIMPLEMENTED();
8254 }
8255 catch(std::bad_alloc&)
8256 {
8257 return gl::error(GL_OUT_OF_MEMORY);
8258 }
8259}
8260
8261void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8262{
8263 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8264 target, samples, internalformat, width, height);
8265
8266 try
8267 {
8268 gl::Context *context = gl::getNonLostContext();
8269
8270 if (context)
8271 {
8272 if (context->getClientVersion() < 3)
8273 {
8274 return gl::error(GL_INVALID_OPERATION);
8275 }
8276 }
8277
8278 UNIMPLEMENTED();
8279 }
8280 catch(std::bad_alloc&)
8281 {
8282 return gl::error(GL_OUT_OF_MEMORY);
8283 }
8284}
8285
8286void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8287{
8288 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8289 target, attachment, texture, level, layer);
8290
8291 try
8292 {
8293 gl::Context *context = gl::getNonLostContext();
8294
8295 if (context)
8296 {
8297 if (context->getClientVersion() < 3)
8298 {
8299 return gl::error(GL_INVALID_OPERATION);
8300 }
8301 }
8302
8303 UNIMPLEMENTED();
8304 }
8305 catch(std::bad_alloc&)
8306 {
8307 return gl::error(GL_OUT_OF_MEMORY);
8308 }
8309}
8310
8311GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8312{
8313 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8314 target, offset, length, access);
8315
8316 try
8317 {
8318 gl::Context *context = gl::getNonLostContext();
8319
8320 if (context)
8321 {
8322 if (context->getClientVersion() < 3)
8323 {
8324 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8325 }
8326 }
8327
8328 UNIMPLEMENTED();
8329 }
8330 catch(std::bad_alloc&)
8331 {
8332 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8333 }
8334
8335 return NULL;
8336}
8337
8338void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8339{
8340 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8341
8342 try
8343 {
8344 gl::Context *context = gl::getNonLostContext();
8345
8346 if (context)
8347 {
8348 if (context->getClientVersion() < 3)
8349 {
8350 return gl::error(GL_INVALID_OPERATION);
8351 }
8352 }
8353
8354 UNIMPLEMENTED();
8355 }
8356 catch(std::bad_alloc&)
8357 {
8358 return gl::error(GL_OUT_OF_MEMORY);
8359 }
8360}
8361
8362void __stdcall glBindVertexArray(GLuint array)
8363{
8364 EVENT("(GLuint array = %u)", array);
8365
8366 try
8367 {
8368 gl::Context *context = gl::getNonLostContext();
8369
8370 if (context)
8371 {
8372 if (context->getClientVersion() < 3)
8373 {
8374 return gl::error(GL_INVALID_OPERATION);
8375 }
8376 }
8377
8378 UNIMPLEMENTED();
8379 }
8380 catch(std::bad_alloc&)
8381 {
8382 return gl::error(GL_OUT_OF_MEMORY);
8383 }
8384}
8385
8386void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8387{
8388 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8389
8390 try
8391 {
8392 gl::Context *context = gl::getNonLostContext();
8393
8394 if (context)
8395 {
8396 if (context->getClientVersion() < 3)
8397 {
8398 return gl::error(GL_INVALID_OPERATION);
8399 }
8400 }
8401
8402 UNIMPLEMENTED();
8403 }
8404 catch(std::bad_alloc&)
8405 {
8406 return gl::error(GL_OUT_OF_MEMORY);
8407 }
8408}
8409
8410void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8411{
8412 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8413
8414 try
8415 {
8416 gl::Context *context = gl::getNonLostContext();
8417
8418 if (context)
8419 {
8420 if (context->getClientVersion() < 3)
8421 {
8422 return gl::error(GL_INVALID_OPERATION);
8423 }
8424 }
8425
8426 UNIMPLEMENTED();
8427 }
8428 catch(std::bad_alloc&)
8429 {
8430 return gl::error(GL_OUT_OF_MEMORY);
8431 }
8432}
8433
8434GLboolean __stdcall glIsVertexArray(GLuint array)
8435{
8436 EVENT("(GLuint array = %u)", array);
8437
8438 try
8439 {
8440 gl::Context *context = gl::getNonLostContext();
8441
8442 if (context)
8443 {
8444 if (context->getClientVersion() < 3)
8445 {
8446 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8447 }
8448 }
8449
8450 UNIMPLEMENTED();
8451 }
8452 catch(std::bad_alloc&)
8453 {
8454 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8455 }
8456
8457 return GL_FALSE;
8458}
8459
8460void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8461{
8462 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8463 target, index, data);
8464
8465 try
8466 {
8467 gl::Context *context = gl::getNonLostContext();
8468
8469 if (context)
8470 {
8471 if (context->getClientVersion() < 3)
8472 {
8473 return gl::error(GL_INVALID_OPERATION);
8474 }
8475 }
8476
8477 UNIMPLEMENTED();
8478 }
8479 catch(std::bad_alloc&)
8480 {
8481 return gl::error(GL_OUT_OF_MEMORY);
8482 }
8483}
8484
8485void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8486{
8487 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8488
8489 try
8490 {
8491 gl::Context *context = gl::getNonLostContext();
8492
8493 if (context)
8494 {
8495 if (context->getClientVersion() < 3)
8496 {
8497 return gl::error(GL_INVALID_OPERATION);
8498 }
8499 }
8500
8501 UNIMPLEMENTED();
8502 }
8503 catch(std::bad_alloc&)
8504 {
8505 return gl::error(GL_OUT_OF_MEMORY);
8506 }
8507}
8508
8509void __stdcall glEndTransformFeedback(void)
8510{
8511 EVENT("(void)");
8512
8513 try
8514 {
8515 gl::Context *context = gl::getNonLostContext();
8516
8517 if (context)
8518 {
8519 if (context->getClientVersion() < 3)
8520 {
8521 return gl::error(GL_INVALID_OPERATION);
8522 }
8523 }
8524
8525 UNIMPLEMENTED();
8526 }
8527 catch(std::bad_alloc&)
8528 {
8529 return gl::error(GL_OUT_OF_MEMORY);
8530 }
8531}
8532
8533void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8534{
8535 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8536 target, index, buffer, offset, size);
8537
8538 try
8539 {
8540 gl::Context *context = gl::getNonLostContext();
8541
8542 if (context)
8543 {
8544 if (context->getClientVersion() < 3)
8545 {
8546 return gl::error(GL_INVALID_OPERATION);
8547 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008548
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008549 switch (target)
8550 {
8551 case GL_TRANSFORM_FEEDBACK_BUFFER:
8552 if (index > context->getMaxTransformFeedbackBufferBindings())
8553 {
8554 return gl::error(GL_INVALID_VALUE);
8555 }
8556 break;
8557
8558 case GL_UNIFORM_BUFFER:
8559 if (index >= context->getMaximumCombinedUniformBufferBindings())
8560 {
8561 return gl::error(GL_INVALID_VALUE);
8562 }
8563 break;
8564
8565 default:
8566 return gl::error(GL_INVALID_ENUM);
8567 }
8568
8569 gl::Buffer *bufferObject = context->getBuffer(buffer);
8570 if (!bufferObject)
8571 {
8572 // Buffer index must not have been valid
8573 return gl::error(GL_INVALID_VALUE);
8574 }
8575
8576 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
8577 {
8578 return gl::error(GL_INVALID_VALUE);
8579 }
8580
8581 switch (target)
8582 {
8583 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008584 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8585 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008586 break;
8587
8588 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008589 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8590 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008591 break;
8592
8593 default:
8594 UNREACHABLE();
8595 }
8596 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008597 }
8598 catch(std::bad_alloc&)
8599 {
8600 return gl::error(GL_OUT_OF_MEMORY);
8601 }
8602}
8603
8604void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8605{
8606 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8607 target, index, buffer);
8608
8609 try
8610 {
8611 gl::Context *context = gl::getNonLostContext();
8612
8613 if (context)
8614 {
8615 if (context->getClientVersion() < 3)
8616 {
8617 return gl::error(GL_INVALID_OPERATION);
8618 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008619
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008620 switch (target)
8621 {
8622 case GL_TRANSFORM_FEEDBACK_BUFFER:
8623 if (index > context->getMaxTransformFeedbackBufferBindings())
8624 {
8625 return gl::error(GL_INVALID_VALUE);
8626 }
8627 break;
8628
8629 case GL_UNIFORM_BUFFER:
8630 if (index > context->getMaximumCombinedUniformBufferBindings())
8631 {
8632 return gl::error(GL_INVALID_VALUE);
8633 }
8634 break;
8635
8636 default:
8637 return gl::error(GL_INVALID_ENUM);
8638 }
8639
8640 gl::Buffer *bufferObject = context->getBuffer(buffer);
8641 if (!bufferObject)
8642 {
8643 // Buffer index must not have been valid
8644 return gl::error(GL_INVALID_VALUE);
8645 }
8646
8647 switch (target)
8648 {
8649 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008650 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, -1);
8651 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008652 break;
8653
8654 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008655 context->bindIndexedUniformBuffer(buffer, index, 0, -1);
8656 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008657 break;
8658
8659 default:
8660 UNREACHABLE();
8661 }
8662 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008663 }
8664 catch(std::bad_alloc&)
8665 {
8666 return gl::error(GL_OUT_OF_MEMORY);
8667 }
8668}
8669
8670void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8671{
8672 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8673 program, count, varyings, bufferMode);
8674
8675 try
8676 {
8677 gl::Context *context = gl::getNonLostContext();
8678
8679 if (context)
8680 {
8681 if (context->getClientVersion() < 3)
8682 {
8683 return gl::error(GL_INVALID_OPERATION);
8684 }
8685 }
8686
8687 UNIMPLEMENTED();
8688 }
8689 catch(std::bad_alloc&)
8690 {
8691 return gl::error(GL_OUT_OF_MEMORY);
8692 }
8693}
8694
8695void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8696{
8697 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8698 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8699 program, index, bufSize, length, size, type, name);
8700
8701 try
8702 {
8703 gl::Context *context = gl::getNonLostContext();
8704
8705 if (context)
8706 {
8707 if (context->getClientVersion() < 3)
8708 {
8709 return gl::error(GL_INVALID_OPERATION);
8710 }
8711 }
8712
8713 UNIMPLEMENTED();
8714 }
8715 catch(std::bad_alloc&)
8716 {
8717 return gl::error(GL_OUT_OF_MEMORY);
8718 }
8719}
8720
8721void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8722{
8723 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8724 index, size, type, stride, pointer);
8725
8726 try
8727 {
8728 gl::Context *context = gl::getNonLostContext();
8729
8730 if (context)
8731 {
8732 if (context->getClientVersion() < 3)
8733 {
8734 return gl::error(GL_INVALID_OPERATION);
8735 }
8736 }
8737
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008738 if (index >= gl::MAX_VERTEX_ATTRIBS)
8739 {
8740 return gl::error(GL_INVALID_VALUE);
8741 }
8742
8743 if (size < 1 || size > 4)
8744 {
8745 return gl::error(GL_INVALID_VALUE);
8746 }
8747
8748 switch (type)
8749 {
8750 case GL_BYTE:
8751 case GL_UNSIGNED_BYTE:
8752 case GL_SHORT:
8753 case GL_UNSIGNED_SHORT:
8754 case GL_INT:
8755 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008756 case GL_INT_2_10_10_10_REV:
8757 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008758 break;
8759 default:
8760 return gl::error(GL_INVALID_ENUM);
8761 }
8762
8763 if (stride < 0)
8764 {
8765 return gl::error(GL_INVALID_VALUE);
8766 }
8767
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008768 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8769 {
8770 return gl::error(GL_INVALID_OPERATION);
8771 }
8772
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008773 if (context)
8774 {
8775 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8776 stride, pointer);
8777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008778 }
8779 catch(std::bad_alloc&)
8780 {
8781 return gl::error(GL_OUT_OF_MEMORY);
8782 }
8783}
8784
8785void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8786{
8787 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8788 index, pname, params);
8789
8790 try
8791 {
8792 gl::Context *context = gl::getNonLostContext();
8793
8794 if (context)
8795 {
8796 if (context->getClientVersion() < 3)
8797 {
8798 return gl::error(GL_INVALID_OPERATION);
8799 }
8800 }
8801
8802 UNIMPLEMENTED();
8803 }
8804 catch(std::bad_alloc&)
8805 {
8806 return gl::error(GL_OUT_OF_MEMORY);
8807 }
8808}
8809
8810void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8811{
8812 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8813 index, pname, params);
8814
8815 try
8816 {
8817 gl::Context *context = gl::getNonLostContext();
8818
8819 if (context)
8820 {
8821 if (context->getClientVersion() < 3)
8822 {
8823 return gl::error(GL_INVALID_OPERATION);
8824 }
8825 }
8826
8827 UNIMPLEMENTED();
8828 }
8829 catch(std::bad_alloc&)
8830 {
8831 return gl::error(GL_OUT_OF_MEMORY);
8832 }
8833}
8834
8835void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8836{
8837 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8838 index, x, y, z, w);
8839
8840 try
8841 {
8842 gl::Context *context = gl::getNonLostContext();
8843
8844 if (context)
8845 {
8846 if (context->getClientVersion() < 3)
8847 {
8848 return gl::error(GL_INVALID_OPERATION);
8849 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008850
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008851 if (index >= gl::MAX_VERTEX_ATTRIBS)
8852 {
8853 return gl::error(GL_INVALID_VALUE);
8854 }
8855
8856 GLint vals[4] = { x, y, z, w };
8857 context->setVertexAttribi(index, vals);
8858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008859 }
8860 catch(std::bad_alloc&)
8861 {
8862 return gl::error(GL_OUT_OF_MEMORY);
8863 }
8864}
8865
8866void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8867{
8868 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8869 index, x, y, z, w);
8870
8871 try
8872 {
8873 gl::Context *context = gl::getNonLostContext();
8874
8875 if (context)
8876 {
8877 if (context->getClientVersion() < 3)
8878 {
8879 return gl::error(GL_INVALID_OPERATION);
8880 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008881
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008882 if (index >= gl::MAX_VERTEX_ATTRIBS)
8883 {
8884 return gl::error(GL_INVALID_VALUE);
8885 }
8886
8887 GLuint vals[4] = { x, y, z, w };
8888 context->setVertexAttribu(index, vals);
8889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008890 }
8891 catch(std::bad_alloc&)
8892 {
8893 return gl::error(GL_OUT_OF_MEMORY);
8894 }
8895}
8896
8897void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8898{
8899 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8900
8901 try
8902 {
8903 gl::Context *context = gl::getNonLostContext();
8904
8905 if (context)
8906 {
8907 if (context->getClientVersion() < 3)
8908 {
8909 return gl::error(GL_INVALID_OPERATION);
8910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008911
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008912 if (index >= gl::MAX_VERTEX_ATTRIBS)
8913 {
8914 return gl::error(GL_INVALID_VALUE);
8915 }
8916
8917 context->setVertexAttribi(index, v);
8918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008919 }
8920 catch(std::bad_alloc&)
8921 {
8922 return gl::error(GL_OUT_OF_MEMORY);
8923 }
8924}
8925
8926void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8927{
8928 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8929
8930 try
8931 {
8932 gl::Context *context = gl::getNonLostContext();
8933
8934 if (context)
8935 {
8936 if (context->getClientVersion() < 3)
8937 {
8938 return gl::error(GL_INVALID_OPERATION);
8939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008940
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008941 if (index >= gl::MAX_VERTEX_ATTRIBS)
8942 {
8943 return gl::error(GL_INVALID_VALUE);
8944 }
8945
8946 context->setVertexAttribu(index, v);
8947 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008948 }
8949 catch(std::bad_alloc&)
8950 {
8951 return gl::error(GL_OUT_OF_MEMORY);
8952 }
8953}
8954
8955void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8956{
8957 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8958 program, location, params);
8959
8960 try
8961 {
8962 gl::Context *context = gl::getNonLostContext();
8963
8964 if (context)
8965 {
8966 if (context->getClientVersion() < 3)
8967 {
8968 return gl::error(GL_INVALID_OPERATION);
8969 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008970
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008971 if (program == 0)
8972 {
8973 return gl::error(GL_INVALID_VALUE);
8974 }
8975
8976 gl::Program *programObject = context->getProgram(program);
8977
8978 if (!programObject || !programObject->isLinked())
8979 {
8980 return gl::error(GL_INVALID_OPERATION);
8981 }
8982
8983 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8984 if (!programBinary)
8985 {
8986 return gl::error(GL_INVALID_OPERATION);
8987 }
8988
8989 if (!programBinary->getUniformuiv(location, NULL, params))
8990 {
8991 return gl::error(GL_INVALID_OPERATION);
8992 }
8993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008994 }
8995 catch(std::bad_alloc&)
8996 {
8997 return gl::error(GL_OUT_OF_MEMORY);
8998 }
8999}
9000
9001GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9002{
9003 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9004 program, name);
9005
9006 try
9007 {
9008 gl::Context *context = gl::getNonLostContext();
9009
9010 if (context)
9011 {
9012 if (context->getClientVersion() < 3)
9013 {
9014 return gl::error(GL_INVALID_OPERATION, 0);
9015 }
9016 }
9017
9018 UNIMPLEMENTED();
9019 }
9020 catch(std::bad_alloc&)
9021 {
9022 return gl::error(GL_OUT_OF_MEMORY, 0);
9023 }
9024
9025 return 0;
9026}
9027
9028void __stdcall glUniform1ui(GLint location, GLuint v0)
9029{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009030 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009031}
9032
9033void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9034{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009035 const GLuint xy[] = { v0, v1 };
9036 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009037}
9038
9039void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9040{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009041 const GLuint xyz[] = { v0, v1, v2 };
9042 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009043}
9044
9045void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9046{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009047 const GLuint xyzw[] = { v0, v1, v2, v3 };
9048 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009049}
9050
9051void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9052{
9053 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9054 location, count, value);
9055
9056 try
9057 {
9058 gl::Context *context = gl::getNonLostContext();
9059
9060 if (context)
9061 {
9062 if (context->getClientVersion() < 3)
9063 {
9064 return gl::error(GL_INVALID_OPERATION);
9065 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009066
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009067 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9068 if (!programBinary)
9069 {
9070 return gl::error(GL_INVALID_OPERATION);
9071 }
9072
9073 if (!programBinary->setUniform1uiv(location, count, value))
9074 {
9075 return gl::error(GL_INVALID_OPERATION);
9076 }
9077 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009078 }
9079 catch(std::bad_alloc&)
9080 {
9081 return gl::error(GL_OUT_OF_MEMORY);
9082 }
9083}
9084
9085void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9086{
9087 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9088 location, count, value);
9089
9090 try
9091 {
9092 gl::Context *context = gl::getNonLostContext();
9093
9094 if (context)
9095 {
9096 if (context->getClientVersion() < 3)
9097 {
9098 return gl::error(GL_INVALID_OPERATION);
9099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009100
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009101 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9102 if (!programBinary)
9103 {
9104 return gl::error(GL_INVALID_OPERATION);
9105 }
9106
9107 if (!programBinary->setUniform2uiv(location, count, value))
9108 {
9109 return gl::error(GL_INVALID_OPERATION);
9110 }
9111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009112 }
9113 catch(std::bad_alloc&)
9114 {
9115 return gl::error(GL_OUT_OF_MEMORY);
9116 }
9117}
9118
9119void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9120{
9121 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9122 location, count, value);
9123
9124 try
9125 {
9126 gl::Context *context = gl::getNonLostContext();
9127
9128 if (context)
9129 {
9130 if (context->getClientVersion() < 3)
9131 {
9132 return gl::error(GL_INVALID_OPERATION);
9133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009134
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009135 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9136 if (!programBinary)
9137 {
9138 return gl::error(GL_INVALID_OPERATION);
9139 }
9140
9141 if (!programBinary->setUniform3uiv(location, count, value))
9142 {
9143 return gl::error(GL_INVALID_OPERATION);
9144 }
9145 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009146 }
9147 catch(std::bad_alloc&)
9148 {
9149 return gl::error(GL_OUT_OF_MEMORY);
9150 }
9151}
9152
9153void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9154{
9155 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9156 location, count, value);
9157
9158 try
9159 {
9160 gl::Context *context = gl::getNonLostContext();
9161
9162 if (context)
9163 {
9164 if (context->getClientVersion() < 3)
9165 {
9166 return gl::error(GL_INVALID_OPERATION);
9167 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009168
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009169 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9170 if (!programBinary)
9171 {
9172 return gl::error(GL_INVALID_OPERATION);
9173 }
9174
9175 if (!programBinary->setUniform4uiv(location, count, value))
9176 {
9177 return gl::error(GL_INVALID_OPERATION);
9178 }
9179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009180 }
9181 catch(std::bad_alloc&)
9182 {
9183 return gl::error(GL_OUT_OF_MEMORY);
9184 }
9185}
9186
9187void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9188{
9189 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9190 buffer, drawbuffer, value);
9191
9192 try
9193 {
9194 gl::Context *context = gl::getNonLostContext();
9195
9196 if (context)
9197 {
9198 if (context->getClientVersion() < 3)
9199 {
9200 return gl::error(GL_INVALID_OPERATION);
9201 }
9202 }
9203
9204 UNIMPLEMENTED();
9205 }
9206 catch(std::bad_alloc&)
9207 {
9208 return gl::error(GL_OUT_OF_MEMORY);
9209 }
9210}
9211
9212void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9213{
9214 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9215 buffer, drawbuffer, value);
9216
9217 try
9218 {
9219 gl::Context *context = gl::getNonLostContext();
9220
9221 if (context)
9222 {
9223 if (context->getClientVersion() < 3)
9224 {
9225 return gl::error(GL_INVALID_OPERATION);
9226 }
9227 }
9228
9229 UNIMPLEMENTED();
9230 }
9231 catch(std::bad_alloc&)
9232 {
9233 return gl::error(GL_OUT_OF_MEMORY);
9234 }
9235}
9236
9237void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9238{
9239 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9240 buffer, drawbuffer, value);
9241
9242 try
9243 {
9244 gl::Context *context = gl::getNonLostContext();
9245
9246 if (context)
9247 {
9248 if (context->getClientVersion() < 3)
9249 {
9250 return gl::error(GL_INVALID_OPERATION);
9251 }
9252 }
9253
9254 UNIMPLEMENTED();
9255 }
9256 catch(std::bad_alloc&)
9257 {
9258 return gl::error(GL_OUT_OF_MEMORY);
9259 }
9260}
9261
9262void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9263{
9264 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9265 buffer, drawbuffer, depth, stencil);
9266
9267 try
9268 {
9269 gl::Context *context = gl::getNonLostContext();
9270
9271 if (context)
9272 {
9273 if (context->getClientVersion() < 3)
9274 {
9275 return gl::error(GL_INVALID_OPERATION);
9276 }
9277 }
9278
9279 UNIMPLEMENTED();
9280 }
9281 catch(std::bad_alloc&)
9282 {
9283 return gl::error(GL_OUT_OF_MEMORY);
9284 }
9285}
9286
9287const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9288{
9289 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9290
9291 try
9292 {
9293 gl::Context *context = gl::getNonLostContext();
9294
9295 if (context)
9296 {
9297 if (context->getClientVersion() < 3)
9298 {
9299 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9300 }
9301 }
9302
9303 UNIMPLEMENTED();
9304 }
9305 catch(std::bad_alloc&)
9306 {
9307 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9308 }
9309
9310 return NULL;
9311}
9312
9313void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9314{
9315 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9316 readTarget, writeTarget, readOffset, writeOffset, size);
9317
9318 try
9319 {
9320 gl::Context *context = gl::getNonLostContext();
9321
9322 if (context)
9323 {
9324 if (context->getClientVersion() < 3)
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009328
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009329 gl::Buffer *readBuffer = NULL;
9330 switch (readTarget)
9331 {
9332 case GL_ARRAY_BUFFER:
9333 readBuffer = context->getArrayBuffer();
9334 break;
9335 case GL_COPY_READ_BUFFER:
9336 readBuffer = context->getCopyReadBuffer();
9337 break;
9338 case GL_COPY_WRITE_BUFFER:
9339 readBuffer = context->getCopyWriteBuffer();
9340 break;
9341 case GL_ELEMENT_ARRAY_BUFFER:
9342 readBuffer = context->getElementArrayBuffer();
9343 break;
9344 case GL_PIXEL_PACK_BUFFER:
9345 readBuffer = context->getPixelPackBuffer();
9346 break;
9347 case GL_PIXEL_UNPACK_BUFFER:
9348 readBuffer = context->getPixelUnpackBuffer();
9349 break;
9350 case GL_TRANSFORM_FEEDBACK_BUFFER:
9351 readBuffer = context->getGenericTransformFeedbackBuffer();
9352 break;
9353 case GL_UNIFORM_BUFFER:
9354 readBuffer = context->getGenericUniformBuffer();
9355 break;
9356 default:
9357 return gl::error(GL_INVALID_ENUM);
9358 }
9359
9360 gl::Buffer *writeBuffer = NULL;
9361 switch (writeTarget)
9362 {
9363 case GL_ARRAY_BUFFER:
9364 writeBuffer = context->getArrayBuffer();
9365 break;
9366 case GL_COPY_READ_BUFFER:
9367 writeBuffer = context->getCopyReadBuffer();
9368 break;
9369 case GL_COPY_WRITE_BUFFER:
9370 writeBuffer = context->getCopyWriteBuffer();
9371 break;
9372 case GL_ELEMENT_ARRAY_BUFFER:
9373 writeBuffer = context->getElementArrayBuffer();
9374 break;
9375 case GL_PIXEL_PACK_BUFFER:
9376 writeBuffer = context->getPixelPackBuffer();
9377 break;
9378 case GL_PIXEL_UNPACK_BUFFER:
9379 writeBuffer = context->getPixelUnpackBuffer();
9380 break;
9381 case GL_TRANSFORM_FEEDBACK_BUFFER:
9382 writeBuffer = context->getGenericTransformFeedbackBuffer();
9383 break;
9384 case GL_UNIFORM_BUFFER:
9385 writeBuffer = context->getGenericUniformBuffer();
9386 break;
9387 default:
9388 return gl::error(GL_INVALID_ENUM);
9389 }
9390
9391 if (!readBuffer || !writeBuffer)
9392 {
9393 return gl::error(GL_INVALID_OPERATION);
9394 }
9395
9396 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9397 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9398 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9399 {
9400 return gl::error(GL_INVALID_VALUE);
9401 }
9402
9403 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9404 {
9405 return gl::error(GL_INVALID_VALUE);
9406 }
9407
9408 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9409
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009410 // if size is zero, the copy is a successful no-op
9411 if (size > 0)
9412 {
9413 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9414 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009415 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009416 }
9417 catch(std::bad_alloc&)
9418 {
9419 return gl::error(GL_OUT_OF_MEMORY);
9420 }
9421}
9422
9423void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9424{
9425 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9426 program, uniformCount, uniformNames, uniformIndices);
9427
9428 try
9429 {
9430 gl::Context *context = gl::getNonLostContext();
9431
9432 if (context)
9433 {
9434 if (context->getClientVersion() < 3)
9435 {
9436 return gl::error(GL_INVALID_OPERATION);
9437 }
9438 }
9439
9440 UNIMPLEMENTED();
9441 }
9442 catch(std::bad_alloc&)
9443 {
9444 return gl::error(GL_OUT_OF_MEMORY);
9445 }
9446}
9447
9448void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9449{
9450 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9451 program, uniformCount, uniformIndices, pname, params);
9452
9453 try
9454 {
9455 gl::Context *context = gl::getNonLostContext();
9456
9457 if (context)
9458 {
9459 if (context->getClientVersion() < 3)
9460 {
9461 return gl::error(GL_INVALID_OPERATION);
9462 }
9463 }
9464
9465 UNIMPLEMENTED();
9466 }
9467 catch(std::bad_alloc&)
9468 {
9469 return gl::error(GL_OUT_OF_MEMORY);
9470 }
9471}
9472
9473GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9474{
9475 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9476
9477 try
9478 {
9479 gl::Context *context = gl::getNonLostContext();
9480
9481 if (context)
9482 {
9483 if (context->getClientVersion() < 3)
9484 {
9485 return gl::error(GL_INVALID_OPERATION, 0);
9486 }
9487 }
9488
9489 UNIMPLEMENTED();
9490 }
9491 catch(std::bad_alloc&)
9492 {
9493 return gl::error(GL_OUT_OF_MEMORY, 0);
9494 }
9495
9496 return 0;
9497}
9498
9499void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9500{
9501 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9502 program, uniformBlockIndex, pname, params);
9503
9504 try
9505 {
9506 gl::Context *context = gl::getNonLostContext();
9507
9508 if (context)
9509 {
9510 if (context->getClientVersion() < 3)
9511 {
9512 return gl::error(GL_INVALID_OPERATION);
9513 }
9514 }
9515
9516 UNIMPLEMENTED();
9517 }
9518 catch(std::bad_alloc&)
9519 {
9520 return gl::error(GL_OUT_OF_MEMORY);
9521 }
9522}
9523
9524void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9525{
9526 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9527 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9528
9529 try
9530 {
9531 gl::Context *context = gl::getNonLostContext();
9532
9533 if (context)
9534 {
9535 if (context->getClientVersion() < 3)
9536 {
9537 return gl::error(GL_INVALID_OPERATION);
9538 }
9539 }
9540
9541 UNIMPLEMENTED();
9542 }
9543 catch(std::bad_alloc&)
9544 {
9545 return gl::error(GL_OUT_OF_MEMORY);
9546 }
9547}
9548
9549void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9550{
9551 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9552 program, uniformBlockIndex, uniformBlockBinding);
9553
9554 try
9555 {
9556 gl::Context *context = gl::getNonLostContext();
9557
9558 if (context)
9559 {
9560 if (context->getClientVersion() < 3)
9561 {
9562 return gl::error(GL_INVALID_OPERATION);
9563 }
9564 }
9565
9566 UNIMPLEMENTED();
9567 }
9568 catch(std::bad_alloc&)
9569 {
9570 return gl::error(GL_OUT_OF_MEMORY);
9571 }
9572}
9573
9574void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9575{
9576 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9577 mode, first, count, instanceCount);
9578
9579 try
9580 {
9581 gl::Context *context = gl::getNonLostContext();
9582
9583 if (context)
9584 {
9585 if (context->getClientVersion() < 3)
9586 {
9587 return gl::error(GL_INVALID_OPERATION);
9588 }
9589 }
9590
9591 UNIMPLEMENTED();
9592 }
9593 catch(std::bad_alloc&)
9594 {
9595 return gl::error(GL_OUT_OF_MEMORY);
9596 }
9597}
9598
9599void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9600{
9601 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9602 mode, count, type, indices, instanceCount);
9603
9604 try
9605 {
9606 gl::Context *context = gl::getNonLostContext();
9607
9608 if (context)
9609 {
9610 if (context->getClientVersion() < 3)
9611 {
9612 return gl::error(GL_INVALID_OPERATION);
9613 }
9614 }
9615
9616 UNIMPLEMENTED();
9617 }
9618 catch(std::bad_alloc&)
9619 {
9620 return gl::error(GL_OUT_OF_MEMORY);
9621 }
9622}
9623
9624GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9625{
9626 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9627
9628 try
9629 {
9630 gl::Context *context = gl::getNonLostContext();
9631
9632 if (context)
9633 {
9634 if (context->getClientVersion() < 3)
9635 {
9636 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9637 }
9638 }
9639
9640 UNIMPLEMENTED();
9641 }
9642 catch(std::bad_alloc&)
9643 {
9644 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9645 }
9646
9647 return NULL;
9648}
9649
9650GLboolean __stdcall glIsSync(GLsync sync)
9651{
9652 EVENT("(GLsync sync = 0x%0.8p)", sync);
9653
9654 try
9655 {
9656 gl::Context *context = gl::getNonLostContext();
9657
9658 if (context)
9659 {
9660 if (context->getClientVersion() < 3)
9661 {
9662 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9663 }
9664 }
9665
9666 UNIMPLEMENTED();
9667 }
9668 catch(std::bad_alloc&)
9669 {
9670 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9671 }
9672
9673 return GL_FALSE;
9674}
9675
9676void __stdcall glDeleteSync(GLsync sync)
9677{
9678 EVENT("(GLsync sync = 0x%0.8p)", sync);
9679
9680 try
9681 {
9682 gl::Context *context = gl::getNonLostContext();
9683
9684 if (context)
9685 {
9686 if (context->getClientVersion() < 3)
9687 {
9688 return gl::error(GL_INVALID_OPERATION);
9689 }
9690 }
9691
9692 UNIMPLEMENTED();
9693 }
9694 catch(std::bad_alloc&)
9695 {
9696 return gl::error(GL_OUT_OF_MEMORY);
9697 }
9698}
9699
9700GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9701{
9702 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9703 sync, flags, timeout);
9704
9705 try
9706 {
9707 gl::Context *context = gl::getNonLostContext();
9708
9709 if (context)
9710 {
9711 if (context->getClientVersion() < 3)
9712 {
9713 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9714 }
9715 }
9716
9717 UNIMPLEMENTED();
9718 }
9719 catch(std::bad_alloc&)
9720 {
9721 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9722 }
9723
9724 return GL_FALSE;
9725}
9726
9727void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9728{
9729 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9730 sync, flags, timeout);
9731
9732 try
9733 {
9734 gl::Context *context = gl::getNonLostContext();
9735
9736 if (context)
9737 {
9738 if (context->getClientVersion() < 3)
9739 {
9740 return gl::error(GL_INVALID_OPERATION);
9741 }
9742 }
9743
9744 UNIMPLEMENTED();
9745 }
9746 catch(std::bad_alloc&)
9747 {
9748 return gl::error(GL_OUT_OF_MEMORY);
9749 }
9750}
9751
9752void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9753{
9754 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9755 pname, params);
9756
9757 try
9758 {
9759 gl::Context *context = gl::getNonLostContext();
9760
9761 if (context)
9762 {
9763 if (context->getClientVersion() < 3)
9764 {
9765 return gl::error(GL_INVALID_OPERATION);
9766 }
9767 }
9768
9769 UNIMPLEMENTED();
9770 }
9771 catch(std::bad_alloc&)
9772 {
9773 return gl::error(GL_OUT_OF_MEMORY);
9774 }
9775}
9776
9777void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9778{
9779 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9780 sync, pname, bufSize, length, values);
9781
9782 try
9783 {
9784 gl::Context *context = gl::getNonLostContext();
9785
9786 if (context)
9787 {
9788 if (context->getClientVersion() < 3)
9789 {
9790 return gl::error(GL_INVALID_OPERATION);
9791 }
9792 }
9793
9794 UNIMPLEMENTED();
9795 }
9796 catch(std::bad_alloc&)
9797 {
9798 return gl::error(GL_OUT_OF_MEMORY);
9799 }
9800}
9801
9802void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9803{
9804 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9805 target, index, data);
9806
9807 try
9808 {
9809 gl::Context *context = gl::getNonLostContext();
9810
9811 if (context)
9812 {
9813 if (context->getClientVersion() < 3)
9814 {
9815 return gl::error(GL_INVALID_OPERATION);
9816 }
9817 }
9818
9819 UNIMPLEMENTED();
9820 }
9821 catch(std::bad_alloc&)
9822 {
9823 return gl::error(GL_OUT_OF_MEMORY);
9824 }
9825}
9826
9827void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9828{
9829 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9830 target, pname, params);
9831
9832 try
9833 {
9834 gl::Context *context = gl::getNonLostContext();
9835
9836 if (context)
9837 {
9838 if (context->getClientVersion() < 3)
9839 {
9840 return gl::error(GL_INVALID_OPERATION);
9841 }
9842 }
9843
9844 UNIMPLEMENTED();
9845 }
9846 catch(std::bad_alloc&)
9847 {
9848 return gl::error(GL_OUT_OF_MEMORY);
9849 }
9850}
9851
9852void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9853{
9854 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9855
9856 try
9857 {
9858 gl::Context *context = gl::getNonLostContext();
9859
9860 if (context)
9861 {
9862 if (context->getClientVersion() < 3)
9863 {
9864 return gl::error(GL_INVALID_OPERATION);
9865 }
9866 }
9867
9868 UNIMPLEMENTED();
9869 }
9870 catch(std::bad_alloc&)
9871 {
9872 return gl::error(GL_OUT_OF_MEMORY);
9873 }
9874}
9875
9876void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9877{
9878 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9879
9880 try
9881 {
9882 gl::Context *context = gl::getNonLostContext();
9883
9884 if (context)
9885 {
9886 if (context->getClientVersion() < 3)
9887 {
9888 return gl::error(GL_INVALID_OPERATION);
9889 }
9890 }
9891
9892 UNIMPLEMENTED();
9893 }
9894 catch(std::bad_alloc&)
9895 {
9896 return gl::error(GL_OUT_OF_MEMORY);
9897 }
9898}
9899
9900GLboolean __stdcall glIsSampler(GLuint sampler)
9901{
9902 EVENT("(GLuint sampler = %u)", sampler);
9903
9904 try
9905 {
9906 gl::Context *context = gl::getNonLostContext();
9907
9908 if (context)
9909 {
9910 if (context->getClientVersion() < 3)
9911 {
9912 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9913 }
9914 }
9915
9916 UNIMPLEMENTED();
9917 }
9918 catch(std::bad_alloc&)
9919 {
9920 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9921 }
9922
9923 return GL_FALSE;
9924}
9925
9926void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9927{
9928 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9929
9930 try
9931 {
9932 gl::Context *context = gl::getNonLostContext();
9933
9934 if (context)
9935 {
9936 if (context->getClientVersion() < 3)
9937 {
9938 return gl::error(GL_INVALID_OPERATION);
9939 }
9940 }
9941
9942 UNIMPLEMENTED();
9943 }
9944 catch(std::bad_alloc&)
9945 {
9946 return gl::error(GL_OUT_OF_MEMORY);
9947 }
9948}
9949
9950void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9951{
9952 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9953
9954 try
9955 {
9956 gl::Context *context = gl::getNonLostContext();
9957
9958 if (context)
9959 {
9960 if (context->getClientVersion() < 3)
9961 {
9962 return gl::error(GL_INVALID_OPERATION);
9963 }
9964 }
9965
9966 UNIMPLEMENTED();
9967 }
9968 catch(std::bad_alloc&)
9969 {
9970 return gl::error(GL_OUT_OF_MEMORY);
9971 }
9972}
9973
9974void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9975{
9976 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9977 sampler, pname, param);
9978
9979 try
9980 {
9981 gl::Context *context = gl::getNonLostContext();
9982
9983 if (context)
9984 {
9985 if (context->getClientVersion() < 3)
9986 {
9987 return gl::error(GL_INVALID_OPERATION);
9988 }
9989 }
9990
9991 UNIMPLEMENTED();
9992 }
9993 catch(std::bad_alloc&)
9994 {
9995 return gl::error(GL_OUT_OF_MEMORY);
9996 }
9997}
9998
9999void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10000{
10001 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10002
10003 try
10004 {
10005 gl::Context *context = gl::getNonLostContext();
10006
10007 if (context)
10008 {
10009 if (context->getClientVersion() < 3)
10010 {
10011 return gl::error(GL_INVALID_OPERATION);
10012 }
10013 }
10014
10015 UNIMPLEMENTED();
10016 }
10017 catch(std::bad_alloc&)
10018 {
10019 return gl::error(GL_OUT_OF_MEMORY);
10020 }
10021}
10022
10023void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10024{
10025 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10026
10027 try
10028 {
10029 gl::Context *context = gl::getNonLostContext();
10030
10031 if (context)
10032 {
10033 if (context->getClientVersion() < 3)
10034 {
10035 return gl::error(GL_INVALID_OPERATION);
10036 }
10037 }
10038
10039 UNIMPLEMENTED();
10040 }
10041 catch(std::bad_alloc&)
10042 {
10043 return gl::error(GL_OUT_OF_MEMORY);
10044 }
10045}
10046
10047void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10048{
10049 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10050
10051 try
10052 {
10053 gl::Context *context = gl::getNonLostContext();
10054
10055 if (context)
10056 {
10057 if (context->getClientVersion() < 3)
10058 {
10059 return gl::error(GL_INVALID_OPERATION);
10060 }
10061 }
10062
10063 UNIMPLEMENTED();
10064 }
10065 catch(std::bad_alloc&)
10066 {
10067 return gl::error(GL_OUT_OF_MEMORY);
10068 }
10069}
10070
10071void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10072{
10073 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10074
10075 try
10076 {
10077 gl::Context *context = gl::getNonLostContext();
10078
10079 if (context)
10080 {
10081 if (context->getClientVersion() < 3)
10082 {
10083 return gl::error(GL_INVALID_OPERATION);
10084 }
10085 }
10086
10087 UNIMPLEMENTED();
10088 }
10089 catch(std::bad_alloc&)
10090 {
10091 return gl::error(GL_OUT_OF_MEMORY);
10092 }
10093}
10094
10095void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10096{
10097 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10098
10099 try
10100 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010101 if (index >= gl::MAX_VERTEX_ATTRIBS)
10102 {
10103 return gl::error(GL_INVALID_VALUE);
10104 }
10105
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010106 gl::Context *context = gl::getNonLostContext();
10107
10108 if (context)
10109 {
10110 if (context->getClientVersion() < 3)
10111 {
10112 return gl::error(GL_INVALID_OPERATION);
10113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010114
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010115 context->setVertexAttribDivisor(index, divisor);
10116 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010117 }
10118 catch(std::bad_alloc&)
10119 {
10120 return gl::error(GL_OUT_OF_MEMORY);
10121 }
10122}
10123
10124void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10125{
10126 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10127
10128 try
10129 {
10130 gl::Context *context = gl::getNonLostContext();
10131
10132 if (context)
10133 {
10134 if (context->getClientVersion() < 3)
10135 {
10136 return gl::error(GL_INVALID_OPERATION);
10137 }
10138 }
10139
10140 UNIMPLEMENTED();
10141 }
10142 catch(std::bad_alloc&)
10143 {
10144 return gl::error(GL_OUT_OF_MEMORY);
10145 }
10146}
10147
10148void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10149{
10150 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10151
10152 try
10153 {
10154 gl::Context *context = gl::getNonLostContext();
10155
10156 if (context)
10157 {
10158 if (context->getClientVersion() < 3)
10159 {
10160 return gl::error(GL_INVALID_OPERATION);
10161 }
10162 }
10163
10164 UNIMPLEMENTED();
10165 }
10166 catch(std::bad_alloc&)
10167 {
10168 return gl::error(GL_OUT_OF_MEMORY);
10169 }
10170}
10171
10172void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10173{
10174 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10175
10176 try
10177 {
10178 gl::Context *context = gl::getNonLostContext();
10179
10180 if (context)
10181 {
10182 if (context->getClientVersion() < 3)
10183 {
10184 return gl::error(GL_INVALID_OPERATION);
10185 }
10186 }
10187
10188 UNIMPLEMENTED();
10189 }
10190 catch(std::bad_alloc&)
10191 {
10192 return gl::error(GL_OUT_OF_MEMORY);
10193 }
10194}
10195
10196GLboolean __stdcall glIsTransformFeedback(GLuint id)
10197{
10198 EVENT("(GLuint id = %u)", id);
10199
10200 try
10201 {
10202 gl::Context *context = gl::getNonLostContext();
10203
10204 if (context)
10205 {
10206 if (context->getClientVersion() < 3)
10207 {
10208 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10209 }
10210 }
10211
10212 UNIMPLEMENTED();
10213 }
10214 catch(std::bad_alloc&)
10215 {
10216 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10217 }
10218
10219 return GL_FALSE;
10220}
10221
10222void __stdcall glPauseTransformFeedback(void)
10223{
10224 EVENT("(void)");
10225
10226 try
10227 {
10228 gl::Context *context = gl::getNonLostContext();
10229
10230 if (context)
10231 {
10232 if (context->getClientVersion() < 3)
10233 {
10234 return gl::error(GL_INVALID_OPERATION);
10235 }
10236 }
10237
10238 UNIMPLEMENTED();
10239 }
10240 catch(std::bad_alloc&)
10241 {
10242 return gl::error(GL_OUT_OF_MEMORY);
10243 }
10244}
10245
10246void __stdcall glResumeTransformFeedback(void)
10247{
10248 EVENT("(void)");
10249
10250 try
10251 {
10252 gl::Context *context = gl::getNonLostContext();
10253
10254 if (context)
10255 {
10256 if (context->getClientVersion() < 3)
10257 {
10258 return gl::error(GL_INVALID_OPERATION);
10259 }
10260 }
10261
10262 UNIMPLEMENTED();
10263 }
10264 catch(std::bad_alloc&)
10265 {
10266 return gl::error(GL_OUT_OF_MEMORY);
10267 }
10268}
10269
10270void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10271{
10272 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10273 program, bufSize, length, binaryFormat, binary);
10274
10275 try
10276 {
10277 gl::Context *context = gl::getNonLostContext();
10278
10279 if (context)
10280 {
10281 if (context->getClientVersion() < 3)
10282 {
10283 return gl::error(GL_INVALID_OPERATION);
10284 }
10285 }
10286
10287 UNIMPLEMENTED();
10288 }
10289 catch(std::bad_alloc&)
10290 {
10291 return gl::error(GL_OUT_OF_MEMORY);
10292 }
10293}
10294
10295void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10296{
10297 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10298 program, binaryFormat, binary, length);
10299
10300 try
10301 {
10302 gl::Context *context = gl::getNonLostContext();
10303
10304 if (context)
10305 {
10306 if (context->getClientVersion() < 3)
10307 {
10308 return gl::error(GL_INVALID_OPERATION);
10309 }
10310 }
10311
10312 UNIMPLEMENTED();
10313 }
10314 catch(std::bad_alloc&)
10315 {
10316 return gl::error(GL_OUT_OF_MEMORY);
10317 }
10318}
10319
10320void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10321{
10322 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10323 program, pname, value);
10324
10325 try
10326 {
10327 gl::Context *context = gl::getNonLostContext();
10328
10329 if (context)
10330 {
10331 if (context->getClientVersion() < 3)
10332 {
10333 return gl::error(GL_INVALID_OPERATION);
10334 }
10335 }
10336
10337 UNIMPLEMENTED();
10338 }
10339 catch(std::bad_alloc&)
10340 {
10341 return gl::error(GL_OUT_OF_MEMORY);
10342 }
10343}
10344
10345void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10346{
10347 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10348 target, numAttachments, attachments);
10349
10350 try
10351 {
10352 gl::Context *context = gl::getNonLostContext();
10353
10354 if (context)
10355 {
10356 if (context->getClientVersion() < 3)
10357 {
10358 return gl::error(GL_INVALID_OPERATION);
10359 }
10360 }
10361
10362 UNIMPLEMENTED();
10363 }
10364 catch(std::bad_alloc&)
10365 {
10366 return gl::error(GL_OUT_OF_MEMORY);
10367 }
10368}
10369
10370void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10371{
10372 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10373 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10374 target, numAttachments, attachments, x, y, width, height);
10375
10376 try
10377 {
10378 gl::Context *context = gl::getNonLostContext();
10379
10380 if (context)
10381 {
10382 if (context->getClientVersion() < 3)
10383 {
10384 return gl::error(GL_INVALID_OPERATION);
10385 }
10386 }
10387
10388 UNIMPLEMENTED();
10389 }
10390 catch(std::bad_alloc&)
10391 {
10392 return gl::error(GL_OUT_OF_MEMORY);
10393 }
10394}
10395
10396void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10397{
10398 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10399 target, levels, internalformat, width, height);
10400
10401 try
10402 {
10403 gl::Context *context = gl::getNonLostContext();
10404
10405 if (context)
10406 {
10407 if (context->getClientVersion() < 3)
10408 {
10409 return gl::error(GL_INVALID_OPERATION);
10410 }
10411 }
10412
10413 UNIMPLEMENTED();
10414 }
10415 catch(std::bad_alloc&)
10416 {
10417 return gl::error(GL_OUT_OF_MEMORY);
10418 }
10419}
10420
10421void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10422{
10423 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10424 "GLsizei height = %d, GLsizei depth = %d)",
10425 target, levels, internalformat, width, height, depth);
10426
10427 try
10428 {
10429 gl::Context *context = gl::getNonLostContext();
10430
10431 if (context)
10432 {
10433 if (context->getClientVersion() < 3)
10434 {
10435 return gl::error(GL_INVALID_OPERATION);
10436 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010437 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010438 }
10439 catch(std::bad_alloc&)
10440 {
10441 return gl::error(GL_OUT_OF_MEMORY);
10442 }
10443}
10444
10445void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10446{
10447 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10448 "GLint* params = 0x%0.8p)",
10449 target, internalformat, pname, bufSize, params);
10450
10451 try
10452 {
10453 gl::Context *context = gl::getNonLostContext();
10454
10455 if (context)
10456 {
10457 if (context->getClientVersion() < 3)
10458 {
10459 return gl::error(GL_INVALID_OPERATION);
10460 }
10461 }
10462
10463 UNIMPLEMENTED();
10464 }
10465 catch(std::bad_alloc&)
10466 {
10467 return gl::error(GL_OUT_OF_MEMORY);
10468 }
10469}
10470
10471// Extension functions
10472
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010473void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10474 GLbitfield mask, GLenum filter)
10475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010476 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010477 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10478 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10479 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10480
10481 try
10482 {
10483 switch (filter)
10484 {
10485 case GL_NEAREST:
10486 break;
10487 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010488 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010489 }
10490
10491 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010494 }
10495
10496 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10497 {
10498 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010500 }
10501
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010503
10504 if (context)
10505 {
10506 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10507 {
10508 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010510 }
10511
10512 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10513 }
10514 }
10515 catch(std::bad_alloc&)
10516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010517 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010518 }
10519}
10520
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010521void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10522 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010523{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010524 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010525 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010526 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010527 target, level, internalformat, width, height, depth, border, format, type, pixels);
10528
10529 try
10530 {
10531 UNIMPLEMENTED(); // FIXME
10532 }
10533 catch(std::bad_alloc&)
10534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010535 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010536 }
10537}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010538
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010539void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10540 GLenum *binaryFormat, void *binary)
10541{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010542 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 +000010543 program, bufSize, length, binaryFormat, binary);
10544
10545 try
10546 {
10547 gl::Context *context = gl::getNonLostContext();
10548
10549 if (context)
10550 {
10551 gl::Program *programObject = context->getProgram(program);
10552
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010553 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010555 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010556 }
10557
10558 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10559
10560 if (!programBinary)
10561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010562 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010563 }
10564
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010565 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010567 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010568 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010569
10570 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010571 }
10572 }
10573 catch(std::bad_alloc&)
10574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010575 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010576 }
10577}
10578
10579void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10580 const void *binary, GLint length)
10581{
10582 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10583 program, binaryFormat, binary, length);
10584
10585 try
10586 {
10587 gl::Context *context = gl::getNonLostContext();
10588
10589 if (context)
10590 {
10591 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010593 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010594 }
10595
10596 gl::Program *programObject = context->getProgram(program);
10597
10598 if (!programObject)
10599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010600 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010601 }
10602
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010603 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010604 }
10605 }
10606 catch(std::bad_alloc&)
10607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010608 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010609 }
10610}
10611
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010612void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10613{
10614 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10615
10616 try
10617 {
10618 gl::Context *context = gl::getNonLostContext();
10619
10620 if (context)
10621 {
10622 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10623 {
10624 return gl::error(GL_INVALID_VALUE);
10625 }
10626
10627 if (context->getDrawFramebufferHandle() == 0)
10628 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010629 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010630 {
10631 return gl::error(GL_INVALID_OPERATION);
10632 }
10633
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010634 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010635 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010636 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010637 }
10638 }
10639 else
10640 {
10641 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10642 {
10643 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10644 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10645 {
10646 return gl::error(GL_INVALID_OPERATION);
10647 }
10648 }
10649 }
10650
10651 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10652
10653 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10654 {
10655 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10656 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010657
10658 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10659 {
10660 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10661 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010662 }
10663 }
10664 catch (std::bad_alloc&)
10665 {
10666 return gl::error(GL_OUT_OF_MEMORY);
10667 }
10668}
10669
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010670__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10671{
10672 struct Extension
10673 {
10674 const char *name;
10675 __eglMustCastToProperFunctionPointerType address;
10676 };
10677
10678 static const Extension glExtensions[] =
10679 {
10680 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010681 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010682 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010683 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10684 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10685 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10686 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10687 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10688 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10689 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010690 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010691 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010692 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10693 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10694 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10695 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010696 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10697 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10698 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10699 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10700 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10701 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10702 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010703 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010704 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10705 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10706 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010707 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10708 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010709
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010710 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010711 {
10712 if (strcmp(procname, glExtensions[ext].name) == 0)
10713 {
10714 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10715 }
10716 }
10717
10718 return NULL;
10719}
10720
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010721// Non-public functions used by EGL
10722
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010723bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010724{
10725 EVENT("(egl::Surface* surface = 0x%0.8p)",
10726 surface);
10727
10728 try
10729 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010730 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010731
10732 if (context)
10733 {
10734 gl::Texture2D *textureObject = context->getTexture2D();
10735
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010736 if (textureObject->isImmutable())
10737 {
10738 return false;
10739 }
10740
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010741 if (textureObject)
10742 {
10743 textureObject->bindTexImage(surface);
10744 }
10745 }
10746 }
10747 catch(std::bad_alloc&)
10748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010749 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010750 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010751
10752 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010753}
10754
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010755}