blob: 34130a8680abbcba7f1767650527f5f0ab3dc0de [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
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003158 case GL_TEXTURE_3D:
3159 {
3160 if (context->getClientVersion() < 3)
3161 {
3162 return gl::error(GL_INVALID_ENUM);
3163 }
3164
3165 gl::Texture3D *tex3D = context->getTexture3D();
3166 if (tex3D->isCompressed(0))
3167 {
3168 return gl::error(GL_INVALID_OPERATION);
3169 }
3170
3171 tex3D->generateMipmaps();
3172 break;
3173 }
3174
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003175 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003176 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003177 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003178 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003179 }
3180 catch(std::bad_alloc&)
3181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003183 }
3184}
3185
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003186void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003188 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003189
3190 try
3191 {
3192 if (n < 0)
3193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003194 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003195 }
3196
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003197 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003198
3199 if (context)
3200 {
3201 for (int i = 0; i < n; i++)
3202 {
3203 fences[i] = context->createFence();
3204 }
3205 }
3206 }
3207 catch(std::bad_alloc&)
3208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003209 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003210 }
3211}
3212
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003213void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003215 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003216
3217 try
3218 {
3219 if (n < 0)
3220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003222 }
3223
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225
3226 if (context)
3227 {
3228 for (int i = 0; i < n; i++)
3229 {
3230 framebuffers[i] = context->createFramebuffer();
3231 }
3232 }
3233 }
3234 catch(std::bad_alloc&)
3235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237 }
3238}
3239
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003240void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3241{
3242 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3243
3244 try
3245 {
3246 if (n < 0)
3247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003248 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003249 }
3250
3251 gl::Context *context = gl::getNonLostContext();
3252
3253 if (context)
3254 {
3255 for (int i = 0; i < n; i++)
3256 {
3257 ids[i] = context->createQuery();
3258 }
3259 }
3260 }
3261 catch(std::bad_alloc&)
3262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003264 }
3265}
3266
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003267void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3268{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003269 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270
3271 try
3272 {
3273 if (n < 0)
3274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 }
3277
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003278 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279
3280 if (context)
3281 {
3282 for (int i = 0; i < n; i++)
3283 {
3284 renderbuffers[i] = context->createRenderbuffer();
3285 }
3286 }
3287 }
3288 catch(std::bad_alloc&)
3289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003290 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003291 }
3292}
3293
3294void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3295{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003296 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297
3298 try
3299 {
3300 if (n < 0)
3301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 }
3304
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306
3307 if (context)
3308 {
3309 for (int i = 0; i < n; i++)
3310 {
3311 textures[i] = context->createTexture();
3312 }
3313 }
3314 }
3315 catch(std::bad_alloc&)
3316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003317 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318 }
3319}
3320
daniel@transgaming.com85423182010-04-22 13:35:27 +00003321void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003323 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003324 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325 program, index, bufsize, length, size, type, name);
3326
3327 try
3328 {
3329 if (bufsize < 0)
3330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332 }
3333
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003335
3336 if (context)
3337 {
3338 gl::Program *programObject = context->getProgram(program);
3339
3340 if (!programObject)
3341 {
3342 if (context->getShader(program))
3343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003344 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003345 }
3346 else
3347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003349 }
3350 }
3351
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003352 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003354 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003355 }
3356
3357 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3358 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359 }
3360 catch(std::bad_alloc&)
3361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003362 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003363 }
3364}
3365
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003366void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003368 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003369 "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 +00003370 program, index, bufsize, length, size, type, name);
3371
3372 try
3373 {
3374 if (bufsize < 0)
3375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003377 }
3378
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003380
3381 if (context)
3382 {
3383 gl::Program *programObject = context->getProgram(program);
3384
3385 if (!programObject)
3386 {
3387 if (context->getShader(program))
3388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003389 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003390 }
3391 else
3392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003394 }
3395 }
3396
3397 if (index >= (GLuint)programObject->getActiveUniformCount())
3398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003400 }
3401
3402 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3403 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003404 }
3405 catch(std::bad_alloc&)
3406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003407 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003408 }
3409}
3410
3411void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003413 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 +00003414 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003415
3416 try
3417 {
3418 if (maxcount < 0)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421 }
3422
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003423 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003424
3425 if (context)
3426 {
3427 gl::Program *programObject = context->getProgram(program);
3428
3429 if (!programObject)
3430 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003431 if (context->getShader(program))
3432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003433 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003434 }
3435 else
3436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003437 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003438 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003439 }
3440
3441 return programObject->getAttachedShaders(maxcount, count, shaders);
3442 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443 }
3444 catch(std::bad_alloc&)
3445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003446 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 }
3448}
3449
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003450int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003452 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453
3454 try
3455 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003456 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457
3458 if (context)
3459 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003460
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 gl::Program *programObject = context->getProgram(program);
3462
3463 if (!programObject)
3464 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003465 if (context->getShader(program))
3466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003467 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003468 }
3469 else
3470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003471 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003473 }
3474
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003475 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003476 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003478 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003479 }
3480
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003481 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003482 }
3483 }
3484 catch(std::bad_alloc&)
3485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003486 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003487 }
3488
3489 return -1;
3490}
3491
3492void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3493{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003494 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003495
3496 try
3497 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003498 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003499
3500 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003501 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003502 if (!(context->getBooleanv(pname, params)))
3503 {
3504 GLenum nativeType;
3505 unsigned int numParams = 0;
3506 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003507 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003508
3509 if (numParams == 0)
3510 return; // it is known that the pname is valid, but there are no parameters to return
3511
3512 if (nativeType == GL_FLOAT)
3513 {
3514 GLfloat *floatParams = NULL;
3515 floatParams = new GLfloat[numParams];
3516
3517 context->getFloatv(pname, floatParams);
3518
3519 for (unsigned int i = 0; i < numParams; ++i)
3520 {
3521 if (floatParams[i] == 0.0f)
3522 params[i] = GL_FALSE;
3523 else
3524 params[i] = GL_TRUE;
3525 }
3526
3527 delete [] floatParams;
3528 }
3529 else if (nativeType == GL_INT)
3530 {
3531 GLint *intParams = NULL;
3532 intParams = new GLint[numParams];
3533
3534 context->getIntegerv(pname, intParams);
3535
3536 for (unsigned int i = 0; i < numParams; ++i)
3537 {
3538 if (intParams[i] == 0)
3539 params[i] = GL_FALSE;
3540 else
3541 params[i] = GL_TRUE;
3542 }
3543
3544 delete [] intParams;
3545 }
3546 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003547 }
3548 }
3549 catch(std::bad_alloc&)
3550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003552 }
3553}
3554
3555void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003557 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 +00003558
3559 try
3560 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003562
3563 if (context)
3564 {
3565 gl::Buffer *buffer;
3566
3567 switch (target)
3568 {
3569 case GL_ARRAY_BUFFER:
3570 buffer = context->getArrayBuffer();
3571 break;
3572 case GL_ELEMENT_ARRAY_BUFFER:
3573 buffer = context->getElementArrayBuffer();
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
3578 if (!buffer)
3579 {
3580 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003581 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003582 }
3583
3584 switch (pname)
3585 {
3586 case GL_BUFFER_USAGE:
3587 *params = buffer->usage();
3588 break;
3589 case GL_BUFFER_SIZE:
3590 *params = buffer->size();
3591 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003592 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003593 }
3594 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003595 }
3596 catch(std::bad_alloc&)
3597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003598 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599 }
3600}
3601
3602GLenum __stdcall glGetError(void)
3603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003604 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003605
3606 gl::Context *context = gl::getContext();
3607
3608 if (context)
3609 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003610 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003611 }
3612
3613 return GL_NO_ERROR;
3614}
3615
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003616void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3617{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003618 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003619
3620 try
3621 {
3622
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003623 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003624
3625 if (context)
3626 {
3627 gl::Fence *fenceObject = context->getFence(fence);
3628
3629 if (fenceObject == NULL)
3630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003631 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003632 }
3633
3634 fenceObject->getFenceiv(pname, params);
3635 }
3636 }
3637 catch(std::bad_alloc&)
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003640 }
3641}
3642
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003643void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003645 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003646
3647 try
3648 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003649 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003650
3651 if (context)
3652 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003653 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003654 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003655 GLenum nativeType;
3656 unsigned int numParams = 0;
3657 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003658 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003659
3660 if (numParams == 0)
3661 return; // it is known that the pname is valid, but that there are no parameters to return.
3662
3663 if (nativeType == GL_BOOL)
3664 {
3665 GLboolean *boolParams = NULL;
3666 boolParams = new GLboolean[numParams];
3667
3668 context->getBooleanv(pname, boolParams);
3669
3670 for (unsigned int i = 0; i < numParams; ++i)
3671 {
3672 if (boolParams[i] == GL_FALSE)
3673 params[i] = 0.0f;
3674 else
3675 params[i] = 1.0f;
3676 }
3677
3678 delete [] boolParams;
3679 }
3680 else if (nativeType == GL_INT)
3681 {
3682 GLint *intParams = NULL;
3683 intParams = new GLint[numParams];
3684
3685 context->getIntegerv(pname, intParams);
3686
3687 for (unsigned int i = 0; i < numParams; ++i)
3688 {
3689 params[i] = (GLfloat)intParams[i];
3690 }
3691
3692 delete [] intParams;
3693 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003694 }
3695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003696 }
3697 catch(std::bad_alloc&)
3698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003700 }
3701}
3702
3703void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003705 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 +00003706 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707
3708 try
3709 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003710 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003711
3712 if (context)
3713 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003714 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003717 }
3718
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003719 gl::Framebuffer *framebuffer = NULL;
3720 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3721 {
3722 if(context->getReadFramebufferHandle() == 0)
3723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003724 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003725 }
3726
3727 framebuffer = context->getReadFramebuffer();
3728 }
3729 else
3730 {
3731 if (context->getDrawFramebufferHandle() == 0)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003734 }
3735
3736 framebuffer = context->getDrawFramebuffer();
3737 }
3738
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003739 GLenum attachmentType;
3740 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003741
3742 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003743 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003744 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3745
3746 if (colorAttachment >= context->getMaximumRenderTargets())
3747 {
3748 return gl::error(GL_INVALID_ENUM);
3749 }
3750
3751 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3752 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3753 }
3754 else
3755 {
3756 switch (attachment)
3757 {
3758 case GL_DEPTH_ATTACHMENT:
3759 attachmentType = framebuffer->getDepthbufferType();
3760 attachmentHandle = framebuffer->getDepthbufferHandle();
3761 break;
3762 case GL_STENCIL_ATTACHMENT:
3763 attachmentType = framebuffer->getStencilbufferType();
3764 attachmentHandle = framebuffer->getStencilbufferHandle();
3765 break;
3766 default: return gl::error(GL_INVALID_ENUM);
3767 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003768 }
3769
3770 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003771 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003772 {
3773 attachmentObjectType = attachmentType;
3774 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003775 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003776 {
3777 attachmentObjectType = GL_TEXTURE;
3778 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003779 else
3780 {
3781 UNREACHABLE();
3782 return;
3783 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003784
3785 switch (pname)
3786 {
3787 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3788 *params = attachmentObjectType;
3789 break;
3790 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3791 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3792 {
3793 *params = attachmentHandle;
3794 }
3795 else
3796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003798 }
3799 break;
3800 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3801 if (attachmentObjectType == GL_TEXTURE)
3802 {
3803 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
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 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3811 if (attachmentObjectType == GL_TEXTURE)
3812 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003813 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003814 {
3815 *params = attachmentType;
3816 }
3817 else
3818 {
3819 *params = 0;
3820 }
3821 }
3822 else
3823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003824 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003825 }
3826 break;
3827 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003828 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003829 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003830 }
3831 }
3832 catch(std::bad_alloc&)
3833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003834 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835 }
3836}
3837
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003838GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3839{
3840 EVENT("()");
3841
3842 try
3843 {
3844 gl::Context *context = gl::getContext();
3845
3846 if (context)
3847 {
3848 return context->getResetStatus();
3849 }
3850
3851 return GL_NO_ERROR;
3852 }
3853 catch(std::bad_alloc&)
3854 {
3855 return GL_OUT_OF_MEMORY;
3856 }
3857}
3858
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003861 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003862
3863 try
3864 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866
3867 if (context)
3868 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003869 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003871 GLenum nativeType;
3872 unsigned int numParams = 0;
3873 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003874 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003875
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003876 if (numParams == 0)
3877 return; // it is known that pname is valid, but there are no parameters to return
3878
3879 if (nativeType == GL_BOOL)
3880 {
3881 GLboolean *boolParams = NULL;
3882 boolParams = new GLboolean[numParams];
3883
3884 context->getBooleanv(pname, boolParams);
3885
3886 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003887 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003888 if (boolParams[i] == GL_FALSE)
3889 params[i] = 0;
3890 else
3891 params[i] = 1;
3892 }
3893
3894 delete [] boolParams;
3895 }
3896 else if (nativeType == GL_FLOAT)
3897 {
3898 GLfloat *floatParams = NULL;
3899 floatParams = new GLfloat[numParams];
3900
3901 context->getFloatv(pname, floatParams);
3902
3903 for (unsigned int i = 0; i < numParams; ++i)
3904 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003905 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 +00003906 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003907 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003908 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003909 else
3910 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 +00003911 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003913 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003914 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003915 }
3916 }
3917 }
3918 catch(std::bad_alloc&)
3919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921 }
3922}
3923
3924void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3925{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003926 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003927
3928 try
3929 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931
3932 if (context)
3933 {
3934 gl::Program *programObject = context->getProgram(program);
3935
3936 if (!programObject)
3937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003938 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003939 }
3940
3941 switch (pname)
3942 {
3943 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003944 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003945 return;
3946 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003947 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003948 return;
3949 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003950 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003951 return;
3952 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003953 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 return;
3955 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003956 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003957 return;
3958 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003959 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960 return;
3961 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003962 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003963 return;
3964 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003965 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003966 return;
3967 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003968 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003969 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003970 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003971 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003972 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003975 }
3976 }
3977 }
3978 catch(std::bad_alloc&)
3979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003980 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981 }
3982}
3983
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003984void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003986 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 +00003987 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988
3989 try
3990 {
3991 if (bufsize < 0)
3992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003993 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 }
3995
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003996 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003997
3998 if (context)
3999 {
4000 gl::Program *programObject = context->getProgram(program);
4001
4002 if (!programObject)
4003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004005 }
4006
4007 programObject->getInfoLog(bufsize, length, infolog);
4008 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004009 }
4010 catch(std::bad_alloc&)
4011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004012 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013 }
4014}
4015
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004016void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4017{
4018 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4019
4020 try
4021 {
4022 switch (pname)
4023 {
4024 case GL_CURRENT_QUERY_EXT:
4025 break;
4026 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004027 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004028 }
4029
4030 gl::Context *context = gl::getNonLostContext();
4031
4032 if (context)
4033 {
4034 params[0] = context->getActiveQuery(target);
4035 }
4036 }
4037 catch(std::bad_alloc&)
4038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004040 }
4041}
4042
4043void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4044{
4045 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4046
4047 try
4048 {
4049 switch (pname)
4050 {
4051 case GL_QUERY_RESULT_EXT:
4052 case GL_QUERY_RESULT_AVAILABLE_EXT:
4053 break;
4054 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004056 }
4057 gl::Context *context = gl::getNonLostContext();
4058
4059 if (context)
4060 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004061 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4062
4063 if (!queryObject)
4064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004065 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004066 }
4067
4068 if (context->getActiveQuery(queryObject->getType()) == id)
4069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004070 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004071 }
4072
4073 switch(pname)
4074 {
4075 case GL_QUERY_RESULT_EXT:
4076 params[0] = queryObject->getResult();
4077 break;
4078 case GL_QUERY_RESULT_AVAILABLE_EXT:
4079 params[0] = queryObject->isResultAvailable();
4080 break;
4081 default:
4082 ASSERT(false);
4083 }
4084 }
4085 }
4086 catch(std::bad_alloc&)
4087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004088 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004089 }
4090}
4091
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004092void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4093{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004094 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 +00004095
4096 try
4097 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004098 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004099
4100 if (context)
4101 {
4102 if (target != GL_RENDERBUFFER)
4103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004105 }
4106
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004107 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004109 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004110 }
4111
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004112 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004113
4114 switch (pname)
4115 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004116 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4117 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4118 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4119 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4120 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4121 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4122 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4123 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4124 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004125 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004126 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004127 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004128 *params = renderbuffer->getSamples();
4129 }
4130 else
4131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004132 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004133 }
4134 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004135 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004136 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004137 }
4138 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004139 }
4140 catch(std::bad_alloc&)
4141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004142 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004143 }
4144}
4145
4146void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4147{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004148 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004149
4150 try
4151 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004152 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153
4154 if (context)
4155 {
4156 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004157
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004158 if (!shaderObject)
4159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004160 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161 }
4162
4163 switch (pname)
4164 {
4165 case GL_SHADER_TYPE:
4166 *params = shaderObject->getType();
4167 return;
4168 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004169 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004170 return;
4171 case GL_COMPILE_STATUS:
4172 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4173 return;
4174 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004175 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004176 return;
4177 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004178 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004180 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4181 *params = shaderObject->getTranslatedSourceLength();
4182 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004183 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004184 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004185 }
4186 }
4187 }
4188 catch(std::bad_alloc&)
4189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004191 }
4192}
4193
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004194void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004195{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004196 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 +00004197 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004198
4199 try
4200 {
4201 if (bufsize < 0)
4202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004203 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 }
4205
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004206 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004207
4208 if (context)
4209 {
4210 gl::Shader *shaderObject = context->getShader(shader);
4211
4212 if (!shaderObject)
4213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004214 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004215 }
4216
4217 shaderObject->getInfoLog(bufsize, length, infolog);
4218 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004219 }
4220 catch(std::bad_alloc&)
4221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004222 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223 }
4224}
4225
4226void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004228 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 +00004229 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230
4231 try
4232 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004233 switch (shadertype)
4234 {
4235 case GL_VERTEX_SHADER:
4236 case GL_FRAGMENT_SHADER:
4237 break;
4238 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004240 }
4241
4242 switch (precisiontype)
4243 {
4244 case GL_LOW_FLOAT:
4245 case GL_MEDIUM_FLOAT:
4246 case GL_HIGH_FLOAT:
4247 // Assume IEEE 754 precision
4248 range[0] = 127;
4249 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004250 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004251 break;
4252 case GL_LOW_INT:
4253 case GL_MEDIUM_INT:
4254 case GL_HIGH_INT:
4255 // Some (most) hardware only supports single-precision floating-point numbers,
4256 // which can accurately represent integers up to +/-16777216
4257 range[0] = 24;
4258 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004259 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004260 break;
4261 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004262 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004263 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264 }
4265 catch(std::bad_alloc&)
4266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004267 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004268 }
4269}
4270
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004271void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004273 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 +00004274 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004275
4276 try
4277 {
4278 if (bufsize < 0)
4279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004281 }
4282
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004283 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004284
4285 if (context)
4286 {
4287 gl::Shader *shaderObject = context->getShader(shader);
4288
4289 if (!shaderObject)
4290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004291 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004292 }
4293
4294 shaderObject->getSource(bufsize, length, source);
4295 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004296 }
4297 catch(std::bad_alloc&)
4298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004299 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300 }
4301}
4302
zmo@google.coma574f782011-10-03 21:45:23 +00004303void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4304{
4305 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4306 shader, bufsize, length, source);
4307
4308 try
4309 {
4310 if (bufsize < 0)
4311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004313 }
4314
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004315 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004316
4317 if (context)
4318 {
4319 gl::Shader *shaderObject = context->getShader(shader);
4320
4321 if (!shaderObject)
4322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004323 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004324 }
4325
4326 shaderObject->getTranslatedSource(bufsize, length, source);
4327 }
4328 }
4329 catch(std::bad_alloc&)
4330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004331 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004332 }
4333}
4334
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004335const GLubyte* __stdcall glGetString(GLenum name)
4336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004337 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004338
4339 try
4340 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004341 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004342
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 switch (name)
4344 {
4345 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004346 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004347 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004348 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00004350 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004351 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00004352 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004354 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004355 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004356 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357 }
4358 }
4359 catch(std::bad_alloc&)
4360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004361 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363}
4364
4365void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004367 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 +00004368
4369 try
4370 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004372
4373 if (context)
4374 {
4375 gl::Texture *texture;
4376
4377 switch (target)
4378 {
4379 case GL_TEXTURE_2D:
4380 texture = context->getTexture2D();
4381 break;
4382 case GL_TEXTURE_CUBE_MAP:
4383 texture = context->getTextureCubeMap();
4384 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004385 case GL_TEXTURE_3D:
4386 if (context->getClientVersion() < 3)
4387 {
4388 return gl::error(GL_INVALID_ENUM);
4389 }
4390 texture = context->getTexture3D();
4391 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004392 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004393 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004394 }
4395
4396 switch (pname)
4397 {
4398 case GL_TEXTURE_MAG_FILTER:
4399 *params = (GLfloat)texture->getMagFilter();
4400 break;
4401 case GL_TEXTURE_MIN_FILTER:
4402 *params = (GLfloat)texture->getMinFilter();
4403 break;
4404 case GL_TEXTURE_WRAP_S:
4405 *params = (GLfloat)texture->getWrapS();
4406 break;
4407 case GL_TEXTURE_WRAP_T:
4408 *params = (GLfloat)texture->getWrapT();
4409 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004410 case GL_TEXTURE_WRAP_R:
4411 if (context->getClientVersion() < 3)
4412 {
4413 return gl::error(GL_INVALID_ENUM);
4414 }
4415 *params = (GLfloat)texture->getWrapR();
4416 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004417 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4418 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4419 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004420 case GL_TEXTURE_USAGE_ANGLE:
4421 *params = (GLfloat)texture->getUsage();
4422 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004423 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4424 if (!context->supportsTextureFilterAnisotropy())
4425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004426 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004427 }
4428 *params = (GLfloat)texture->getMaxAnisotropy();
4429 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004430 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004432 }
4433 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004434 }
4435 catch(std::bad_alloc&)
4436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004437 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438 }
4439}
4440
4441void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004443 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 +00004444
4445 try
4446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004448
4449 if (context)
4450 {
4451 gl::Texture *texture;
4452
4453 switch (target)
4454 {
4455 case GL_TEXTURE_2D:
4456 texture = context->getTexture2D();
4457 break;
4458 case GL_TEXTURE_CUBE_MAP:
4459 texture = context->getTextureCubeMap();
4460 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004461 case GL_TEXTURE_3D:
4462 if (context->getClientVersion() < 3)
4463 {
4464 return gl::error(GL_INVALID_ENUM);
4465 }
4466 texture = context->getTexture3D();
4467 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004468 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004469 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004470 }
4471
4472 switch (pname)
4473 {
4474 case GL_TEXTURE_MAG_FILTER:
4475 *params = texture->getMagFilter();
4476 break;
4477 case GL_TEXTURE_MIN_FILTER:
4478 *params = texture->getMinFilter();
4479 break;
4480 case GL_TEXTURE_WRAP_S:
4481 *params = texture->getWrapS();
4482 break;
4483 case GL_TEXTURE_WRAP_T:
4484 *params = texture->getWrapT();
4485 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004486 case GL_TEXTURE_WRAP_R:
4487 if (context->getClientVersion() < 3)
4488 {
4489 return gl::error(GL_INVALID_ENUM);
4490 }
4491 *params = texture->getWrapR();
4492 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004493 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4494 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4495 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004496 case GL_TEXTURE_USAGE_ANGLE:
4497 *params = texture->getUsage();
4498 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004499 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4500 if (!context->supportsTextureFilterAnisotropy())
4501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004502 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004503 }
4504 *params = (GLint)texture->getMaxAnisotropy();
4505 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004506 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004507 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004508 }
4509 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 }
4511 catch(std::bad_alloc&)
4512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004514 }
4515}
4516
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004517void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4518{
4519 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4520 program, location, bufSize, params);
4521
4522 try
4523 {
4524 if (bufSize < 0)
4525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004526 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004527 }
4528
4529 gl::Context *context = gl::getNonLostContext();
4530
4531 if (context)
4532 {
4533 if (program == 0)
4534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004535 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004536 }
4537
4538 gl::Program *programObject = context->getProgram(program);
4539
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004540 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004542 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004543 }
4544
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004545 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4546 if (!programBinary)
4547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004548 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004549 }
4550
4551 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004553 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004554 }
4555 }
4556 }
4557 catch(std::bad_alloc&)
4558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004559 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004560 }
4561}
4562
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4564{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004565 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004566
4567 try
4568 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004569 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004570
4571 if (context)
4572 {
4573 if (program == 0)
4574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004576 }
4577
4578 gl::Program *programObject = context->getProgram(program);
4579
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004580 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004583 }
4584
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004585 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4586 if (!programBinary)
4587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004588 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004589 }
4590
4591 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004594 }
4595 }
4596 }
4597 catch(std::bad_alloc&)
4598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004599 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004600 }
4601}
4602
4603void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4604{
4605 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4606 program, location, bufSize, params);
4607
4608 try
4609 {
4610 if (bufSize < 0)
4611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004612 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004613 }
4614
4615 gl::Context *context = gl::getNonLostContext();
4616
4617 if (context)
4618 {
4619 if (program == 0)
4620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004621 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004622 }
4623
4624 gl::Program *programObject = context->getProgram(program);
4625
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004626 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004628 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004629 }
4630
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004631 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4632 if (!programBinary)
4633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004634 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004635 }
4636
4637 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004640 }
4641 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 }
4643 catch(std::bad_alloc&)
4644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004646 }
4647}
4648
4649void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004651 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004652
4653 try
4654 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004656
4657 if (context)
4658 {
4659 if (program == 0)
4660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004662 }
4663
4664 gl::Program *programObject = context->getProgram(program);
4665
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004666 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004669 }
4670
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004671 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4672 if (!programBinary)
4673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004674 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004675 }
4676
4677 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004679 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004680 }
4681 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 }
4683 catch(std::bad_alloc&)
4684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004685 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686 }
4687}
4688
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004689int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004691 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004692
4693 try
4694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696
4697 if (strstr(name, "gl_") == name)
4698 {
4699 return -1;
4700 }
4701
4702 if (context)
4703 {
4704 gl::Program *programObject = context->getProgram(program);
4705
4706 if (!programObject)
4707 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004708 if (context->getShader(program))
4709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004711 }
4712 else
4713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004714 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004715 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004716 }
4717
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004718 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004719 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722 }
4723
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004724 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725 }
4726 }
4727 catch(std::bad_alloc&)
4728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004729 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004730 }
4731
4732 return -1;
4733}
4734
4735void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4736{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004737 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004738
4739 try
4740 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004741 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742
daniel@transgaming.come0078962010-04-15 20:45:08 +00004743 if (context)
4744 {
4745 if (index >= gl::MAX_VERTEX_ATTRIBS)
4746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004747 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004748 }
4749
daniel@transgaming.com83921382011-01-08 05:46:00 +00004750 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004751
daniel@transgaming.come0078962010-04-15 20:45:08 +00004752 switch (pname)
4753 {
4754 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004755 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004756 break;
4757 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004758 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004759 break;
4760 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004761 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004762 break;
4763 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004764 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004765 break;
4766 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004767 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004768 break;
4769 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004770 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004771 break;
4772 case GL_CURRENT_VERTEX_ATTRIB:
4773 for (int i = 0; i < 4; ++i)
4774 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004775 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004776 }
4777 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004778 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4779 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4780 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004781 *params = (GLfloat)attribState.mDivisor;
4782 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004784 }
4785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787 catch(std::bad_alloc&)
4788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 }
4791}
4792
4793void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004795 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796
4797 try
4798 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004800
daniel@transgaming.come0078962010-04-15 20:45:08 +00004801 if (context)
4802 {
4803 if (index >= gl::MAX_VERTEX_ATTRIBS)
4804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004806 }
4807
daniel@transgaming.com83921382011-01-08 05:46:00 +00004808 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004809
daniel@transgaming.come0078962010-04-15 20:45:08 +00004810 switch (pname)
4811 {
4812 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004813 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004814 break;
4815 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004816 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004817 break;
4818 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004819 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004820 break;
4821 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004822 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004823 break;
4824 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004825 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004826 break;
4827 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004828 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004829 break;
4830 case GL_CURRENT_VERTEX_ATTRIB:
4831 for (int i = 0; i < 4; ++i)
4832 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004833 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004834 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4835 }
4836 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004837 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4838 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4839 // the same constant.
4840 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004841 *params = (GLint)attribState.mDivisor;
4842 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004843 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004844 }
4845 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846 }
4847 catch(std::bad_alloc&)
4848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004849 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004850 }
4851}
4852
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004853void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004855 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856
4857 try
4858 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860
daniel@transgaming.come0078962010-04-15 20:45:08 +00004861 if (context)
4862 {
4863 if (index >= gl::MAX_VERTEX_ATTRIBS)
4864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004866 }
4867
4868 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004871 }
4872
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004873 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004874 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004875 }
4876 catch(std::bad_alloc&)
4877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879 }
4880}
4881
4882void __stdcall glHint(GLenum target, GLenum mode)
4883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004884 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885
4886 try
4887 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004888 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004889 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004890 case GL_FASTEST:
4891 case GL_NICEST:
4892 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004893 break;
4894 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004895 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004896 }
4897
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004898 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004899 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004900 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004901 case GL_GENERATE_MIPMAP_HINT:
4902 if (context) context->setGenerateMipmapHint(mode);
4903 break;
4904 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4905 if (context) context->setFragmentShaderDerivativeHint(mode);
4906 break;
4907 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004908 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004909 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910 }
4911 catch(std::bad_alloc&)
4912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004913 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004914 }
4915}
4916
4917GLboolean __stdcall glIsBuffer(GLuint buffer)
4918{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004919 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920
4921 try
4922 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004923 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924
4925 if (context && buffer)
4926 {
4927 gl::Buffer *bufferObject = context->getBuffer(buffer);
4928
4929 if (bufferObject)
4930 {
4931 return GL_TRUE;
4932 }
4933 }
4934 }
4935 catch(std::bad_alloc&)
4936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004937 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004938 }
4939
4940 return GL_FALSE;
4941}
4942
4943GLboolean __stdcall glIsEnabled(GLenum cap)
4944{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004945 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946
4947 try
4948 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004949 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004950
4951 if (context)
4952 {
4953 switch (cap)
4954 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004955 case GL_CULL_FACE: return context->isCullFaceEnabled();
4956 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4957 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4958 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4959 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4960 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4961 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4962 case GL_BLEND: return context->isBlendEnabled();
4963 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004964 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004965 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966 }
4967 }
4968 }
4969 catch(std::bad_alloc&)
4970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004971 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004972 }
4973
4974 return false;
4975}
4976
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004977GLboolean __stdcall glIsFenceNV(GLuint fence)
4978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004979 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004980
4981 try
4982 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004983 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004984
4985 if (context)
4986 {
4987 gl::Fence *fenceObject = context->getFence(fence);
4988
4989 if (fenceObject == NULL)
4990 {
4991 return GL_FALSE;
4992 }
4993
4994 return fenceObject->isFence();
4995 }
4996 }
4997 catch(std::bad_alloc&)
4998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004999 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005000 }
5001
5002 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005003}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005004
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005005GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5006{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005007 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008
5009 try
5010 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005011 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005012
5013 if (context && framebuffer)
5014 {
5015 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5016
5017 if (framebufferObject)
5018 {
5019 return GL_TRUE;
5020 }
5021 }
5022 }
5023 catch(std::bad_alloc&)
5024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005025 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005026 }
5027
5028 return GL_FALSE;
5029}
5030
5031GLboolean __stdcall glIsProgram(GLuint program)
5032{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005033 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005034
5035 try
5036 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005037 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038
5039 if (context && program)
5040 {
5041 gl::Program *programObject = context->getProgram(program);
5042
5043 if (programObject)
5044 {
5045 return GL_TRUE;
5046 }
5047 }
5048 }
5049 catch(std::bad_alloc&)
5050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005051 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005052 }
5053
5054 return GL_FALSE;
5055}
5056
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005057GLboolean __stdcall glIsQueryEXT(GLuint id)
5058{
5059 EVENT("(GLuint id = %d)", id);
5060
5061 try
5062 {
5063 if (id == 0)
5064 {
5065 return GL_FALSE;
5066 }
5067
5068 gl::Context *context = gl::getNonLostContext();
5069
5070 if (context)
5071 {
5072 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5073
5074 if (queryObject)
5075 {
5076 return GL_TRUE;
5077 }
5078 }
5079 }
5080 catch(std::bad_alloc&)
5081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005082 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005083 }
5084
5085 return GL_FALSE;
5086}
5087
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5089{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005090 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005091
5092 try
5093 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005095
5096 if (context && renderbuffer)
5097 {
5098 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5099
5100 if (renderbufferObject)
5101 {
5102 return GL_TRUE;
5103 }
5104 }
5105 }
5106 catch(std::bad_alloc&)
5107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005108 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005109 }
5110
5111 return GL_FALSE;
5112}
5113
5114GLboolean __stdcall glIsShader(GLuint shader)
5115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005116 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005117
5118 try
5119 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121
5122 if (context && shader)
5123 {
5124 gl::Shader *shaderObject = context->getShader(shader);
5125
5126 if (shaderObject)
5127 {
5128 return GL_TRUE;
5129 }
5130 }
5131 }
5132 catch(std::bad_alloc&)
5133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005134 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005135 }
5136
5137 return GL_FALSE;
5138}
5139
5140GLboolean __stdcall glIsTexture(GLuint texture)
5141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005142 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005143
5144 try
5145 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005146 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005147
5148 if (context && texture)
5149 {
5150 gl::Texture *textureObject = context->getTexture(texture);
5151
5152 if (textureObject)
5153 {
5154 return GL_TRUE;
5155 }
5156 }
5157 }
5158 catch(std::bad_alloc&)
5159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005160 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005161 }
5162
5163 return GL_FALSE;
5164}
5165
5166void __stdcall glLineWidth(GLfloat width)
5167{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005168 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169
5170 try
5171 {
5172 if (width <= 0.0f)
5173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005175 }
5176
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005178
5179 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005181 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005182 }
5183 }
5184 catch(std::bad_alloc&)
5185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005186 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005187 }
5188}
5189
5190void __stdcall glLinkProgram(GLuint program)
5191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005192 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005193
5194 try
5195 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005196 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197
5198 if (context)
5199 {
5200 gl::Program *programObject = context->getProgram(program);
5201
5202 if (!programObject)
5203 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005204 if (context->getShader(program))
5205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005206 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005207 }
5208 else
5209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005210 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005211 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 }
5213
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005214 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215 }
5216 }
5217 catch(std::bad_alloc&)
5218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005219 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220 }
5221}
5222
5223void __stdcall glPixelStorei(GLenum pname, GLint param)
5224{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005225 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226
5227 try
5228 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005229 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005230
5231 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005232 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005233 switch (pname)
5234 {
5235 case GL_UNPACK_ALIGNMENT:
5236 if (param != 1 && param != 2 && param != 4 && param != 8)
5237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005239 }
5240
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005241 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005242 break;
5243
5244 case GL_PACK_ALIGNMENT:
5245 if (param != 1 && param != 2 && param != 4 && param != 8)
5246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005248 }
5249
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005250 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005251 break;
5252
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005253 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5254 context->setPackReverseRowOrder(param != 0);
5255 break;
5256
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005257 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005258 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005259 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260 }
5261 }
5262 catch(std::bad_alloc&)
5263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 }
5266}
5267
5268void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005270 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271
5272 try
5273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005275
5276 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005278 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005279 }
5280 }
5281 catch(std::bad_alloc&)
5282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005283 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284 }
5285}
5286
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005287void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5288 GLenum format, GLenum type, GLsizei bufSize,
5289 GLvoid *data)
5290{
5291 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5292 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5293 x, y, width, height, format, type, bufSize, data);
5294
5295 try
5296 {
5297 if (width < 0 || height < 0 || bufSize < 0)
5298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005300 }
5301
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005302 gl::Context *context = gl::getNonLostContext();
5303
5304 if (context)
5305 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005306 GLenum currentFormat, currentType;
5307
5308 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5309 // and attempting to read back if that's the case is an error. The error will be registered
5310 // by getCurrentReadFormat.
5311 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5312 return;
5313
5314 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005316 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005317 }
5318
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005319 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5320 }
5321 }
5322 catch(std::bad_alloc&)
5323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005324 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005325 }
5326}
5327
5328void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5329 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005331 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005332 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005333 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005334
5335 try
5336 {
5337 if (width < 0 || height < 0)
5338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340 }
5341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005343
5344 if (context)
5345 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005346 GLenum currentFormat, currentType;
5347
5348 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5349 // and attempting to read back if that's the case is an error. The error will be registered
5350 // by getCurrentReadFormat.
5351 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5352 return;
5353
5354 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005356 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005357 }
5358
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005359 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 }
5361 }
5362 catch(std::bad_alloc&)
5363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005365 }
5366}
5367
5368void __stdcall glReleaseShaderCompiler(void)
5369{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005370 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005371
5372 try
5373 {
5374 gl::Shader::releaseCompiler();
5375 }
5376 catch(std::bad_alloc&)
5377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005378 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005379 }
5380}
5381
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005382void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005383{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005384 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 +00005385 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005386
5387 try
5388 {
5389 switch (target)
5390 {
5391 case GL_RENDERBUFFER:
5392 break;
5393 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005394 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005395 }
5396
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005397 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005402 if (width < 0 || height < 0 || samples < 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_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005405 }
5406
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005407 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005408
5409 if (context)
5410 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005411 if (width > context->getMaximumRenderbufferDimension() ||
5412 height > context->getMaximumRenderbufferDimension() ||
5413 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005415 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005416 }
5417
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005418 GLuint handle = context->getRenderbufferHandle();
5419 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005421 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005422 }
5423
5424 switch (internalformat)
5425 {
5426 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005427 case GL_RGBA4:
5428 case GL_RGB5_A1:
5429 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005430 case GL_RGB8_OES:
5431 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005433 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005434 break;
5435 case GL_SRGB8_ALPHA8:
5436 case GL_RGB10_A2:
5437 case GL_RG8:
5438 case GL_R8:
5439 if (context->getClientVersion() < 3)
5440 {
5441 return gl::error(GL_INVALID_ENUM);
5442 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005443 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005445 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005447
5448 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005449 }
5450 }
5451 catch(std::bad_alloc&)
5452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454 }
5455}
5456
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005457void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5458{
5459 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5460}
5461
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5463{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005464 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465
5466 try
5467 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005468 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005469
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005470 if (context)
5471 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005472 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005473 }
5474 }
5475 catch(std::bad_alloc&)
5476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005477 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 }
5479}
5480
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005481void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005483 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005484
5485 try
5486 {
5487 if (condition != GL_ALL_COMPLETED_NV)
5488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005490 }
5491
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005492 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005493
5494 if (context)
5495 {
5496 gl::Fence *fenceObject = context->getFence(fence);
5497
5498 if (fenceObject == NULL)
5499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005500 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005501 }
5502
5503 fenceObject->setFence(condition);
5504 }
5505 }
5506 catch(std::bad_alloc&)
5507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005508 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005509 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005510}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005511
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005512void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005514 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 +00005515
5516 try
5517 {
5518 if (width < 0 || height < 0)
5519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005521 }
5522
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005523 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005524
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 if (context)
5526 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005527 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005528 }
5529 }
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
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005536void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005537{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005538 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005539 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005540 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541
5542 try
5543 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005544 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005545 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 }
5547 catch(std::bad_alloc&)
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005550 }
5551}
5552
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005553void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005555 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 +00005556 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005557
5558 try
5559 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005560 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005565 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005566
5567 if (context)
5568 {
5569 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005570
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571 if (!shaderObject)
5572 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005573 if (context->getProgram(shader))
5574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005575 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005576 }
5577 else
5578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005579 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005580 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005581 }
5582
5583 shaderObject->setSource(count, string, length);
5584 }
5585 }
5586 catch(std::bad_alloc&)
5587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005588 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 }
5590}
5591
5592void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5593{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005594 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005595}
5596
5597void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005599 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 +00005600
5601 try
5602 {
5603 switch (face)
5604 {
5605 case GL_FRONT:
5606 case GL_BACK:
5607 case GL_FRONT_AND_BACK:
5608 break;
5609 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
5612
5613 switch (func)
5614 {
5615 case GL_NEVER:
5616 case GL_ALWAYS:
5617 case GL_LESS:
5618 case GL_LEQUAL:
5619 case GL_EQUAL:
5620 case GL_GEQUAL:
5621 case GL_GREATER:
5622 case GL_NOTEQUAL:
5623 break;
5624 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005625 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626 }
5627
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005628 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629
5630 if (context)
5631 {
5632 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5633 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005634 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005635 }
5636
5637 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5638 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005639 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 }
5641 }
5642 }
5643 catch(std::bad_alloc&)
5644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005646 }
5647}
5648
5649void __stdcall glStencilMask(GLuint mask)
5650{
5651 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5652}
5653
5654void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005656 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657
5658 try
5659 {
5660 switch (face)
5661 {
5662 case GL_FRONT:
5663 case GL_BACK:
5664 case GL_FRONT_AND_BACK:
5665 break;
5666 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005667 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668 }
5669
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005670 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671
5672 if (context)
5673 {
5674 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5675 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005676 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005677 }
5678
5679 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5680 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005681 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005682 }
5683 }
5684 }
5685 catch(std::bad_alloc&)
5686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 }
5689}
5690
5691void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5692{
5693 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5694}
5695
5696void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005698 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 +00005699 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700
5701 try
5702 {
5703 switch (face)
5704 {
5705 case GL_FRONT:
5706 case GL_BACK:
5707 case GL_FRONT_AND_BACK:
5708 break;
5709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711 }
5712
5713 switch (fail)
5714 {
5715 case GL_ZERO:
5716 case GL_KEEP:
5717 case GL_REPLACE:
5718 case GL_INCR:
5719 case GL_DECR:
5720 case GL_INVERT:
5721 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005722 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005723 break;
5724 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005725 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726 }
5727
5728 switch (zfail)
5729 {
5730 case GL_ZERO:
5731 case GL_KEEP:
5732 case GL_REPLACE:
5733 case GL_INCR:
5734 case GL_DECR:
5735 case GL_INVERT:
5736 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005737 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 break;
5739 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005741 }
5742
5743 switch (zpass)
5744 {
5745 case GL_ZERO:
5746 case GL_KEEP:
5747 case GL_REPLACE:
5748 case GL_INCR:
5749 case GL_DECR:
5750 case GL_INVERT:
5751 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005752 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753 break;
5754 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 }
5757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005759
5760 if (context)
5761 {
5762 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5763 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005764 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005765 }
5766
5767 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5768 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005769 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005770 }
5771 }
5772 }
5773 catch(std::bad_alloc&)
5774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005776 }
5777}
5778
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005779GLboolean __stdcall glTestFenceNV(GLuint fence)
5780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005781 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005782
5783 try
5784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005785 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005786
5787 if (context)
5788 {
5789 gl::Fence *fenceObject = context->getFence(fence);
5790
5791 if (fenceObject == NULL)
5792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005793 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005794 }
5795
5796 return fenceObject->testFence();
5797 }
5798 }
5799 catch(std::bad_alloc&)
5800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005802 }
5803
5804 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005805}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005806
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005807void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5808 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005809{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005810 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 +00005811 "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 +00005812 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813
5814 try
5815 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005816 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005820
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005821 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005824 }
5825
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005826 // validate <type> by itself (used as secondary key below)
5827 switch (type)
5828 {
5829 case GL_UNSIGNED_BYTE:
5830 case GL_UNSIGNED_SHORT_5_6_5:
5831 case GL_UNSIGNED_SHORT_4_4_4_4:
5832 case GL_UNSIGNED_SHORT_5_5_5_1:
5833 case GL_UNSIGNED_SHORT:
5834 case GL_UNSIGNED_INT:
5835 case GL_UNSIGNED_INT_24_8_OES:
5836 case GL_HALF_FLOAT_OES:
5837 case GL_FLOAT:
5838 break;
5839 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005840 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005841 }
5842
5843 // validate <format> + <type> combinations
5844 // - invalid <format> -> sets INVALID_ENUM
5845 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005846 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005847 {
5848 case GL_ALPHA:
5849 case GL_LUMINANCE:
5850 case GL_LUMINANCE_ALPHA:
5851 switch (type)
5852 {
5853 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005854 case GL_FLOAT:
5855 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005856 break;
5857 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005858 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005859 }
5860 break;
5861 case GL_RGB:
5862 switch (type)
5863 {
5864 case GL_UNSIGNED_BYTE:
5865 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005866 case GL_FLOAT:
5867 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005868 break;
5869 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005870 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005871 }
5872 break;
5873 case GL_RGBA:
5874 switch (type)
5875 {
5876 case GL_UNSIGNED_BYTE:
5877 case GL_UNSIGNED_SHORT_4_4_4_4:
5878 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005879 case GL_FLOAT:
5880 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005881 break;
5882 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005886 case GL_BGRA_EXT:
5887 switch (type)
5888 {
5889 case GL_UNSIGNED_BYTE:
5890 break;
5891 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005892 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005893 }
5894 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005895 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5896 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005897 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5898 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005899 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005900 case GL_DEPTH_COMPONENT:
5901 switch (type)
5902 {
5903 case GL_UNSIGNED_SHORT:
5904 case GL_UNSIGNED_INT:
5905 break;
5906 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005907 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005908 }
5909 break;
5910 case GL_DEPTH_STENCIL_OES:
5911 switch (type)
5912 {
5913 case GL_UNSIGNED_INT_24_8_OES:
5914 break;
5915 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005917 }
5918 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005919 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921 }
5922
5923 if (border != 0)
5924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005926 }
5927
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005929
5930 if (context)
5931 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005932 if (level > context->getMaximumTextureLevel())
5933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005935 }
5936
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005937 switch (target)
5938 {
5939 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00005940 if (width > (context->getMaximum2DTextureDimension() >> level) ||
5941 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005942 {
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 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5947 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5948 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5949 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5950 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5951 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5952 if (width != height)
5953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005954 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005955 }
5956
5957 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5958 height > (context->getMaximumCubeTextureDimension() >> level))
5959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005961 }
5962 break;
5963 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005964 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005965 }
5966
gman@chromium.org50c526d2011-08-10 05:19:44 +00005967 switch (format) {
5968 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5969 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5970 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005973 }
5974 else
5975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005976 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005977 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005978 break;
5979 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5980 if (context->supportsDXT3Textures())
5981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005983 }
5984 else
5985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005986 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005987 }
5988 break;
5989 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5990 if (context->supportsDXT5Textures())
5991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005992 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005993 }
5994 else
5995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005997 }
5998 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005999 case GL_DEPTH_COMPONENT:
6000 case GL_DEPTH_STENCIL_OES:
6001 if (!context->supportsDepthTextures())
6002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006003 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006004 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006005 if (target != GL_TEXTURE_2D)
6006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006007 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006008 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006009 // OES_depth_texture supports loading depth data and multiple levels,
6010 // but ANGLE_depth_texture does not
6011 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006013 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006014 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006015 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006016 default:
6017 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006018 }
6019
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006020 if (type == GL_FLOAT)
6021 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006022 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006025 }
6026 }
6027 else if (type == GL_HALF_FLOAT_OES)
6028 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006029 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006031 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006032 }
6033 }
6034
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 if (target == GL_TEXTURE_2D)
6036 {
6037 gl::Texture2D *texture = context->getTexture2D();
6038
6039 if (!texture)
6040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006041 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006042 }
6043
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006044 if (texture->isImmutable())
6045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006046 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006047 }
6048
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006049 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006050 }
6051 else
6052 {
6053 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6054
6055 if (!texture)
6056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006057 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 }
6059
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006060 if (texture->isImmutable())
6061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006062 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006063 }
6064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006065 switch (target)
6066 {
6067 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006068 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006069 break;
6070 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006071 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006072 break;
6073 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006074 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006075 break;
6076 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006077 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006078 break;
6079 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006080 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006081 break;
6082 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006083 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006084 break;
6085 default: UNREACHABLE();
6086 }
6087 }
6088 }
6089 }
6090 catch(std::bad_alloc&)
6091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093 }
6094}
6095
6096void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6097{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006098 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6099
6100 try
6101 {
6102 gl::Context *context = gl::getNonLostContext();
6103
6104 if (context)
6105 {
6106 gl::Texture *texture;
6107
6108 switch (target)
6109 {
6110 case GL_TEXTURE_2D:
6111 texture = context->getTexture2D();
6112 break;
6113 case GL_TEXTURE_CUBE_MAP:
6114 texture = context->getTextureCubeMap();
6115 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006116 case GL_TEXTURE_3D:
6117 if (context->getClientVersion() < 3)
6118 {
6119 return gl::error(GL_INVALID_ENUM);
6120 }
6121 texture = context->getTexture3D();
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006122 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006123 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006124 }
6125
6126 switch (pname)
6127 {
6128 case GL_TEXTURE_WRAP_S:
6129 if (!texture->setWrapS((GLenum)param))
6130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006131 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006132 }
6133 break;
6134 case GL_TEXTURE_WRAP_T:
6135 if (!texture->setWrapT((GLenum)param))
6136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006138 }
6139 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006140 case GL_TEXTURE_WRAP_R:
6141 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6142 {
6143 return gl::error(GL_INVALID_ENUM);
6144 }
6145 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006146 case GL_TEXTURE_MIN_FILTER:
6147 if (!texture->setMinFilter((GLenum)param))
6148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006150 }
6151 break;
6152 case GL_TEXTURE_MAG_FILTER:
6153 if (!texture->setMagFilter((GLenum)param))
6154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006155 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006156 }
6157 break;
6158 case GL_TEXTURE_USAGE_ANGLE:
6159 if (!texture->setUsage((GLenum)param))
6160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006162 }
6163 break;
6164 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6165 if (!context->supportsTextureFilterAnisotropy())
6166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006167 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006168 }
6169 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006171 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006172 }
6173 break;
6174 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006175 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006176 }
6177 }
6178 }
6179 catch(std::bad_alloc&)
6180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006182 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006183}
6184
6185void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6186{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006187 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006188}
6189
6190void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006192 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006193
6194 try
6195 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006196 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006197
6198 if (context)
6199 {
6200 gl::Texture *texture;
6201
6202 switch (target)
6203 {
6204 case GL_TEXTURE_2D:
6205 texture = context->getTexture2D();
6206 break;
6207 case GL_TEXTURE_CUBE_MAP:
6208 texture = context->getTextureCubeMap();
6209 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006210 case GL_TEXTURE_3D:
6211 if (context->getClientVersion() < 3)
6212 {
6213 return gl::error(GL_INVALID_ENUM);
6214 }
6215 texture = context->getTexture3D();
6216 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006217 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006218 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006219 }
6220
6221 switch (pname)
6222 {
6223 case GL_TEXTURE_WRAP_S:
6224 if (!texture->setWrapS((GLenum)param))
6225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006226 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006227 }
6228 break;
6229 case GL_TEXTURE_WRAP_T:
6230 if (!texture->setWrapT((GLenum)param))
6231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006232 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006233 }
6234 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006235 case GL_TEXTURE_WRAP_R:
6236 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6237 {
6238 return gl::error(GL_INVALID_ENUM);
6239 }
6240 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241 case GL_TEXTURE_MIN_FILTER:
6242 if (!texture->setMinFilter((GLenum)param))
6243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006244 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006245 }
6246 break;
6247 case GL_TEXTURE_MAG_FILTER:
6248 if (!texture->setMagFilter((GLenum)param))
6249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006250 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006251 }
6252 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006253 case GL_TEXTURE_USAGE_ANGLE:
6254 if (!texture->setUsage((GLenum)param))
6255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006256 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006257 }
6258 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006259 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6260 if (!context->supportsTextureFilterAnisotropy())
6261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006262 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006263 }
6264 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006266 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006267 }
6268 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006269 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006270 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006271 }
6272 }
6273 }
6274 catch(std::bad_alloc&)
6275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006276 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006277 }
6278}
6279
6280void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6281{
6282 glTexParameteri(target, pname, *params);
6283}
6284
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006285void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6286{
6287 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6288 target, levels, internalformat, width, height);
6289
6290 try
6291 {
6292 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006294 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006295 }
6296
6297 if (width < 1 || height < 1 || levels < 1)
6298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006300 }
6301
6302 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006305 }
6306
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006307 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006309 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006310 }
6311
6312 GLenum format = gl::ExtractFormat(internalformat);
6313 GLenum type = gl::ExtractType(internalformat);
6314
6315 if (format == GL_NONE || type == GL_NONE)
6316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006317 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006318 }
6319
6320 gl::Context *context = gl::getNonLostContext();
6321
6322 if (context)
6323 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006324 switch (target)
6325 {
6326 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006327 if (width > context->getMaximum2DTextureDimension() ||
6328 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006331 }
6332 break;
6333 case GL_TEXTURE_CUBE_MAP:
6334 if (width > context->getMaximumCubeTextureDimension() ||
6335 height > context->getMaximumCubeTextureDimension())
6336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006337 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006338 }
6339 break;
6340 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006341 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006342 }
6343
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006344 if (levels != 1 && !context->supportsNonPower2Texture())
6345 {
6346 if (!gl::isPow2(width) || !gl::isPow2(height))
6347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006348 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006349 }
6350 }
6351
daniel@transgaming.come1077362011-11-11 04:16:50 +00006352 switch (internalformat)
6353 {
6354 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6355 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6356 if (!context->supportsDXT1Textures())
6357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006358 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006359 }
6360 break;
6361 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6362 if (!context->supportsDXT3Textures())
6363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006365 }
6366 break;
6367 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6368 if (!context->supportsDXT5Textures())
6369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006370 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006371 }
6372 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006373 case GL_RGBA32F_EXT:
6374 case GL_RGB32F_EXT:
6375 case GL_ALPHA32F_EXT:
6376 case GL_LUMINANCE32F_EXT:
6377 case GL_LUMINANCE_ALPHA32F_EXT:
6378 if (!context->supportsFloat32Textures())
6379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006380 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006381 }
6382 break;
6383 case GL_RGBA16F_EXT:
6384 case GL_RGB16F_EXT:
6385 case GL_ALPHA16F_EXT:
6386 case GL_LUMINANCE16F_EXT:
6387 case GL_LUMINANCE_ALPHA16F_EXT:
6388 if (!context->supportsFloat16Textures())
6389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006390 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006391 }
6392 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006393 case GL_DEPTH_COMPONENT16:
6394 case GL_DEPTH_COMPONENT32_OES:
6395 case GL_DEPTH24_STENCIL8_OES:
6396 if (!context->supportsDepthTextures())
6397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006398 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006399 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006400 if (target != GL_TEXTURE_2D)
6401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006402 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006403 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006404 // ANGLE_depth_texture only supports 1-level textures
6405 if (levels != 1)
6406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006407 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006408 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006409 break;
6410 default:
6411 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006412 }
6413
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006414 if (target == GL_TEXTURE_2D)
6415 {
6416 gl::Texture2D *texture = context->getTexture2D();
6417
6418 if (!texture || texture->id() == 0)
6419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006420 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006421 }
6422
6423 if (texture->isImmutable())
6424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006425 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006426 }
6427
6428 texture->storage(levels, internalformat, width, height);
6429 }
6430 else if (target == GL_TEXTURE_CUBE_MAP)
6431 {
6432 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6433
6434 if (!texture || texture->id() == 0)
6435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006436 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006437 }
6438
6439 if (texture->isImmutable())
6440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006441 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006442 }
6443
6444 texture->storage(levels, internalformat, width);
6445 }
6446 else UNREACHABLE();
6447 }
6448 }
6449 catch(std::bad_alloc&)
6450 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006451 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006452 }
6453}
6454
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006455void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6456 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006458 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006459 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006460 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006461 target, level, xoffset, yoffset, width, height, format, type, pixels);
6462
6463 try
6464 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006465 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006468 }
6469
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006470 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006472 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006473 }
6474
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006475 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006477 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006478 }
6479
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006480 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006481 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006482 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006483 }
6484
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006486
6487 if (context)
6488 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006489 if (level > context->getMaximumTextureLevel())
6490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006491 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006492 }
6493
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006494 if (format == GL_FLOAT)
6495 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006496 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006498 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006499 }
6500 }
6501 else if (format == GL_HALF_FLOAT_OES)
6502 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006503 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006506 }
6507 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006508 else if (gl::IsDepthTexture(format))
6509 {
6510 if (!context->supportsDepthTextures())
6511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006512 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006513 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006514 if (target != GL_TEXTURE_2D)
6515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006517 }
6518 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006520 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006521
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006522 if (width == 0 || height == 0 || pixels == NULL)
6523 {
6524 return;
6525 }
6526
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006527 if (target == GL_TEXTURE_2D)
6528 {
6529 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006530 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006531 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006532 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006533 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006534 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006535 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006536 {
6537 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006538 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006539 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006540 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006541 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006542 }
6543 else
6544 {
6545 UNREACHABLE();
6546 }
6547 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006548 }
6549 catch(std::bad_alloc&)
6550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006552 }
6553}
6554
6555void __stdcall glUniform1f(GLint location, GLfloat x)
6556{
6557 glUniform1fv(location, 1, &x);
6558}
6559
6560void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006562 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006563
6564 try
6565 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006566 if (count < 0)
6567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006568 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006569 }
6570
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006571 if (location == -1)
6572 {
6573 return;
6574 }
6575
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006576 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006577
6578 if (context)
6579 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006580 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006581 if (!programBinary)
6582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006583 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006584 }
6585
6586 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006588 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006589 }
6590 }
6591 }
6592 catch(std::bad_alloc&)
6593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006594 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006595 }
6596}
6597
6598void __stdcall glUniform1i(GLint location, GLint x)
6599{
6600 glUniform1iv(location, 1, &x);
6601}
6602
6603void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6604{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006605 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006606
6607 try
6608 {
6609 if (count < 0)
6610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006612 }
6613
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006614 if (location == -1)
6615 {
6616 return;
6617 }
6618
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006619 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006620
6621 if (context)
6622 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006623 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006624 if (!programBinary)
6625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006626 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006627 }
6628
6629 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006631 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006632 }
6633 }
6634 }
6635 catch(std::bad_alloc&)
6636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006638 }
6639}
6640
6641void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6642{
6643 GLfloat xy[2] = {x, y};
6644
6645 glUniform2fv(location, 1, (GLfloat*)&xy);
6646}
6647
6648void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006650 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006651
6652 try
6653 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006654 if (count < 0)
6655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006656 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006657 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006658
6659 if (location == -1)
6660 {
6661 return;
6662 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006663
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006665
6666 if (context)
6667 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006668 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006669 if (!programBinary)
6670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006671 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006672 }
6673
6674 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006677 }
6678 }
6679 }
6680 catch(std::bad_alloc&)
6681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006682 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006683 }
6684}
6685
6686void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6687{
6688 GLint xy[4] = {x, y};
6689
6690 glUniform2iv(location, 1, (GLint*)&xy);
6691}
6692
6693void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006695 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006696
6697 try
6698 {
6699 if (count < 0)
6700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006701 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006702 }
6703
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006704 if (location == -1)
6705 {
6706 return;
6707 }
6708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006710
6711 if (context)
6712 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006713 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006714 if (!programBinary)
6715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006716 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006717 }
6718
6719 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006721 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006722 }
6723 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006724 }
6725 catch(std::bad_alloc&)
6726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006727 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006728 }
6729}
6730
6731void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6732{
6733 GLfloat xyz[3] = {x, y, z};
6734
6735 glUniform3fv(location, 1, (GLfloat*)&xyz);
6736}
6737
6738void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006740 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006741
6742 try
6743 {
6744 if (count < 0)
6745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006747 }
6748
6749 if (location == -1)
6750 {
6751 return;
6752 }
6753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006755
6756 if (context)
6757 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006758 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006759 if (!programBinary)
6760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006761 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006762 }
6763
6764 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006767 }
6768 }
6769 }
6770 catch(std::bad_alloc&)
6771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006773 }
6774}
6775
6776void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6777{
6778 GLint xyz[3] = {x, y, z};
6779
6780 glUniform3iv(location, 1, (GLint*)&xyz);
6781}
6782
6783void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006785 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006786
6787 try
6788 {
6789 if (count < 0)
6790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006792 }
6793
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006794 if (location == -1)
6795 {
6796 return;
6797 }
6798
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006800
6801 if (context)
6802 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006803 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006804 if (!programBinary)
6805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006806 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006807 }
6808
6809 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006811 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006812 }
6813 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006814 }
6815 catch(std::bad_alloc&)
6816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006818 }
6819}
6820
6821void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6822{
6823 GLfloat xyzw[4] = {x, y, z, w};
6824
6825 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6826}
6827
6828void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006830 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831
6832 try
6833 {
6834 if (count < 0)
6835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006837 }
6838
6839 if (location == -1)
6840 {
6841 return;
6842 }
6843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006845
6846 if (context)
6847 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006848 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006849 if (!programBinary)
6850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006851 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006852 }
6853
6854 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006857 }
6858 }
6859 }
6860 catch(std::bad_alloc&)
6861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006863 }
6864}
6865
6866void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6867{
6868 GLint xyzw[4] = {x, y, z, w};
6869
6870 glUniform4iv(location, 1, (GLint*)&xyzw);
6871}
6872
6873void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006875 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006876
6877 try
6878 {
6879 if (count < 0)
6880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006882 }
6883
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006884 if (location == -1)
6885 {
6886 return;
6887 }
6888
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006890
6891 if (context)
6892 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006893 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006894 if (!programBinary)
6895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006896 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006897 }
6898
6899 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006901 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006902 }
6903 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006904 }
6905 catch(std::bad_alloc&)
6906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006907 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006908 }
6909}
6910
6911void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6912{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006913 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006914 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006915
6916 try
6917 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006918 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006920 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006921 }
6922
6923 if (location == -1)
6924 {
6925 return;
6926 }
6927
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006928 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006929
6930 if (context)
6931 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006932 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6933 {
6934 return gl::error(GL_INVALID_VALUE);
6935 }
6936
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006937 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006938 if (!programBinary)
6939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006940 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006941 }
6942
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006943 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006945 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006946 }
6947 }
6948 }
6949 catch(std::bad_alloc&)
6950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006952 }
6953}
6954
6955void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6956{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006957 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006958 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006959
6960 try
6961 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006962 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006964 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006965 }
6966
6967 if (location == -1)
6968 {
6969 return;
6970 }
6971
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006972 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006973
6974 if (context)
6975 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006976 if (transpose != GL_FALSE && context->getClientVersion() < 3)
6977 {
6978 return gl::error(GL_INVALID_VALUE);
6979 }
6980
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006981 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006982 if (!programBinary)
6983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006984 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006985 }
6986
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006987 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006989 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006990 }
6991 }
6992 }
6993 catch(std::bad_alloc&)
6994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006996 }
6997}
6998
6999void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7000{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007001 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007002 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007003
7004 try
7005 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007006 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007008 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007009 }
7010
7011 if (location == -1)
7012 {
7013 return;
7014 }
7015
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007017
7018 if (context)
7019 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007020 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7021 {
7022 return gl::error(GL_INVALID_VALUE);
7023 }
7024
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007025 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007026 if (!programBinary)
7027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007028 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007029 }
7030
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007031 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007033 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007034 }
7035 }
7036 }
7037 catch(std::bad_alloc&)
7038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007039 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007040 }
7041}
7042
7043void __stdcall glUseProgram(GLuint program)
7044{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007045 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007046
7047 try
7048 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007049 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007050
7051 if (context)
7052 {
7053 gl::Program *programObject = context->getProgram(program);
7054
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007055 if (!programObject && program != 0)
7056 {
7057 if (context->getShader(program))
7058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007059 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007060 }
7061 else
7062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007064 }
7065 }
7066
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007067 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007069 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007070 }
7071
7072 context->useProgram(program);
7073 }
7074 }
7075 catch(std::bad_alloc&)
7076 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007077 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007078 }
7079}
7080
7081void __stdcall glValidateProgram(GLuint program)
7082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007083 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007084
7085 try
7086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007088
7089 if (context)
7090 {
7091 gl::Program *programObject = context->getProgram(program);
7092
7093 if (!programObject)
7094 {
7095 if (context->getShader(program))
7096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007097 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007098 }
7099 else
7100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007101 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007102 }
7103 }
7104
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007105 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007106 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007107 }
7108 catch(std::bad_alloc&)
7109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007111 }
7112}
7113
7114void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007116 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007117
7118 try
7119 {
7120 if (index >= gl::MAX_VERTEX_ATTRIBS)
7121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007122 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007123 }
7124
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007125 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007126
7127 if (context)
7128 {
7129 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007130 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007131 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007132 }
7133 catch(std::bad_alloc&)
7134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007136 }
7137}
7138
7139void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7140{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007141 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007142
7143 try
7144 {
7145 if (index >= gl::MAX_VERTEX_ATTRIBS)
7146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007147 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007148 }
7149
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007150 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007151
7152 if (context)
7153 {
7154 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007155 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007156 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007157 }
7158 catch(std::bad_alloc&)
7159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007160 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007161 }
7162}
7163
7164void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7165{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007166 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007167
7168 try
7169 {
7170 if (index >= gl::MAX_VERTEX_ATTRIBS)
7171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007172 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007173 }
7174
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007175 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007176
7177 if (context)
7178 {
7179 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007180 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007181 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007182 }
7183 catch(std::bad_alloc&)
7184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007186 }
7187}
7188
7189void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7190{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007191 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007192
7193 try
7194 {
7195 if (index >= gl::MAX_VERTEX_ATTRIBS)
7196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007197 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007198 }
7199
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007200 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007201
7202 if (context)
7203 {
7204 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007205 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007206 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007207 }
7208 catch(std::bad_alloc&)
7209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007210 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007211 }
7212}
7213
7214void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007216 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 +00007217
7218 try
7219 {
7220 if (index >= gl::MAX_VERTEX_ATTRIBS)
7221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007223 }
7224
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007226
7227 if (context)
7228 {
7229 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007230 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007231 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007232 }
7233 catch(std::bad_alloc&)
7234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007235 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007236 }
7237}
7238
7239void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7240{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007241 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007242
7243 try
7244 {
7245 if (index >= gl::MAX_VERTEX_ATTRIBS)
7246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007247 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007248 }
7249
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007250 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007251
7252 if (context)
7253 {
7254 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007255 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007256 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007257 }
7258 catch(std::bad_alloc&)
7259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007261 }
7262}
7263
7264void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7265{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007266 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 +00007267
7268 try
7269 {
7270 if (index >= gl::MAX_VERTEX_ATTRIBS)
7271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007273 }
7274
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007276
7277 if (context)
7278 {
7279 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007280 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007281 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007282 }
7283 catch(std::bad_alloc&)
7284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007286 }
7287}
7288
7289void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007291 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007292
7293 try
7294 {
7295 if (index >= gl::MAX_VERTEX_ATTRIBS)
7296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007297 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007298 }
7299
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007300 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007301
7302 if (context)
7303 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007304 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007305 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007306 }
7307 catch(std::bad_alloc&)
7308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007310 }
7311}
7312
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007313void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7314{
7315 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7316
7317 try
7318 {
7319 if (index >= gl::MAX_VERTEX_ATTRIBS)
7320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007322 }
7323
7324 gl::Context *context = gl::getNonLostContext();
7325
7326 if (context)
7327 {
7328 context->setVertexAttribDivisor(index, divisor);
7329 }
7330 }
7331 catch(std::bad_alloc&)
7332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007334 }
7335}
7336
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007337void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007339 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007340 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007341 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007342
7343 try
7344 {
7345 if (index >= gl::MAX_VERTEX_ATTRIBS)
7346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007347 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007348 }
7349
7350 if (size < 1 || size > 4)
7351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007352 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007353 }
7354
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007355 gl::Context *context = gl::getNonLostContext();
7356
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007357 switch (type)
7358 {
7359 case GL_BYTE:
7360 case GL_UNSIGNED_BYTE:
7361 case GL_SHORT:
7362 case GL_UNSIGNED_SHORT:
7363 case GL_FIXED:
7364 case GL_FLOAT:
7365 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007366 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007367 case GL_INT:
7368 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007369 case GL_INT_2_10_10_10_REV:
7370 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007371 if (context && context->getClientVersion() < 3)
7372 {
7373 return gl::error(GL_INVALID_ENUM);
7374 }
7375 else
7376 {
7377 break;
7378 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007379 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007380 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007381 }
7382
7383 if (stride < 0)
7384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007385 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007386 }
7387
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007388 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7389 {
7390 return gl::error(GL_INVALID_OPERATION);
7391 }
7392
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007393 if (context)
7394 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007395 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7396 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007397 }
7398 }
7399 catch(std::bad_alloc&)
7400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007401 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007402 }
7403}
7404
7405void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7406{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007407 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 +00007408
7409 try
7410 {
7411 if (width < 0 || height < 0)
7412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007413 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007414 }
7415
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007417
7418 if (context)
7419 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007420 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007421 }
7422 }
7423 catch(std::bad_alloc&)
7424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007426 }
7427}
7428
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007429// OpenGL ES 3.0 functions
7430
7431void __stdcall glReadBuffer(GLenum mode)
7432{
7433 EVENT("(GLenum mode = 0x%X)", mode);
7434
7435 try
7436 {
7437 gl::Context *context = gl::getNonLostContext();
7438
7439 if (context)
7440 {
7441 if (context->getClientVersion() < 3)
7442 {
7443 return gl::error(GL_INVALID_OPERATION);
7444 }
7445 }
7446
7447 UNIMPLEMENTED();
7448 }
7449 catch(std::bad_alloc&)
7450 {
7451 return gl::error(GL_OUT_OF_MEMORY);
7452 }
7453}
7454
7455void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7456{
7457 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7458 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7459
7460 try
7461 {
7462 gl::Context *context = gl::getNonLostContext();
7463
7464 if (context)
7465 {
7466 if (context->getClientVersion() < 3)
7467 {
7468 return gl::error(GL_INVALID_OPERATION);
7469 }
7470 }
7471
7472 UNIMPLEMENTED();
7473 }
7474 catch(std::bad_alloc&)
7475 {
7476 return gl::error(GL_OUT_OF_MEMORY);
7477 }
7478}
7479
7480void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7481{
7482 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7483 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7484 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7485 target, level, internalformat, width, height, depth, border, format, type, pixels);
7486
7487 try
7488 {
7489 gl::Context *context = gl::getNonLostContext();
7490
7491 if (context)
7492 {
7493 if (context->getClientVersion() < 3)
7494 {
7495 return gl::error(GL_INVALID_OPERATION);
7496 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007497
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007498 // validateES3TexImageFormat sets the error code if there is an error
7499 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7500 0, 0, 0, width, height, depth, border, format, type))
7501 {
7502 return;
7503 }
7504
7505 switch(target)
7506 {
7507 case GL_TEXTURE_3D:
7508 {
7509 gl::Texture3D *texture = context->getTexture3D();
7510 texture->setImage(level, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7511 }
7512 break;
7513
7514 case GL_TEXTURE_2D_ARRAY:
7515 UNIMPLEMENTED();
7516 break;
7517
7518 default:
7519 return gl::error(GL_INVALID_ENUM);
7520 }
7521 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007522 }
7523 catch(std::bad_alloc&)
7524 {
7525 return gl::error(GL_OUT_OF_MEMORY);
7526 }
7527}
7528
7529void __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)
7530{
7531 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7532 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7533 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7534 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7535
7536 try
7537 {
7538 gl::Context *context = gl::getNonLostContext();
7539
7540 if (context)
7541 {
7542 if (context->getClientVersion() < 3)
7543 {
7544 return gl::error(GL_INVALID_OPERATION);
7545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007546
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007547 if (!pixels)
7548 {
7549 return gl::error(GL_INVALID_VALUE);
7550 }
7551
7552 // validateES3TexImageFormat sets the error code if there is an error
7553 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7554 xoffset, yoffset, zoffset, width, height, depth, 0,
7555 format, type))
7556 {
7557 return;
7558 }
7559
7560 switch(target)
7561 {
7562 case GL_TEXTURE_3D:
7563 {
7564 gl::Texture3D *texture = context->getTexture3D();
7565 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7566 }
7567 break;
7568
7569 case GL_TEXTURE_2D_ARRAY:
7570 UNIMPLEMENTED();
7571 break;
7572
7573 default:
7574 return gl::error(GL_INVALID_ENUM);
7575 }
7576 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007577 }
7578 catch(std::bad_alloc&)
7579 {
7580 return gl::error(GL_OUT_OF_MEMORY);
7581 }
7582}
7583
7584void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7585{
7586 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7587 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7588 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7589
7590 try
7591 {
7592 gl::Context *context = gl::getNonLostContext();
7593
7594 if (context)
7595 {
7596 if (context->getClientVersion() < 3)
7597 {
7598 return gl::error(GL_INVALID_OPERATION);
7599 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007600
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007601 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7602 x, y, width, height))
7603 {
7604 return;
7605 }
7606
7607 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7608 gl::Texture *texture = NULL;
7609 switch (target)
7610 {
7611 case GL_TEXTURE_3D:
7612 texture = context->getTexture3D();
7613 break;
7614
7615 case GL_TEXTURE_2D_ARRAY:
7616 UNIMPLEMENTED();
7617 break;
7618
7619 default:
7620 return gl::error(GL_INVALID_ENUM);
7621 }
7622
7623 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7624 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007625 }
7626 catch(std::bad_alloc&)
7627 {
7628 return gl::error(GL_OUT_OF_MEMORY);
7629 }
7630}
7631
7632void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7633{
7634 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7635 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7636 "const GLvoid* data = 0x%0.8p)",
7637 target, level, internalformat, width, height, depth, border, imageSize, data);
7638
7639 try
7640 {
7641 gl::Context *context = gl::getNonLostContext();
7642
7643 if (context)
7644 {
7645 if (context->getClientVersion() < 3)
7646 {
7647 return gl::error(GL_INVALID_OPERATION);
7648 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007649
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007650 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, internalformat))
7651 {
7652 return gl::error(GL_INVALID_VALUE);
7653 }
7654
7655 // validateES3TexImageFormat sets the error code if there is an error
7656 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7657 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7658 {
7659 return;
7660 }
7661
7662 switch(target)
7663 {
7664 case GL_TEXTURE_3D:
7665 {
7666 gl::Texture3D *texture = context->getTexture3D();
7667 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7668 }
7669 break;
7670
7671 case GL_TEXTURE_2D_ARRAY:
7672 UNIMPLEMENTED();
7673 break;
7674
7675 default:
7676 return gl::error(GL_INVALID_ENUM);
7677 }
7678 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007679 }
7680 catch(std::bad_alloc&)
7681 {
7682 return gl::error(GL_OUT_OF_MEMORY);
7683 }
7684}
7685
7686void __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)
7687{
7688 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7689 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7690 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7691 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7692
7693 try
7694 {
7695 gl::Context *context = gl::getNonLostContext();
7696
7697 if (context)
7698 {
7699 if (context->getClientVersion() < 3)
7700 {
7701 return gl::error(GL_INVALID_OPERATION);
7702 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007703
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007704 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, format))
7705 {
7706 return gl::error(GL_INVALID_VALUE);
7707 }
7708
7709 if (!data)
7710 {
7711 return gl::error(GL_INVALID_VALUE);
7712 }
7713
7714 // validateES3TexImageFormat sets the error code if there is an error
7715 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7716 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7717 {
7718 return;
7719 }
7720
7721 switch(target)
7722 {
7723 case GL_TEXTURE_3D:
7724 {
7725 gl::Texture3D *texture = context->getTexture3D();
7726 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7727 format, imageSize, data);
7728 }
7729 break;
7730
7731 case GL_TEXTURE_2D_ARRAY:
7732 UNIMPLEMENTED();
7733 break;
7734
7735 default:
7736 return gl::error(GL_INVALID_ENUM);
7737 }
7738 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007739 }
7740 catch(std::bad_alloc&)
7741 {
7742 return gl::error(GL_OUT_OF_MEMORY);
7743 }
7744}
7745
7746void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7747{
7748 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7749
7750 try
7751 {
7752 gl::Context *context = gl::getNonLostContext();
7753
7754 if (context)
7755 {
7756 if (context->getClientVersion() < 3)
7757 {
7758 return gl::error(GL_INVALID_OPERATION);
7759 }
7760 }
7761
7762 UNIMPLEMENTED();
7763 }
7764 catch(std::bad_alloc&)
7765 {
7766 return gl::error(GL_OUT_OF_MEMORY);
7767 }
7768}
7769
7770void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7771{
7772 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7773
7774 try
7775 {
7776 gl::Context *context = gl::getNonLostContext();
7777
7778 if (context)
7779 {
7780 if (context->getClientVersion() < 3)
7781 {
7782 return gl::error(GL_INVALID_OPERATION);
7783 }
7784 }
7785
7786 UNIMPLEMENTED();
7787 }
7788 catch(std::bad_alloc&)
7789 {
7790 return gl::error(GL_OUT_OF_MEMORY);
7791 }
7792}
7793
7794GLboolean __stdcall glIsQuery(GLuint id)
7795{
7796 EVENT("(GLuint id = %u)", id);
7797
7798 try
7799 {
7800 gl::Context *context = gl::getNonLostContext();
7801
7802 if (context)
7803 {
7804 if (context->getClientVersion() < 3)
7805 {
7806 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7807 }
7808 }
7809
7810 UNIMPLEMENTED();
7811 }
7812 catch(std::bad_alloc&)
7813 {
7814 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7815 }
7816
7817 return GL_FALSE;
7818}
7819
7820void __stdcall glBeginQuery(GLenum target, GLuint id)
7821{
7822 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7823
7824 try
7825 {
7826 gl::Context *context = gl::getNonLostContext();
7827
7828 if (context)
7829 {
7830 if (context->getClientVersion() < 3)
7831 {
7832 return gl::error(GL_INVALID_OPERATION);
7833 }
7834 }
7835
7836 UNIMPLEMENTED();
7837 }
7838 catch(std::bad_alloc&)
7839 {
7840 return gl::error(GL_OUT_OF_MEMORY);
7841 }
7842}
7843
7844void __stdcall glEndQuery(GLenum target)
7845{
7846 EVENT("(GLenum target = 0x%X)", target);
7847
7848 try
7849 {
7850 gl::Context *context = gl::getNonLostContext();
7851
7852 if (context)
7853 {
7854 if (context->getClientVersion() < 3)
7855 {
7856 return gl::error(GL_INVALID_OPERATION);
7857 }
7858 }
7859
7860 UNIMPLEMENTED();
7861 }
7862 catch(std::bad_alloc&)
7863 {
7864 return gl::error(GL_OUT_OF_MEMORY);
7865 }
7866}
7867
7868void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7869{
7870 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7871
7872 try
7873 {
7874 gl::Context *context = gl::getNonLostContext();
7875
7876 if (context)
7877 {
7878 if (context->getClientVersion() < 3)
7879 {
7880 return gl::error(GL_INVALID_OPERATION);
7881 }
7882 }
7883
7884 UNIMPLEMENTED();
7885 }
7886 catch(std::bad_alloc&)
7887 {
7888 return gl::error(GL_OUT_OF_MEMORY);
7889 }
7890}
7891
7892void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7893{
7894 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7895
7896 try
7897 {
7898 gl::Context *context = gl::getNonLostContext();
7899
7900 if (context)
7901 {
7902 if (context->getClientVersion() < 3)
7903 {
7904 return gl::error(GL_INVALID_OPERATION);
7905 }
7906 }
7907
7908 UNIMPLEMENTED();
7909 }
7910 catch(std::bad_alloc&)
7911 {
7912 return gl::error(GL_OUT_OF_MEMORY);
7913 }
7914}
7915
7916GLboolean __stdcall glUnmapBuffer(GLenum target)
7917{
7918 EVENT("(GLenum target = 0x%X)", target);
7919
7920 try
7921 {
7922 gl::Context *context = gl::getNonLostContext();
7923
7924 if (context)
7925 {
7926 if (context->getClientVersion() < 3)
7927 {
7928 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7929 }
7930 }
7931
7932 UNIMPLEMENTED();
7933 }
7934 catch(std::bad_alloc&)
7935 {
7936 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7937 }
7938
7939 return GL_FALSE;
7940}
7941
7942void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
7943{
7944 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
7945
7946 try
7947 {
7948 gl::Context *context = gl::getNonLostContext();
7949
7950 if (context)
7951 {
7952 if (context->getClientVersion() < 3)
7953 {
7954 return gl::error(GL_INVALID_OPERATION);
7955 }
7956 }
7957
7958 UNIMPLEMENTED();
7959 }
7960 catch(std::bad_alloc&)
7961 {
7962 return gl::error(GL_OUT_OF_MEMORY);
7963 }
7964}
7965
7966void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
7967{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007968 try
7969 {
7970 gl::Context *context = gl::getNonLostContext();
7971
7972 if (context)
7973 {
7974 if (context->getClientVersion() < 3)
7975 {
7976 return gl::error(GL_INVALID_OPERATION);
7977 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007978
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00007979 glDrawBuffersEXT(n, bufs);
7980 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007981 }
7982 catch(std::bad_alloc&)
7983 {
7984 return gl::error(GL_OUT_OF_MEMORY);
7985 }
7986}
7987
7988void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7989{
7990 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
7991 location, count, transpose, value);
7992
7993 try
7994 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00007995 if (count < 0)
7996 {
7997 return gl::error(GL_INVALID_VALUE);
7998 }
7999
8000 if (location == -1)
8001 {
8002 return;
8003 }
8004
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008005 gl::Context *context = gl::getNonLostContext();
8006
8007 if (context)
8008 {
8009 if (context->getClientVersion() < 3)
8010 {
8011 return gl::error(GL_INVALID_OPERATION);
8012 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008013
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008014 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8015 if (!programBinary)
8016 {
8017 return gl::error(GL_INVALID_OPERATION);
8018 }
8019
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008020 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008021 {
8022 return gl::error(GL_INVALID_OPERATION);
8023 }
8024 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008025 }
8026 catch(std::bad_alloc&)
8027 {
8028 return gl::error(GL_OUT_OF_MEMORY);
8029 }
8030}
8031
8032void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8033{
8034 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8035 location, count, transpose, value);
8036
8037 try
8038 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008039 if (count < 0)
8040 {
8041 return gl::error(GL_INVALID_VALUE);
8042 }
8043
8044 if (location == -1)
8045 {
8046 return;
8047 }
8048
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008049 gl::Context *context = gl::getNonLostContext();
8050
8051 if (context)
8052 {
8053 if (context->getClientVersion() < 3)
8054 {
8055 return gl::error(GL_INVALID_OPERATION);
8056 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008057
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008058 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8059 if (!programBinary)
8060 {
8061 return gl::error(GL_INVALID_OPERATION);
8062 }
8063
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008064 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008065 {
8066 return gl::error(GL_INVALID_OPERATION);
8067 }
8068 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008069 }
8070 catch(std::bad_alloc&)
8071 {
8072 return gl::error(GL_OUT_OF_MEMORY);
8073 }
8074}
8075
8076void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8077{
8078 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8079 location, count, transpose, value);
8080
8081 try
8082 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008083 if (count < 0)
8084 {
8085 return gl::error(GL_INVALID_VALUE);
8086 }
8087
8088 if (location == -1)
8089 {
8090 return;
8091 }
8092
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008093 gl::Context *context = gl::getNonLostContext();
8094
8095 if (context)
8096 {
8097 if (context->getClientVersion() < 3)
8098 {
8099 return gl::error(GL_INVALID_OPERATION);
8100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008101
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008102 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8103 if (!programBinary)
8104 {
8105 return gl::error(GL_INVALID_OPERATION);
8106 }
8107
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008108 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008109 {
8110 return gl::error(GL_INVALID_OPERATION);
8111 }
8112 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008113 }
8114 catch(std::bad_alloc&)
8115 {
8116 return gl::error(GL_OUT_OF_MEMORY);
8117 }
8118}
8119
8120void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8121{
8122 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8123 location, count, transpose, value);
8124
8125 try
8126 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008127 if (count < 0)
8128 {
8129 return gl::error(GL_INVALID_VALUE);
8130 }
8131
8132 if (location == -1)
8133 {
8134 return;
8135 }
8136
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008137 gl::Context *context = gl::getNonLostContext();
8138
8139 if (context)
8140 {
8141 if (context->getClientVersion() < 3)
8142 {
8143 return gl::error(GL_INVALID_OPERATION);
8144 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008145
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008146 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8147 if (!programBinary)
8148 {
8149 return gl::error(GL_INVALID_OPERATION);
8150 }
8151
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008152 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008153 {
8154 return gl::error(GL_INVALID_OPERATION);
8155 }
8156 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008157 }
8158 catch(std::bad_alloc&)
8159 {
8160 return gl::error(GL_OUT_OF_MEMORY);
8161 }
8162}
8163
8164void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8165{
8166 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8167 location, count, transpose, value);
8168
8169 try
8170 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008171 if (count < 0)
8172 {
8173 return gl::error(GL_INVALID_VALUE);
8174 }
8175
8176 if (location == -1)
8177 {
8178 return;
8179 }
8180
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008181 gl::Context *context = gl::getNonLostContext();
8182
8183 if (context)
8184 {
8185 if (context->getClientVersion() < 3)
8186 {
8187 return gl::error(GL_INVALID_OPERATION);
8188 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008189
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008190 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8191 if (!programBinary)
8192 {
8193 return gl::error(GL_INVALID_OPERATION);
8194 }
8195
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008196 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008197 {
8198 return gl::error(GL_INVALID_OPERATION);
8199 }
8200 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008201 }
8202 catch(std::bad_alloc&)
8203 {
8204 return gl::error(GL_OUT_OF_MEMORY);
8205 }
8206}
8207
8208void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8209{
8210 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8211 location, count, transpose, value);
8212
8213 try
8214 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008215 if (count < 0)
8216 {
8217 return gl::error(GL_INVALID_VALUE);
8218 }
8219
8220 if (location == -1)
8221 {
8222 return;
8223 }
8224
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008225 gl::Context *context = gl::getNonLostContext();
8226
8227 if (context)
8228 {
8229 if (context->getClientVersion() < 3)
8230 {
8231 return gl::error(GL_INVALID_OPERATION);
8232 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008233
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008234 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8235 if (!programBinary)
8236 {
8237 return gl::error(GL_INVALID_OPERATION);
8238 }
8239
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008240 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008241 {
8242 return gl::error(GL_INVALID_OPERATION);
8243 }
8244 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008245 }
8246 catch(std::bad_alloc&)
8247 {
8248 return gl::error(GL_OUT_OF_MEMORY);
8249 }
8250}
8251
8252void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8253{
8254 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8255 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8256 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8257
8258 try
8259 {
8260 gl::Context *context = gl::getNonLostContext();
8261
8262 if (context)
8263 {
8264 if (context->getClientVersion() < 3)
8265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
8268 }
8269
8270 UNIMPLEMENTED();
8271 }
8272 catch(std::bad_alloc&)
8273 {
8274 return gl::error(GL_OUT_OF_MEMORY);
8275 }
8276}
8277
8278void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8279{
8280 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8281 target, samples, internalformat, width, height);
8282
8283 try
8284 {
8285 gl::Context *context = gl::getNonLostContext();
8286
8287 if (context)
8288 {
8289 if (context->getClientVersion() < 3)
8290 {
8291 return gl::error(GL_INVALID_OPERATION);
8292 }
8293 }
8294
8295 UNIMPLEMENTED();
8296 }
8297 catch(std::bad_alloc&)
8298 {
8299 return gl::error(GL_OUT_OF_MEMORY);
8300 }
8301}
8302
8303void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8304{
8305 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8306 target, attachment, texture, level, layer);
8307
8308 try
8309 {
8310 gl::Context *context = gl::getNonLostContext();
8311
8312 if (context)
8313 {
8314 if (context->getClientVersion() < 3)
8315 {
8316 return gl::error(GL_INVALID_OPERATION);
8317 }
8318 }
8319
8320 UNIMPLEMENTED();
8321 }
8322 catch(std::bad_alloc&)
8323 {
8324 return gl::error(GL_OUT_OF_MEMORY);
8325 }
8326}
8327
8328GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8329{
8330 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8331 target, offset, length, access);
8332
8333 try
8334 {
8335 gl::Context *context = gl::getNonLostContext();
8336
8337 if (context)
8338 {
8339 if (context->getClientVersion() < 3)
8340 {
8341 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8342 }
8343 }
8344
8345 UNIMPLEMENTED();
8346 }
8347 catch(std::bad_alloc&)
8348 {
8349 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8350 }
8351
8352 return NULL;
8353}
8354
8355void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8356{
8357 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8358
8359 try
8360 {
8361 gl::Context *context = gl::getNonLostContext();
8362
8363 if (context)
8364 {
8365 if (context->getClientVersion() < 3)
8366 {
8367 return gl::error(GL_INVALID_OPERATION);
8368 }
8369 }
8370
8371 UNIMPLEMENTED();
8372 }
8373 catch(std::bad_alloc&)
8374 {
8375 return gl::error(GL_OUT_OF_MEMORY);
8376 }
8377}
8378
8379void __stdcall glBindVertexArray(GLuint array)
8380{
8381 EVENT("(GLuint array = %u)", array);
8382
8383 try
8384 {
8385 gl::Context *context = gl::getNonLostContext();
8386
8387 if (context)
8388 {
8389 if (context->getClientVersion() < 3)
8390 {
8391 return gl::error(GL_INVALID_OPERATION);
8392 }
8393 }
8394
8395 UNIMPLEMENTED();
8396 }
8397 catch(std::bad_alloc&)
8398 {
8399 return gl::error(GL_OUT_OF_MEMORY);
8400 }
8401}
8402
8403void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8404{
8405 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8406
8407 try
8408 {
8409 gl::Context *context = gl::getNonLostContext();
8410
8411 if (context)
8412 {
8413 if (context->getClientVersion() < 3)
8414 {
8415 return gl::error(GL_INVALID_OPERATION);
8416 }
8417 }
8418
8419 UNIMPLEMENTED();
8420 }
8421 catch(std::bad_alloc&)
8422 {
8423 return gl::error(GL_OUT_OF_MEMORY);
8424 }
8425}
8426
8427void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8428{
8429 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8430
8431 try
8432 {
8433 gl::Context *context = gl::getNonLostContext();
8434
8435 if (context)
8436 {
8437 if (context->getClientVersion() < 3)
8438 {
8439 return gl::error(GL_INVALID_OPERATION);
8440 }
8441 }
8442
8443 UNIMPLEMENTED();
8444 }
8445 catch(std::bad_alloc&)
8446 {
8447 return gl::error(GL_OUT_OF_MEMORY);
8448 }
8449}
8450
8451GLboolean __stdcall glIsVertexArray(GLuint array)
8452{
8453 EVENT("(GLuint array = %u)", array);
8454
8455 try
8456 {
8457 gl::Context *context = gl::getNonLostContext();
8458
8459 if (context)
8460 {
8461 if (context->getClientVersion() < 3)
8462 {
8463 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8464 }
8465 }
8466
8467 UNIMPLEMENTED();
8468 }
8469 catch(std::bad_alloc&)
8470 {
8471 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8472 }
8473
8474 return GL_FALSE;
8475}
8476
8477void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8478{
8479 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8480 target, index, data);
8481
8482 try
8483 {
8484 gl::Context *context = gl::getNonLostContext();
8485
8486 if (context)
8487 {
8488 if (context->getClientVersion() < 3)
8489 {
8490 return gl::error(GL_INVALID_OPERATION);
8491 }
8492 }
8493
8494 UNIMPLEMENTED();
8495 }
8496 catch(std::bad_alloc&)
8497 {
8498 return gl::error(GL_OUT_OF_MEMORY);
8499 }
8500}
8501
8502void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8503{
8504 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8505
8506 try
8507 {
8508 gl::Context *context = gl::getNonLostContext();
8509
8510 if (context)
8511 {
8512 if (context->getClientVersion() < 3)
8513 {
8514 return gl::error(GL_INVALID_OPERATION);
8515 }
8516 }
8517
8518 UNIMPLEMENTED();
8519 }
8520 catch(std::bad_alloc&)
8521 {
8522 return gl::error(GL_OUT_OF_MEMORY);
8523 }
8524}
8525
8526void __stdcall glEndTransformFeedback(void)
8527{
8528 EVENT("(void)");
8529
8530 try
8531 {
8532 gl::Context *context = gl::getNonLostContext();
8533
8534 if (context)
8535 {
8536 if (context->getClientVersion() < 3)
8537 {
8538 return gl::error(GL_INVALID_OPERATION);
8539 }
8540 }
8541
8542 UNIMPLEMENTED();
8543 }
8544 catch(std::bad_alloc&)
8545 {
8546 return gl::error(GL_OUT_OF_MEMORY);
8547 }
8548}
8549
8550void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8551{
8552 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8553 target, index, buffer, offset, size);
8554
8555 try
8556 {
8557 gl::Context *context = gl::getNonLostContext();
8558
8559 if (context)
8560 {
8561 if (context->getClientVersion() < 3)
8562 {
8563 return gl::error(GL_INVALID_OPERATION);
8564 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008565
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008566 switch (target)
8567 {
8568 case GL_TRANSFORM_FEEDBACK_BUFFER:
8569 if (index > context->getMaxTransformFeedbackBufferBindings())
8570 {
8571 return gl::error(GL_INVALID_VALUE);
8572 }
8573 break;
8574
8575 case GL_UNIFORM_BUFFER:
8576 if (index >= context->getMaximumCombinedUniformBufferBindings())
8577 {
8578 return gl::error(GL_INVALID_VALUE);
8579 }
8580 break;
8581
8582 default:
8583 return gl::error(GL_INVALID_ENUM);
8584 }
8585
8586 gl::Buffer *bufferObject = context->getBuffer(buffer);
8587 if (!bufferObject)
8588 {
8589 // Buffer index must not have been valid
8590 return gl::error(GL_INVALID_VALUE);
8591 }
8592
8593 if (size <= 0 || static_cast<unsigned int>(offset + size) > bufferObject->size())
8594 {
8595 return gl::error(GL_INVALID_VALUE);
8596 }
8597
8598 switch (target)
8599 {
8600 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008601 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8602 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008603 break;
8604
8605 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008606 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8607 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008608 break;
8609
8610 default:
8611 UNREACHABLE();
8612 }
8613 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008614 }
8615 catch(std::bad_alloc&)
8616 {
8617 return gl::error(GL_OUT_OF_MEMORY);
8618 }
8619}
8620
8621void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8622{
8623 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8624 target, index, buffer);
8625
8626 try
8627 {
8628 gl::Context *context = gl::getNonLostContext();
8629
8630 if (context)
8631 {
8632 if (context->getClientVersion() < 3)
8633 {
8634 return gl::error(GL_INVALID_OPERATION);
8635 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008636
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008637 switch (target)
8638 {
8639 case GL_TRANSFORM_FEEDBACK_BUFFER:
8640 if (index > context->getMaxTransformFeedbackBufferBindings())
8641 {
8642 return gl::error(GL_INVALID_VALUE);
8643 }
8644 break;
8645
8646 case GL_UNIFORM_BUFFER:
8647 if (index > context->getMaximumCombinedUniformBufferBindings())
8648 {
8649 return gl::error(GL_INVALID_VALUE);
8650 }
8651 break;
8652
8653 default:
8654 return gl::error(GL_INVALID_ENUM);
8655 }
8656
8657 gl::Buffer *bufferObject = context->getBuffer(buffer);
8658 if (!bufferObject)
8659 {
8660 // Buffer index must not have been valid
8661 return gl::error(GL_INVALID_VALUE);
8662 }
8663
8664 switch (target)
8665 {
8666 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008667 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, -1);
8668 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008669 break;
8670
8671 case GL_UNIFORM_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008672 context->bindIndexedUniformBuffer(buffer, index, 0, -1);
8673 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008674 break;
8675
8676 default:
8677 UNREACHABLE();
8678 }
8679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008680 }
8681 catch(std::bad_alloc&)
8682 {
8683 return gl::error(GL_OUT_OF_MEMORY);
8684 }
8685}
8686
8687void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8688{
8689 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8690 program, count, varyings, bufferMode);
8691
8692 try
8693 {
8694 gl::Context *context = gl::getNonLostContext();
8695
8696 if (context)
8697 {
8698 if (context->getClientVersion() < 3)
8699 {
8700 return gl::error(GL_INVALID_OPERATION);
8701 }
8702 }
8703
8704 UNIMPLEMENTED();
8705 }
8706 catch(std::bad_alloc&)
8707 {
8708 return gl::error(GL_OUT_OF_MEMORY);
8709 }
8710}
8711
8712void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8713{
8714 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8715 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8716 program, index, bufSize, length, size, type, name);
8717
8718 try
8719 {
8720 gl::Context *context = gl::getNonLostContext();
8721
8722 if (context)
8723 {
8724 if (context->getClientVersion() < 3)
8725 {
8726 return gl::error(GL_INVALID_OPERATION);
8727 }
8728 }
8729
8730 UNIMPLEMENTED();
8731 }
8732 catch(std::bad_alloc&)
8733 {
8734 return gl::error(GL_OUT_OF_MEMORY);
8735 }
8736}
8737
8738void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8739{
8740 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8741 index, size, type, stride, pointer);
8742
8743 try
8744 {
8745 gl::Context *context = gl::getNonLostContext();
8746
8747 if (context)
8748 {
8749 if (context->getClientVersion() < 3)
8750 {
8751 return gl::error(GL_INVALID_OPERATION);
8752 }
8753 }
8754
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008755 if (index >= gl::MAX_VERTEX_ATTRIBS)
8756 {
8757 return gl::error(GL_INVALID_VALUE);
8758 }
8759
8760 if (size < 1 || size > 4)
8761 {
8762 return gl::error(GL_INVALID_VALUE);
8763 }
8764
8765 switch (type)
8766 {
8767 case GL_BYTE:
8768 case GL_UNSIGNED_BYTE:
8769 case GL_SHORT:
8770 case GL_UNSIGNED_SHORT:
8771 case GL_INT:
8772 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008773 case GL_INT_2_10_10_10_REV:
8774 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008775 break;
8776 default:
8777 return gl::error(GL_INVALID_ENUM);
8778 }
8779
8780 if (stride < 0)
8781 {
8782 return gl::error(GL_INVALID_VALUE);
8783 }
8784
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008785 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8786 {
8787 return gl::error(GL_INVALID_OPERATION);
8788 }
8789
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008790 if (context)
8791 {
8792 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8793 stride, pointer);
8794 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008795 }
8796 catch(std::bad_alloc&)
8797 {
8798 return gl::error(GL_OUT_OF_MEMORY);
8799 }
8800}
8801
8802void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8803{
8804 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8805 index, pname, params);
8806
8807 try
8808 {
8809 gl::Context *context = gl::getNonLostContext();
8810
8811 if (context)
8812 {
8813 if (context->getClientVersion() < 3)
8814 {
8815 return gl::error(GL_INVALID_OPERATION);
8816 }
8817 }
8818
8819 UNIMPLEMENTED();
8820 }
8821 catch(std::bad_alloc&)
8822 {
8823 return gl::error(GL_OUT_OF_MEMORY);
8824 }
8825}
8826
8827void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8828{
8829 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8830 index, pname, params);
8831
8832 try
8833 {
8834 gl::Context *context = gl::getNonLostContext();
8835
8836 if (context)
8837 {
8838 if (context->getClientVersion() < 3)
8839 {
8840 return gl::error(GL_INVALID_OPERATION);
8841 }
8842 }
8843
8844 UNIMPLEMENTED();
8845 }
8846 catch(std::bad_alloc&)
8847 {
8848 return gl::error(GL_OUT_OF_MEMORY);
8849 }
8850}
8851
8852void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8853{
8854 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8855 index, x, y, z, w);
8856
8857 try
8858 {
8859 gl::Context *context = gl::getNonLostContext();
8860
8861 if (context)
8862 {
8863 if (context->getClientVersion() < 3)
8864 {
8865 return gl::error(GL_INVALID_OPERATION);
8866 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008867
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008868 if (index >= gl::MAX_VERTEX_ATTRIBS)
8869 {
8870 return gl::error(GL_INVALID_VALUE);
8871 }
8872
8873 GLint vals[4] = { x, y, z, w };
8874 context->setVertexAttribi(index, vals);
8875 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008876 }
8877 catch(std::bad_alloc&)
8878 {
8879 return gl::error(GL_OUT_OF_MEMORY);
8880 }
8881}
8882
8883void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8884{
8885 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8886 index, x, y, z, w);
8887
8888 try
8889 {
8890 gl::Context *context = gl::getNonLostContext();
8891
8892 if (context)
8893 {
8894 if (context->getClientVersion() < 3)
8895 {
8896 return gl::error(GL_INVALID_OPERATION);
8897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008898
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008899 if (index >= gl::MAX_VERTEX_ATTRIBS)
8900 {
8901 return gl::error(GL_INVALID_VALUE);
8902 }
8903
8904 GLuint vals[4] = { x, y, z, w };
8905 context->setVertexAttribu(index, vals);
8906 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008907 }
8908 catch(std::bad_alloc&)
8909 {
8910 return gl::error(GL_OUT_OF_MEMORY);
8911 }
8912}
8913
8914void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8915{
8916 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8917
8918 try
8919 {
8920 gl::Context *context = gl::getNonLostContext();
8921
8922 if (context)
8923 {
8924 if (context->getClientVersion() < 3)
8925 {
8926 return gl::error(GL_INVALID_OPERATION);
8927 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008928
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008929 if (index >= gl::MAX_VERTEX_ATTRIBS)
8930 {
8931 return gl::error(GL_INVALID_VALUE);
8932 }
8933
8934 context->setVertexAttribi(index, v);
8935 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008936 }
8937 catch(std::bad_alloc&)
8938 {
8939 return gl::error(GL_OUT_OF_MEMORY);
8940 }
8941}
8942
8943void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
8944{
8945 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
8946
8947 try
8948 {
8949 gl::Context *context = gl::getNonLostContext();
8950
8951 if (context)
8952 {
8953 if (context->getClientVersion() < 3)
8954 {
8955 return gl::error(GL_INVALID_OPERATION);
8956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008957
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008958 if (index >= gl::MAX_VERTEX_ATTRIBS)
8959 {
8960 return gl::error(GL_INVALID_VALUE);
8961 }
8962
8963 context->setVertexAttribu(index, v);
8964 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008965 }
8966 catch(std::bad_alloc&)
8967 {
8968 return gl::error(GL_OUT_OF_MEMORY);
8969 }
8970}
8971
8972void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
8973{
8974 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
8975 program, location, params);
8976
8977 try
8978 {
8979 gl::Context *context = gl::getNonLostContext();
8980
8981 if (context)
8982 {
8983 if (context->getClientVersion() < 3)
8984 {
8985 return gl::error(GL_INVALID_OPERATION);
8986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008987
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00008988 if (program == 0)
8989 {
8990 return gl::error(GL_INVALID_VALUE);
8991 }
8992
8993 gl::Program *programObject = context->getProgram(program);
8994
8995 if (!programObject || !programObject->isLinked())
8996 {
8997 return gl::error(GL_INVALID_OPERATION);
8998 }
8999
9000 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9001 if (!programBinary)
9002 {
9003 return gl::error(GL_INVALID_OPERATION);
9004 }
9005
9006 if (!programBinary->getUniformuiv(location, NULL, params))
9007 {
9008 return gl::error(GL_INVALID_OPERATION);
9009 }
9010 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009011 }
9012 catch(std::bad_alloc&)
9013 {
9014 return gl::error(GL_OUT_OF_MEMORY);
9015 }
9016}
9017
9018GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9019{
9020 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9021 program, name);
9022
9023 try
9024 {
9025 gl::Context *context = gl::getNonLostContext();
9026
9027 if (context)
9028 {
9029 if (context->getClientVersion() < 3)
9030 {
9031 return gl::error(GL_INVALID_OPERATION, 0);
9032 }
9033 }
9034
9035 UNIMPLEMENTED();
9036 }
9037 catch(std::bad_alloc&)
9038 {
9039 return gl::error(GL_OUT_OF_MEMORY, 0);
9040 }
9041
9042 return 0;
9043}
9044
9045void __stdcall glUniform1ui(GLint location, GLuint v0)
9046{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009047 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009048}
9049
9050void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9051{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009052 const GLuint xy[] = { v0, v1 };
9053 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009054}
9055
9056void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9057{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009058 const GLuint xyz[] = { v0, v1, v2 };
9059 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060}
9061
9062void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9063{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009064 const GLuint xyzw[] = { v0, v1, v2, v3 };
9065 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009066}
9067
9068void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9069{
9070 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9071 location, count, value);
9072
9073 try
9074 {
9075 gl::Context *context = gl::getNonLostContext();
9076
9077 if (context)
9078 {
9079 if (context->getClientVersion() < 3)
9080 {
9081 return gl::error(GL_INVALID_OPERATION);
9082 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009083
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009084 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9085 if (!programBinary)
9086 {
9087 return gl::error(GL_INVALID_OPERATION);
9088 }
9089
9090 if (!programBinary->setUniform1uiv(location, count, value))
9091 {
9092 return gl::error(GL_INVALID_OPERATION);
9093 }
9094 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009095 }
9096 catch(std::bad_alloc&)
9097 {
9098 return gl::error(GL_OUT_OF_MEMORY);
9099 }
9100}
9101
9102void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9103{
9104 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9105 location, count, value);
9106
9107 try
9108 {
9109 gl::Context *context = gl::getNonLostContext();
9110
9111 if (context)
9112 {
9113 if (context->getClientVersion() < 3)
9114 {
9115 return gl::error(GL_INVALID_OPERATION);
9116 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009117
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009118 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9119 if (!programBinary)
9120 {
9121 return gl::error(GL_INVALID_OPERATION);
9122 }
9123
9124 if (!programBinary->setUniform2uiv(location, count, value))
9125 {
9126 return gl::error(GL_INVALID_OPERATION);
9127 }
9128 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009129 }
9130 catch(std::bad_alloc&)
9131 {
9132 return gl::error(GL_OUT_OF_MEMORY);
9133 }
9134}
9135
9136void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9137{
9138 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9139 location, count, value);
9140
9141 try
9142 {
9143 gl::Context *context = gl::getNonLostContext();
9144
9145 if (context)
9146 {
9147 if (context->getClientVersion() < 3)
9148 {
9149 return gl::error(GL_INVALID_OPERATION);
9150 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009151
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009152 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9153 if (!programBinary)
9154 {
9155 return gl::error(GL_INVALID_OPERATION);
9156 }
9157
9158 if (!programBinary->setUniform3uiv(location, count, value))
9159 {
9160 return gl::error(GL_INVALID_OPERATION);
9161 }
9162 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009163 }
9164 catch(std::bad_alloc&)
9165 {
9166 return gl::error(GL_OUT_OF_MEMORY);
9167 }
9168}
9169
9170void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9171{
9172 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9173 location, count, value);
9174
9175 try
9176 {
9177 gl::Context *context = gl::getNonLostContext();
9178
9179 if (context)
9180 {
9181 if (context->getClientVersion() < 3)
9182 {
9183 return gl::error(GL_INVALID_OPERATION);
9184 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009185
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009186 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9187 if (!programBinary)
9188 {
9189 return gl::error(GL_INVALID_OPERATION);
9190 }
9191
9192 if (!programBinary->setUniform4uiv(location, count, value))
9193 {
9194 return gl::error(GL_INVALID_OPERATION);
9195 }
9196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009197 }
9198 catch(std::bad_alloc&)
9199 {
9200 return gl::error(GL_OUT_OF_MEMORY);
9201 }
9202}
9203
9204void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9205{
9206 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9207 buffer, drawbuffer, value);
9208
9209 try
9210 {
9211 gl::Context *context = gl::getNonLostContext();
9212
9213 if (context)
9214 {
9215 if (context->getClientVersion() < 3)
9216 {
9217 return gl::error(GL_INVALID_OPERATION);
9218 }
9219 }
9220
9221 UNIMPLEMENTED();
9222 }
9223 catch(std::bad_alloc&)
9224 {
9225 return gl::error(GL_OUT_OF_MEMORY);
9226 }
9227}
9228
9229void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9230{
9231 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9232 buffer, drawbuffer, value);
9233
9234 try
9235 {
9236 gl::Context *context = gl::getNonLostContext();
9237
9238 if (context)
9239 {
9240 if (context->getClientVersion() < 3)
9241 {
9242 return gl::error(GL_INVALID_OPERATION);
9243 }
9244 }
9245
9246 UNIMPLEMENTED();
9247 }
9248 catch(std::bad_alloc&)
9249 {
9250 return gl::error(GL_OUT_OF_MEMORY);
9251 }
9252}
9253
9254void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9255{
9256 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9257 buffer, drawbuffer, value);
9258
9259 try
9260 {
9261 gl::Context *context = gl::getNonLostContext();
9262
9263 if (context)
9264 {
9265 if (context->getClientVersion() < 3)
9266 {
9267 return gl::error(GL_INVALID_OPERATION);
9268 }
9269 }
9270
9271 UNIMPLEMENTED();
9272 }
9273 catch(std::bad_alloc&)
9274 {
9275 return gl::error(GL_OUT_OF_MEMORY);
9276 }
9277}
9278
9279void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9280{
9281 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9282 buffer, drawbuffer, depth, stencil);
9283
9284 try
9285 {
9286 gl::Context *context = gl::getNonLostContext();
9287
9288 if (context)
9289 {
9290 if (context->getClientVersion() < 3)
9291 {
9292 return gl::error(GL_INVALID_OPERATION);
9293 }
9294 }
9295
9296 UNIMPLEMENTED();
9297 }
9298 catch(std::bad_alloc&)
9299 {
9300 return gl::error(GL_OUT_OF_MEMORY);
9301 }
9302}
9303
9304const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9305{
9306 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9307
9308 try
9309 {
9310 gl::Context *context = gl::getNonLostContext();
9311
9312 if (context)
9313 {
9314 if (context->getClientVersion() < 3)
9315 {
9316 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9317 }
9318 }
9319
9320 UNIMPLEMENTED();
9321 }
9322 catch(std::bad_alloc&)
9323 {
9324 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9325 }
9326
9327 return NULL;
9328}
9329
9330void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9331{
9332 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9333 readTarget, writeTarget, readOffset, writeOffset, size);
9334
9335 try
9336 {
9337 gl::Context *context = gl::getNonLostContext();
9338
9339 if (context)
9340 {
9341 if (context->getClientVersion() < 3)
9342 {
9343 return gl::error(GL_INVALID_OPERATION);
9344 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009345
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009346 gl::Buffer *readBuffer = NULL;
9347 switch (readTarget)
9348 {
9349 case GL_ARRAY_BUFFER:
9350 readBuffer = context->getArrayBuffer();
9351 break;
9352 case GL_COPY_READ_BUFFER:
9353 readBuffer = context->getCopyReadBuffer();
9354 break;
9355 case GL_COPY_WRITE_BUFFER:
9356 readBuffer = context->getCopyWriteBuffer();
9357 break;
9358 case GL_ELEMENT_ARRAY_BUFFER:
9359 readBuffer = context->getElementArrayBuffer();
9360 break;
9361 case GL_PIXEL_PACK_BUFFER:
9362 readBuffer = context->getPixelPackBuffer();
9363 break;
9364 case GL_PIXEL_UNPACK_BUFFER:
9365 readBuffer = context->getPixelUnpackBuffer();
9366 break;
9367 case GL_TRANSFORM_FEEDBACK_BUFFER:
9368 readBuffer = context->getGenericTransformFeedbackBuffer();
9369 break;
9370 case GL_UNIFORM_BUFFER:
9371 readBuffer = context->getGenericUniformBuffer();
9372 break;
9373 default:
9374 return gl::error(GL_INVALID_ENUM);
9375 }
9376
9377 gl::Buffer *writeBuffer = NULL;
9378 switch (writeTarget)
9379 {
9380 case GL_ARRAY_BUFFER:
9381 writeBuffer = context->getArrayBuffer();
9382 break;
9383 case GL_COPY_READ_BUFFER:
9384 writeBuffer = context->getCopyReadBuffer();
9385 break;
9386 case GL_COPY_WRITE_BUFFER:
9387 writeBuffer = context->getCopyWriteBuffer();
9388 break;
9389 case GL_ELEMENT_ARRAY_BUFFER:
9390 writeBuffer = context->getElementArrayBuffer();
9391 break;
9392 case GL_PIXEL_PACK_BUFFER:
9393 writeBuffer = context->getPixelPackBuffer();
9394 break;
9395 case GL_PIXEL_UNPACK_BUFFER:
9396 writeBuffer = context->getPixelUnpackBuffer();
9397 break;
9398 case GL_TRANSFORM_FEEDBACK_BUFFER:
9399 writeBuffer = context->getGenericTransformFeedbackBuffer();
9400 break;
9401 case GL_UNIFORM_BUFFER:
9402 writeBuffer = context->getGenericUniformBuffer();
9403 break;
9404 default:
9405 return gl::error(GL_INVALID_ENUM);
9406 }
9407
9408 if (!readBuffer || !writeBuffer)
9409 {
9410 return gl::error(GL_INVALID_OPERATION);
9411 }
9412
9413 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9414 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9415 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9416 {
9417 return gl::error(GL_INVALID_VALUE);
9418 }
9419
9420 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9421 {
9422 return gl::error(GL_INVALID_VALUE);
9423 }
9424
9425 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9426
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009427 // if size is zero, the copy is a successful no-op
9428 if (size > 0)
9429 {
9430 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9431 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009433 }
9434 catch(std::bad_alloc&)
9435 {
9436 return gl::error(GL_OUT_OF_MEMORY);
9437 }
9438}
9439
9440void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9441{
9442 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9443 program, uniformCount, uniformNames, uniformIndices);
9444
9445 try
9446 {
9447 gl::Context *context = gl::getNonLostContext();
9448
9449 if (context)
9450 {
9451 if (context->getClientVersion() < 3)
9452 {
9453 return gl::error(GL_INVALID_OPERATION);
9454 }
9455 }
9456
9457 UNIMPLEMENTED();
9458 }
9459 catch(std::bad_alloc&)
9460 {
9461 return gl::error(GL_OUT_OF_MEMORY);
9462 }
9463}
9464
9465void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9466{
9467 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9468 program, uniformCount, uniformIndices, pname, params);
9469
9470 try
9471 {
9472 gl::Context *context = gl::getNonLostContext();
9473
9474 if (context)
9475 {
9476 if (context->getClientVersion() < 3)
9477 {
9478 return gl::error(GL_INVALID_OPERATION);
9479 }
9480 }
9481
9482 UNIMPLEMENTED();
9483 }
9484 catch(std::bad_alloc&)
9485 {
9486 return gl::error(GL_OUT_OF_MEMORY);
9487 }
9488}
9489
9490GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9491{
9492 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9493
9494 try
9495 {
9496 gl::Context *context = gl::getNonLostContext();
9497
9498 if (context)
9499 {
9500 if (context->getClientVersion() < 3)
9501 {
9502 return gl::error(GL_INVALID_OPERATION, 0);
9503 }
9504 }
9505
9506 UNIMPLEMENTED();
9507 }
9508 catch(std::bad_alloc&)
9509 {
9510 return gl::error(GL_OUT_OF_MEMORY, 0);
9511 }
9512
9513 return 0;
9514}
9515
9516void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9517{
9518 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9519 program, uniformBlockIndex, pname, params);
9520
9521 try
9522 {
9523 gl::Context *context = gl::getNonLostContext();
9524
9525 if (context)
9526 {
9527 if (context->getClientVersion() < 3)
9528 {
9529 return gl::error(GL_INVALID_OPERATION);
9530 }
9531 }
9532
9533 UNIMPLEMENTED();
9534 }
9535 catch(std::bad_alloc&)
9536 {
9537 return gl::error(GL_OUT_OF_MEMORY);
9538 }
9539}
9540
9541void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9542{
9543 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9544 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9545
9546 try
9547 {
9548 gl::Context *context = gl::getNonLostContext();
9549
9550 if (context)
9551 {
9552 if (context->getClientVersion() < 3)
9553 {
9554 return gl::error(GL_INVALID_OPERATION);
9555 }
9556 }
9557
9558 UNIMPLEMENTED();
9559 }
9560 catch(std::bad_alloc&)
9561 {
9562 return gl::error(GL_OUT_OF_MEMORY);
9563 }
9564}
9565
9566void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9567{
9568 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9569 program, uniformBlockIndex, uniformBlockBinding);
9570
9571 try
9572 {
9573 gl::Context *context = gl::getNonLostContext();
9574
9575 if (context)
9576 {
9577 if (context->getClientVersion() < 3)
9578 {
9579 return gl::error(GL_INVALID_OPERATION);
9580 }
9581 }
9582
9583 UNIMPLEMENTED();
9584 }
9585 catch(std::bad_alloc&)
9586 {
9587 return gl::error(GL_OUT_OF_MEMORY);
9588 }
9589}
9590
9591void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9592{
9593 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9594 mode, first, count, instanceCount);
9595
9596 try
9597 {
9598 gl::Context *context = gl::getNonLostContext();
9599
9600 if (context)
9601 {
9602 if (context->getClientVersion() < 3)
9603 {
9604 return gl::error(GL_INVALID_OPERATION);
9605 }
9606 }
9607
9608 UNIMPLEMENTED();
9609 }
9610 catch(std::bad_alloc&)
9611 {
9612 return gl::error(GL_OUT_OF_MEMORY);
9613 }
9614}
9615
9616void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9617{
9618 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9619 mode, count, type, indices, instanceCount);
9620
9621 try
9622 {
9623 gl::Context *context = gl::getNonLostContext();
9624
9625 if (context)
9626 {
9627 if (context->getClientVersion() < 3)
9628 {
9629 return gl::error(GL_INVALID_OPERATION);
9630 }
9631 }
9632
9633 UNIMPLEMENTED();
9634 }
9635 catch(std::bad_alloc&)
9636 {
9637 return gl::error(GL_OUT_OF_MEMORY);
9638 }
9639}
9640
9641GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9642{
9643 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9644
9645 try
9646 {
9647 gl::Context *context = gl::getNonLostContext();
9648
9649 if (context)
9650 {
9651 if (context->getClientVersion() < 3)
9652 {
9653 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9654 }
9655 }
9656
9657 UNIMPLEMENTED();
9658 }
9659 catch(std::bad_alloc&)
9660 {
9661 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9662 }
9663
9664 return NULL;
9665}
9666
9667GLboolean __stdcall glIsSync(GLsync sync)
9668{
9669 EVENT("(GLsync sync = 0x%0.8p)", sync);
9670
9671 try
9672 {
9673 gl::Context *context = gl::getNonLostContext();
9674
9675 if (context)
9676 {
9677 if (context->getClientVersion() < 3)
9678 {
9679 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9680 }
9681 }
9682
9683 UNIMPLEMENTED();
9684 }
9685 catch(std::bad_alloc&)
9686 {
9687 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9688 }
9689
9690 return GL_FALSE;
9691}
9692
9693void __stdcall glDeleteSync(GLsync sync)
9694{
9695 EVENT("(GLsync sync = 0x%0.8p)", sync);
9696
9697 try
9698 {
9699 gl::Context *context = gl::getNonLostContext();
9700
9701 if (context)
9702 {
9703 if (context->getClientVersion() < 3)
9704 {
9705 return gl::error(GL_INVALID_OPERATION);
9706 }
9707 }
9708
9709 UNIMPLEMENTED();
9710 }
9711 catch(std::bad_alloc&)
9712 {
9713 return gl::error(GL_OUT_OF_MEMORY);
9714 }
9715}
9716
9717GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9718{
9719 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9720 sync, flags, timeout);
9721
9722 try
9723 {
9724 gl::Context *context = gl::getNonLostContext();
9725
9726 if (context)
9727 {
9728 if (context->getClientVersion() < 3)
9729 {
9730 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9731 }
9732 }
9733
9734 UNIMPLEMENTED();
9735 }
9736 catch(std::bad_alloc&)
9737 {
9738 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9739 }
9740
9741 return GL_FALSE;
9742}
9743
9744void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9745{
9746 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9747 sync, flags, timeout);
9748
9749 try
9750 {
9751 gl::Context *context = gl::getNonLostContext();
9752
9753 if (context)
9754 {
9755 if (context->getClientVersion() < 3)
9756 {
9757 return gl::error(GL_INVALID_OPERATION);
9758 }
9759 }
9760
9761 UNIMPLEMENTED();
9762 }
9763 catch(std::bad_alloc&)
9764 {
9765 return gl::error(GL_OUT_OF_MEMORY);
9766 }
9767}
9768
9769void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9770{
9771 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9772 pname, params);
9773
9774 try
9775 {
9776 gl::Context *context = gl::getNonLostContext();
9777
9778 if (context)
9779 {
9780 if (context->getClientVersion() < 3)
9781 {
9782 return gl::error(GL_INVALID_OPERATION);
9783 }
9784 }
9785
9786 UNIMPLEMENTED();
9787 }
9788 catch(std::bad_alloc&)
9789 {
9790 return gl::error(GL_OUT_OF_MEMORY);
9791 }
9792}
9793
9794void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9795{
9796 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9797 sync, pname, bufSize, length, values);
9798
9799 try
9800 {
9801 gl::Context *context = gl::getNonLostContext();
9802
9803 if (context)
9804 {
9805 if (context->getClientVersion() < 3)
9806 {
9807 return gl::error(GL_INVALID_OPERATION);
9808 }
9809 }
9810
9811 UNIMPLEMENTED();
9812 }
9813 catch(std::bad_alloc&)
9814 {
9815 return gl::error(GL_OUT_OF_MEMORY);
9816 }
9817}
9818
9819void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9820{
9821 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
9822 target, index, data);
9823
9824 try
9825 {
9826 gl::Context *context = gl::getNonLostContext();
9827
9828 if (context)
9829 {
9830 if (context->getClientVersion() < 3)
9831 {
9832 return gl::error(GL_INVALID_OPERATION);
9833 }
9834 }
9835
9836 UNIMPLEMENTED();
9837 }
9838 catch(std::bad_alloc&)
9839 {
9840 return gl::error(GL_OUT_OF_MEMORY);
9841 }
9842}
9843
9844void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
9845{
9846 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9847 target, pname, params);
9848
9849 try
9850 {
9851 gl::Context *context = gl::getNonLostContext();
9852
9853 if (context)
9854 {
9855 if (context->getClientVersion() < 3)
9856 {
9857 return gl::error(GL_INVALID_OPERATION);
9858 }
9859 }
9860
9861 UNIMPLEMENTED();
9862 }
9863 catch(std::bad_alloc&)
9864 {
9865 return gl::error(GL_OUT_OF_MEMORY);
9866 }
9867}
9868
9869void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
9870{
9871 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
9872
9873 try
9874 {
9875 gl::Context *context = gl::getNonLostContext();
9876
9877 if (context)
9878 {
9879 if (context->getClientVersion() < 3)
9880 {
9881 return gl::error(GL_INVALID_OPERATION);
9882 }
9883 }
9884
9885 UNIMPLEMENTED();
9886 }
9887 catch(std::bad_alloc&)
9888 {
9889 return gl::error(GL_OUT_OF_MEMORY);
9890 }
9891}
9892
9893void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9894{
9895 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9896
9897 try
9898 {
9899 gl::Context *context = gl::getNonLostContext();
9900
9901 if (context)
9902 {
9903 if (context->getClientVersion() < 3)
9904 {
9905 return gl::error(GL_INVALID_OPERATION);
9906 }
9907 }
9908
9909 UNIMPLEMENTED();
9910 }
9911 catch(std::bad_alloc&)
9912 {
9913 return gl::error(GL_OUT_OF_MEMORY);
9914 }
9915}
9916
9917GLboolean __stdcall glIsSampler(GLuint sampler)
9918{
9919 EVENT("(GLuint sampler = %u)", sampler);
9920
9921 try
9922 {
9923 gl::Context *context = gl::getNonLostContext();
9924
9925 if (context)
9926 {
9927 if (context->getClientVersion() < 3)
9928 {
9929 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9930 }
9931 }
9932
9933 UNIMPLEMENTED();
9934 }
9935 catch(std::bad_alloc&)
9936 {
9937 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9938 }
9939
9940 return GL_FALSE;
9941}
9942
9943void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9944{
9945 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9946
9947 try
9948 {
9949 gl::Context *context = gl::getNonLostContext();
9950
9951 if (context)
9952 {
9953 if (context->getClientVersion() < 3)
9954 {
9955 return gl::error(GL_INVALID_OPERATION);
9956 }
9957 }
9958
9959 UNIMPLEMENTED();
9960 }
9961 catch(std::bad_alloc&)
9962 {
9963 return gl::error(GL_OUT_OF_MEMORY);
9964 }
9965}
9966
9967void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9968{
9969 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9970
9971 try
9972 {
9973 gl::Context *context = gl::getNonLostContext();
9974
9975 if (context)
9976 {
9977 if (context->getClientVersion() < 3)
9978 {
9979 return gl::error(GL_INVALID_OPERATION);
9980 }
9981 }
9982
9983 UNIMPLEMENTED();
9984 }
9985 catch(std::bad_alloc&)
9986 {
9987 return gl::error(GL_OUT_OF_MEMORY);
9988 }
9989}
9990
9991void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9992{
9993 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
9994 sampler, pname, param);
9995
9996 try
9997 {
9998 gl::Context *context = gl::getNonLostContext();
9999
10000 if (context)
10001 {
10002 if (context->getClientVersion() < 3)
10003 {
10004 return gl::error(GL_INVALID_OPERATION);
10005 }
10006 }
10007
10008 UNIMPLEMENTED();
10009 }
10010 catch(std::bad_alloc&)
10011 {
10012 return gl::error(GL_OUT_OF_MEMORY);
10013 }
10014}
10015
10016void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10017{
10018 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10019
10020 try
10021 {
10022 gl::Context *context = gl::getNonLostContext();
10023
10024 if (context)
10025 {
10026 if (context->getClientVersion() < 3)
10027 {
10028 return gl::error(GL_INVALID_OPERATION);
10029 }
10030 }
10031
10032 UNIMPLEMENTED();
10033 }
10034 catch(std::bad_alloc&)
10035 {
10036 return gl::error(GL_OUT_OF_MEMORY);
10037 }
10038}
10039
10040void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10041{
10042 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10043
10044 try
10045 {
10046 gl::Context *context = gl::getNonLostContext();
10047
10048 if (context)
10049 {
10050 if (context->getClientVersion() < 3)
10051 {
10052 return gl::error(GL_INVALID_OPERATION);
10053 }
10054 }
10055
10056 UNIMPLEMENTED();
10057 }
10058 catch(std::bad_alloc&)
10059 {
10060 return gl::error(GL_OUT_OF_MEMORY);
10061 }
10062}
10063
10064void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10065{
10066 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10067
10068 try
10069 {
10070 gl::Context *context = gl::getNonLostContext();
10071
10072 if (context)
10073 {
10074 if (context->getClientVersion() < 3)
10075 {
10076 return gl::error(GL_INVALID_OPERATION);
10077 }
10078 }
10079
10080 UNIMPLEMENTED();
10081 }
10082 catch(std::bad_alloc&)
10083 {
10084 return gl::error(GL_OUT_OF_MEMORY);
10085 }
10086}
10087
10088void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10089{
10090 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10091
10092 try
10093 {
10094 gl::Context *context = gl::getNonLostContext();
10095
10096 if (context)
10097 {
10098 if (context->getClientVersion() < 3)
10099 {
10100 return gl::error(GL_INVALID_OPERATION);
10101 }
10102 }
10103
10104 UNIMPLEMENTED();
10105 }
10106 catch(std::bad_alloc&)
10107 {
10108 return gl::error(GL_OUT_OF_MEMORY);
10109 }
10110}
10111
10112void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10113{
10114 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10115
10116 try
10117 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010118 if (index >= gl::MAX_VERTEX_ATTRIBS)
10119 {
10120 return gl::error(GL_INVALID_VALUE);
10121 }
10122
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010123 gl::Context *context = gl::getNonLostContext();
10124
10125 if (context)
10126 {
10127 if (context->getClientVersion() < 3)
10128 {
10129 return gl::error(GL_INVALID_OPERATION);
10130 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010131
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010132 context->setVertexAttribDivisor(index, divisor);
10133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010134 }
10135 catch(std::bad_alloc&)
10136 {
10137 return gl::error(GL_OUT_OF_MEMORY);
10138 }
10139}
10140
10141void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10142{
10143 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10144
10145 try
10146 {
10147 gl::Context *context = gl::getNonLostContext();
10148
10149 if (context)
10150 {
10151 if (context->getClientVersion() < 3)
10152 {
10153 return gl::error(GL_INVALID_OPERATION);
10154 }
10155 }
10156
10157 UNIMPLEMENTED();
10158 }
10159 catch(std::bad_alloc&)
10160 {
10161 return gl::error(GL_OUT_OF_MEMORY);
10162 }
10163}
10164
10165void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10166{
10167 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10168
10169 try
10170 {
10171 gl::Context *context = gl::getNonLostContext();
10172
10173 if (context)
10174 {
10175 if (context->getClientVersion() < 3)
10176 {
10177 return gl::error(GL_INVALID_OPERATION);
10178 }
10179 }
10180
10181 UNIMPLEMENTED();
10182 }
10183 catch(std::bad_alloc&)
10184 {
10185 return gl::error(GL_OUT_OF_MEMORY);
10186 }
10187}
10188
10189void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10190{
10191 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10192
10193 try
10194 {
10195 gl::Context *context = gl::getNonLostContext();
10196
10197 if (context)
10198 {
10199 if (context->getClientVersion() < 3)
10200 {
10201 return gl::error(GL_INVALID_OPERATION);
10202 }
10203 }
10204
10205 UNIMPLEMENTED();
10206 }
10207 catch(std::bad_alloc&)
10208 {
10209 return gl::error(GL_OUT_OF_MEMORY);
10210 }
10211}
10212
10213GLboolean __stdcall glIsTransformFeedback(GLuint id)
10214{
10215 EVENT("(GLuint id = %u)", id);
10216
10217 try
10218 {
10219 gl::Context *context = gl::getNonLostContext();
10220
10221 if (context)
10222 {
10223 if (context->getClientVersion() < 3)
10224 {
10225 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10226 }
10227 }
10228
10229 UNIMPLEMENTED();
10230 }
10231 catch(std::bad_alloc&)
10232 {
10233 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10234 }
10235
10236 return GL_FALSE;
10237}
10238
10239void __stdcall glPauseTransformFeedback(void)
10240{
10241 EVENT("(void)");
10242
10243 try
10244 {
10245 gl::Context *context = gl::getNonLostContext();
10246
10247 if (context)
10248 {
10249 if (context->getClientVersion() < 3)
10250 {
10251 return gl::error(GL_INVALID_OPERATION);
10252 }
10253 }
10254
10255 UNIMPLEMENTED();
10256 }
10257 catch(std::bad_alloc&)
10258 {
10259 return gl::error(GL_OUT_OF_MEMORY);
10260 }
10261}
10262
10263void __stdcall glResumeTransformFeedback(void)
10264{
10265 EVENT("(void)");
10266
10267 try
10268 {
10269 gl::Context *context = gl::getNonLostContext();
10270
10271 if (context)
10272 {
10273 if (context->getClientVersion() < 3)
10274 {
10275 return gl::error(GL_INVALID_OPERATION);
10276 }
10277 }
10278
10279 UNIMPLEMENTED();
10280 }
10281 catch(std::bad_alloc&)
10282 {
10283 return gl::error(GL_OUT_OF_MEMORY);
10284 }
10285}
10286
10287void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10288{
10289 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10290 program, bufSize, length, binaryFormat, binary);
10291
10292 try
10293 {
10294 gl::Context *context = gl::getNonLostContext();
10295
10296 if (context)
10297 {
10298 if (context->getClientVersion() < 3)
10299 {
10300 return gl::error(GL_INVALID_OPERATION);
10301 }
10302 }
10303
10304 UNIMPLEMENTED();
10305 }
10306 catch(std::bad_alloc&)
10307 {
10308 return gl::error(GL_OUT_OF_MEMORY);
10309 }
10310}
10311
10312void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10313{
10314 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10315 program, binaryFormat, binary, length);
10316
10317 try
10318 {
10319 gl::Context *context = gl::getNonLostContext();
10320
10321 if (context)
10322 {
10323 if (context->getClientVersion() < 3)
10324 {
10325 return gl::error(GL_INVALID_OPERATION);
10326 }
10327 }
10328
10329 UNIMPLEMENTED();
10330 }
10331 catch(std::bad_alloc&)
10332 {
10333 return gl::error(GL_OUT_OF_MEMORY);
10334 }
10335}
10336
10337void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10338{
10339 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10340 program, pname, value);
10341
10342 try
10343 {
10344 gl::Context *context = gl::getNonLostContext();
10345
10346 if (context)
10347 {
10348 if (context->getClientVersion() < 3)
10349 {
10350 return gl::error(GL_INVALID_OPERATION);
10351 }
10352 }
10353
10354 UNIMPLEMENTED();
10355 }
10356 catch(std::bad_alloc&)
10357 {
10358 return gl::error(GL_OUT_OF_MEMORY);
10359 }
10360}
10361
10362void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10363{
10364 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10365 target, numAttachments, attachments);
10366
10367 try
10368 {
10369 gl::Context *context = gl::getNonLostContext();
10370
10371 if (context)
10372 {
10373 if (context->getClientVersion() < 3)
10374 {
10375 return gl::error(GL_INVALID_OPERATION);
10376 }
10377 }
10378
10379 UNIMPLEMENTED();
10380 }
10381 catch(std::bad_alloc&)
10382 {
10383 return gl::error(GL_OUT_OF_MEMORY);
10384 }
10385}
10386
10387void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10388{
10389 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10390 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10391 target, numAttachments, attachments, x, y, width, height);
10392
10393 try
10394 {
10395 gl::Context *context = gl::getNonLostContext();
10396
10397 if (context)
10398 {
10399 if (context->getClientVersion() < 3)
10400 {
10401 return gl::error(GL_INVALID_OPERATION);
10402 }
10403 }
10404
10405 UNIMPLEMENTED();
10406 }
10407 catch(std::bad_alloc&)
10408 {
10409 return gl::error(GL_OUT_OF_MEMORY);
10410 }
10411}
10412
10413void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10414{
10415 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10416 target, levels, internalformat, width, height);
10417
10418 try
10419 {
10420 gl::Context *context = gl::getNonLostContext();
10421
10422 if (context)
10423 {
10424 if (context->getClientVersion() < 3)
10425 {
10426 return gl::error(GL_INVALID_OPERATION);
10427 }
10428 }
10429
10430 UNIMPLEMENTED();
10431 }
10432 catch(std::bad_alloc&)
10433 {
10434 return gl::error(GL_OUT_OF_MEMORY);
10435 }
10436}
10437
10438void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10439{
10440 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10441 "GLsizei height = %d, GLsizei depth = %d)",
10442 target, levels, internalformat, width, height, depth);
10443
10444 try
10445 {
10446 gl::Context *context = gl::getNonLostContext();
10447
10448 if (context)
10449 {
10450 if (context->getClientVersion() < 3)
10451 {
10452 return gl::error(GL_INVALID_OPERATION);
10453 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010454 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010455 }
10456 catch(std::bad_alloc&)
10457 {
10458 return gl::error(GL_OUT_OF_MEMORY);
10459 }
10460}
10461
10462void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10463{
10464 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10465 "GLint* params = 0x%0.8p)",
10466 target, internalformat, pname, bufSize, params);
10467
10468 try
10469 {
10470 gl::Context *context = gl::getNonLostContext();
10471
10472 if (context)
10473 {
10474 if (context->getClientVersion() < 3)
10475 {
10476 return gl::error(GL_INVALID_OPERATION);
10477 }
10478 }
10479
10480 UNIMPLEMENTED();
10481 }
10482 catch(std::bad_alloc&)
10483 {
10484 return gl::error(GL_OUT_OF_MEMORY);
10485 }
10486}
10487
10488// Extension functions
10489
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010490void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10491 GLbitfield mask, GLenum filter)
10492{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010493 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010494 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10495 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10496 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10497
10498 try
10499 {
10500 switch (filter)
10501 {
10502 case GL_NEAREST:
10503 break;
10504 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010506 }
10507
10508 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010510 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010511 }
10512
10513 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10514 {
10515 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010517 }
10518
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010519 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010520
10521 if (context)
10522 {
10523 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10524 {
10525 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010527 }
10528
10529 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10530 }
10531 }
10532 catch(std::bad_alloc&)
10533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010535 }
10536}
10537
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010538void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10539 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010540{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010541 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010542 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010543 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010544 target, level, internalformat, width, height, depth, border, format, type, pixels);
10545
10546 try
10547 {
10548 UNIMPLEMENTED(); // FIXME
10549 }
10550 catch(std::bad_alloc&)
10551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010552 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010553 }
10554}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010555
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010556void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10557 GLenum *binaryFormat, void *binary)
10558{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010559 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 +000010560 program, bufSize, length, binaryFormat, binary);
10561
10562 try
10563 {
10564 gl::Context *context = gl::getNonLostContext();
10565
10566 if (context)
10567 {
10568 gl::Program *programObject = context->getProgram(program);
10569
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010570 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010572 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010573 }
10574
10575 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10576
10577 if (!programBinary)
10578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010579 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010580 }
10581
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010582 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010584 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010585 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010586
10587 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010588 }
10589 }
10590 catch(std::bad_alloc&)
10591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010592 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010593 }
10594}
10595
10596void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10597 const void *binary, GLint length)
10598{
10599 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10600 program, binaryFormat, binary, length);
10601
10602 try
10603 {
10604 gl::Context *context = gl::getNonLostContext();
10605
10606 if (context)
10607 {
10608 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010610 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010611 }
10612
10613 gl::Program *programObject = context->getProgram(program);
10614
10615 if (!programObject)
10616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010617 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010618 }
10619
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010620 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010621 }
10622 }
10623 catch(std::bad_alloc&)
10624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010625 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010626 }
10627}
10628
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010629void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10630{
10631 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10632
10633 try
10634 {
10635 gl::Context *context = gl::getNonLostContext();
10636
10637 if (context)
10638 {
10639 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10640 {
10641 return gl::error(GL_INVALID_VALUE);
10642 }
10643
10644 if (context->getDrawFramebufferHandle() == 0)
10645 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010646 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010647 {
10648 return gl::error(GL_INVALID_OPERATION);
10649 }
10650
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010651 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010652 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010653 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010654 }
10655 }
10656 else
10657 {
10658 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10659 {
10660 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10661 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10662 {
10663 return gl::error(GL_INVALID_OPERATION);
10664 }
10665 }
10666 }
10667
10668 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10669
10670 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10671 {
10672 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10673 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010674
10675 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10676 {
10677 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10678 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010679 }
10680 }
10681 catch (std::bad_alloc&)
10682 {
10683 return gl::error(GL_OUT_OF_MEMORY);
10684 }
10685}
10686
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010687__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10688{
10689 struct Extension
10690 {
10691 const char *name;
10692 __eglMustCastToProperFunctionPointerType address;
10693 };
10694
10695 static const Extension glExtensions[] =
10696 {
10697 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010698 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010699 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010700 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10701 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10702 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10703 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10704 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10705 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10706 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010707 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010708 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010709 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10710 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10711 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10712 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010713 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10714 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10715 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10716 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10717 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10718 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10719 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010720 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010721 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10722 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10723 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010724 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10725 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010726
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010727 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010728 {
10729 if (strcmp(procname, glExtensions[ext].name) == 0)
10730 {
10731 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10732 }
10733 }
10734
10735 return NULL;
10736}
10737
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010738// Non-public functions used by EGL
10739
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010740bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010741{
10742 EVENT("(egl::Surface* surface = 0x%0.8p)",
10743 surface);
10744
10745 try
10746 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010747 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010748
10749 if (context)
10750 {
10751 gl::Texture2D *textureObject = context->getTexture2D();
10752
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010753 if (textureObject->isImmutable())
10754 {
10755 return false;
10756 }
10757
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010758 if (textureObject)
10759 {
10760 textureObject->bindTexImage(surface);
10761 }
10762 }
10763 }
10764 catch(std::bad_alloc&)
10765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010766 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010767 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010768
10769 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010770}
10771
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010772}