blob: 451b73bbb3339e776110e19ad4cdabe939309c08 [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
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +0000341 case GL_TEXTURE_2D_ARRAY:
342 {
343 if (width > (context->getMaximum2DTextureDimension() >> level) ||
344 height > (context->getMaximum2DTextureDimension() >> level) ||
345 depth > (context->getMaximum2DArrayTextureLayers() >> level))
346 {
347 return gl::error(GL_INVALID_VALUE, false);
348 }
349
350 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
351 if (texture2darray)
352 {
353 textureCompressed = texture2darray->isCompressed(level);
354 textureInternalFormat = texture2darray->getInternalFormat(level);
355 textureLevelWidth = texture2darray->getWidth(level);
356 textureLevelHeight = texture2darray->getHeight(level);
357 textureLevelDepth = texture2darray->getDepth(level);
358 texture = texture2darray;
359 }
360 }
361 break;
362
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000363 default:
364 return gl::error(GL_INVALID_ENUM, false);
365 }
366
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000367 if (!texture)
368 {
369 return gl::error(GL_INVALID_OPERATION, false);
370 }
371
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000372 if (texture->isImmutable())
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000373 {
374 return gl::error(GL_INVALID_OPERATION, false);
375 }
376
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000377 // Validate texture formats
378 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
379 if (isCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000380 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000381 if (!gl::IsValidES3CompressedFormat(actualInternalFormat))
382 {
383 return gl::error(GL_INVALID_ENUM, false);
384 }
385
386 if (target == GL_TEXTURE_3D)
387 {
388 return gl::error(GL_INVALID_OPERATION, false);
389 }
390 }
391 else
392 {
393 GLenum err;
394 if (!gl::IsValidES3FormatCombination(actualInternalFormat, format, type, &err))
395 {
396 return gl::error(err, false);
397 }
398
399 if ((target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) &&
400 (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000401 {
402 return gl::error(GL_INVALID_OPERATION, false);
403 }
404 }
405
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000406 // Validate sub image parameters
407 if (isSubImage)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000408 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000409 if (isCompressed != textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000410 {
411 return gl::error(GL_INVALID_OPERATION, false);
412 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000413
414 if (format != GL_NONE)
415 {
416 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
417 if (internalformat != textureInternalFormat)
418 {
419 return gl::error(GL_INVALID_OPERATION, false);
420 }
421 }
422
423 if (isCompressed)
424 {
425 if ((width % 4 != 0 && width != textureLevelWidth) ||
426 (height % 4 != 0 && height != textureLevelHeight))
427 {
428 return gl::error(GL_INVALID_OPERATION, false);
429 }
430 }
431
432 if (width == 0 || height == 0 || depth == 0)
433 {
434 return false;
435 }
436
437 if (xoffset < 0 || yoffset < 0 || zoffset < 0)
438 {
439 return gl::error(GL_INVALID_VALUE, false);
440 }
441
442 if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
443 std::numeric_limits<GLsizei>::max() - yoffset < height ||
444 std::numeric_limits<GLsizei>::max() - zoffset < depth)
445 {
446 return gl::error(GL_INVALID_VALUE, false);
447 }
448
449 if (xoffset + width > textureLevelWidth ||
450 yoffset + height > textureLevelHeight ||
451 zoffset + depth > textureLevelDepth)
452 {
453 return gl::error(GL_INVALID_VALUE, false);
454 }
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000455 }
456
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000457 return true;
458}
459
460bool validateCopyTexImageParameters(gl::Context *context, GLenum target, bool isCompressed, GLint level,
461 GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
462 GLsizei width, GLsizei height)
463{
464 if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000465 {
466 return gl::error(GL_INVALID_VALUE, false);
467 }
468
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000469 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
470 {
471 return gl::error(GL_INVALID_VALUE, false);
472 }
473
474 if (width == 0 || height == 0)
475 {
476 return false;
477 }
478
479 if (level > context->getMaximumTextureLevel())
480 {
481 return gl::error(GL_INVALID_VALUE, false);
482 }
483
484 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
485
486 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
487 {
488 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
489 }
490
491 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
492 {
493 return gl::error(GL_INVALID_OPERATION, false);
494 }
495
496 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
497 GLenum colorbufferFormat = source->getInternalFormat();
498 gl::Texture *texture = NULL;
499 GLenum textureFormat = GL_RGBA;
500 bool textureCompressed = false;
501 GLint textureLevelWidth = 0;
502 GLint textureLevelHeight = 0;
503 GLint textureLevelDepth = 0;
504 switch (target)
505 {
506 case GL_TEXTURE_2D:
507 {
508 gl::Texture2D *texture2d = context->getTexture2D();
509 if (texture2d)
510 {
511 textureFormat = gl::ExtractFormat(texture2d->getInternalFormat(level));
512 textureCompressed = texture2d->isCompressed(level);
513 textureLevelWidth = texture2d->getWidth(level);
514 textureLevelHeight = texture2d->getHeight(level);
515 textureLevelDepth = 1;
516 texture = texture2d;
517 }
518 }
519 break;
520
521 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
522 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
523 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
524 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
525 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
526 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
527 {
528 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
529 if (textureCube)
530 {
531 textureFormat = gl::ExtractFormat(textureCube->getInternalFormat(target, level));
532 textureCompressed = textureCube->isCompressed(target, level);
533 textureLevelWidth = textureCube->getWidth(target, level);
534 textureLevelHeight = textureCube->getHeight(target, level);
535 textureLevelDepth = 1;
536 texture = textureCube;
537 }
538 }
539 break;
540
541 case GL_TEXTURE_3D:
542 {
543 gl::Texture3D *texture3d = context->getTexture3D();
544 if (texture3d)
545 {
546 textureFormat = gl::ExtractFormat(texture3d->getInternalFormat(level));
547 textureCompressed = texture3d->isCompressed(level);
548 textureLevelWidth = texture3d->getWidth(level);
549 textureLevelHeight = texture3d->getHeight(level);
550 textureLevelDepth = texture3d->getDepth(level);
551 texture = texture3d;
552 }
553 }
554 break;
555
556 default:
557 return gl::error(GL_INVALID_ENUM, false);
558 }
559
560 if (!texture)
561 {
562 return gl::error(GL_INVALID_OPERATION, false);
563 }
564
565 if (isCompressed != textureCompressed)
566 {
567 return gl::error(GL_INVALID_OPERATION, false);
568 }
569
570 if (isCompressed)
571 {
572 if ((width % 4 != 0 && width != textureLevelWidth) ||
573 (height % 4 != 0 && height != textureLevelHeight))
574 {
575 return gl::error(GL_INVALID_OPERATION, false);
576 }
577 }
578
579 if (xoffset + width > textureLevelWidth ||
580 yoffset + height > textureLevelHeight ||
581 zoffset >= textureLevelDepth)
582 {
583 return gl::error(GL_INVALID_VALUE, false);
584 }
585
586 if (!gl::IsValidES3CopyTexImageCombination(textureFormat, colorbufferFormat))
587 {
588 return gl::error(GL_INVALID_OPERATION, false);
589 }
590
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000591 return true;
592}
593
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000594// check for combinations of format and type that are valid for ReadPixels
595bool validReadFormatType(GLenum format, GLenum type)
596{
597 switch (format)
598 {
599 case GL_RGBA:
600 switch (type)
601 {
602 case GL_UNSIGNED_BYTE:
603 break;
604 default:
605 return false;
606 }
607 break;
608 case GL_BGRA_EXT:
609 switch (type)
610 {
611 case GL_UNSIGNED_BYTE:
612 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
613 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
614 break;
615 default:
616 return false;
617 }
618 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000619 default:
620 return false;
621 }
622 return true;
623}
624
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625extern "C"
626{
627
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000628// OpenGL ES 2.0 functions
629
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000630void __stdcall glActiveTexture(GLenum texture)
631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000632 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000633
634 try
635 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000637
638 if (context)
639 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000640 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000643 }
644
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000645 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 }
647 }
648 catch(std::bad_alloc&)
649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000651 }
652}
653
654void __stdcall glAttachShader(GLuint program, GLuint shader)
655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000656 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657
658 try
659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661
662 if (context)
663 {
664 gl::Program *programObject = context->getProgram(program);
665 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000666
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000667 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000669 if (context->getShader(program))
670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000672 }
673 else
674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000675 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000676 }
677 }
678
679 if (!shaderObject)
680 {
681 if (context->getProgram(shader))
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000684 }
685 else
686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000687 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000688 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000689 }
690
691 if (!programObject->attachShader(shaderObject))
692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000693 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000694 }
695 }
696 }
697 catch(std::bad_alloc&)
698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000700 }
701}
702
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000703void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
704{
705 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
706
707 try
708 {
709 switch (target)
710 {
711 case GL_ANY_SAMPLES_PASSED_EXT:
712 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
713 break;
714 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000715 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000716 }
717
718 if (id == 0)
719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000721 }
722
723 gl::Context *context = gl::getNonLostContext();
724
725 if (context)
726 {
727 context->beginQuery(target, id);
728 }
729 }
730 catch(std::bad_alloc&)
731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000732 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000733 }
734}
735
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000736void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000738 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739
740 try
741 {
742 if (index >= gl::MAX_VERTEX_ATTRIBS)
743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000745 }
746
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748
749 if (context)
750 {
751 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000752
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 if (!programObject)
754 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000755 if (context->getShader(program))
756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000757 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000758 }
759 else
760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000761 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000762 }
763 }
764
765 if (strncmp(name, "gl_", 3) == 0)
766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000767 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768 }
769
770 programObject->bindAttributeLocation(index, name);
771 }
772 }
773 catch(std::bad_alloc&)
774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 }
777}
778
779void __stdcall glBindBuffer(GLenum target, GLuint buffer)
780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000781 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 try
784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786
787 if (context)
788 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000789 // Check ES3 specific targets
790 switch (target)
791 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000792 case GL_COPY_READ_BUFFER:
793 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000794 case GL_PIXEL_PACK_BUFFER:
795 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000796 case GL_UNIFORM_BUFFER:
797 case GL_TRANSFORM_FEEDBACK_BUFFER:
798 if (context->getClientVersion() < 3)
799 {
800 return gl::error(GL_INVALID_ENUM);
801 }
802 }
803
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804 switch (target)
805 {
806 case GL_ARRAY_BUFFER:
807 context->bindArrayBuffer(buffer);
808 return;
809 case GL_ELEMENT_ARRAY_BUFFER:
810 context->bindElementArrayBuffer(buffer);
811 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000812 case GL_COPY_READ_BUFFER:
813 context->bindCopyReadBuffer(buffer);
814 return;
815 case GL_COPY_WRITE_BUFFER:
816 context->bindCopyWriteBuffer(buffer);
817 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000818 case GL_PIXEL_PACK_BUFFER:
819 context->bindPixelPackBuffer(buffer);
820 return;
821 case GL_PIXEL_UNPACK_BUFFER:
822 context->bindPixelUnpackBuffer(buffer);
823 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000824 case GL_UNIFORM_BUFFER:
825 context->bindGenericUniformBuffer(buffer);
826 return;
827 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000828 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000829 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832 }
833 }
834 }
835 catch(std::bad_alloc&)
836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000838 }
839}
840
841void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000843 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000844
845 try
846 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000847 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000849 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000850 }
851
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000853
854 if (context)
855 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000856 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
857 {
858 context->bindReadFramebuffer(framebuffer);
859 }
860
861 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
862 {
863 context->bindDrawFramebuffer(framebuffer);
864 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000865 }
866 }
867 catch(std::bad_alloc&)
868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000870 }
871}
872
873void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000875 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876
877 try
878 {
879 if (target != GL_RENDERBUFFER)
880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000881 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882 }
883
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000884 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000885
886 if (context)
887 {
888 context->bindRenderbuffer(renderbuffer);
889 }
890 }
891 catch(std::bad_alloc&)
892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000893 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000894 }
895}
896
897void __stdcall glBindTexture(GLenum target, GLuint texture)
898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000899 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900
901 try
902 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000903 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000904
905 if (context)
906 {
907 gl::Texture *textureObject = context->getTexture(texture);
908
909 if (textureObject && textureObject->getTarget() != target && texture != 0)
910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000911 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000912 }
913
914 switch (target)
915 {
916 case GL_TEXTURE_2D:
917 context->bindTexture2D(texture);
918 return;
919 case GL_TEXTURE_CUBE_MAP:
920 context->bindTextureCubeMap(texture);
921 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000922 case GL_TEXTURE_3D:
923 if (context->getClientVersion() < 3)
924 {
925 return gl::error(GL_INVALID_ENUM);
926 }
927 context->bindTexture3D(texture);
928 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000929 case GL_TEXTURE_2D_ARRAY:
930 if (context->getClientVersion() < 3)
931 {
932 return gl::error(GL_INVALID_ENUM);
933 }
934 context->bindTexture2DArray(texture);
935 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000936 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000937 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000938 }
939 }
940 }
941 catch(std::bad_alloc&)
942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000944 }
945}
946
947void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000949 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000950 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000951
952 try
953 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000954 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000955
956 if (context)
957 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000958 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959 }
960 }
961 catch(std::bad_alloc&)
962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 }
965}
966
967void __stdcall glBlendEquation(GLenum mode)
968{
969 glBlendEquationSeparate(mode, mode);
970}
971
972void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000974 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000975
976 try
977 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000978 gl::Context *context = gl::getNonLostContext();
979
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980 switch (modeRGB)
981 {
982 case GL_FUNC_ADD:
983 case GL_FUNC_SUBTRACT:
984 case GL_FUNC_REVERSE_SUBTRACT:
985 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000986
987 case GL_MIN:
988 case GL_MAX:
989 if (context && context->getClientVersion() < 3)
990 {
991 return gl::error(GL_INVALID_ENUM);
992 }
993 break;
994
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000995 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000996 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997 }
998
999 switch (modeAlpha)
1000 {
1001 case GL_FUNC_ADD:
1002 case GL_FUNC_SUBTRACT:
1003 case GL_FUNC_REVERSE_SUBTRACT:
1004 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001005
1006 case GL_MIN:
1007 case GL_MAX:
1008 if (context && context->getClientVersion() < 3)
1009 {
1010 return gl::error(GL_INVALID_ENUM);
1011 }
1012 break;
1013
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 }
1017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 if (context)
1019 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001020 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021 }
1022 }
1023 catch(std::bad_alloc&)
1024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001025 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001026 }
1027}
1028
1029void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1030{
1031 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1032}
1033
1034void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1035{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001036 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 +00001037 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001038
1039 try
1040 {
1041 switch (srcRGB)
1042 {
1043 case GL_ZERO:
1044 case GL_ONE:
1045 case GL_SRC_COLOR:
1046 case GL_ONE_MINUS_SRC_COLOR:
1047 case GL_DST_COLOR:
1048 case GL_ONE_MINUS_DST_COLOR:
1049 case GL_SRC_ALPHA:
1050 case GL_ONE_MINUS_SRC_ALPHA:
1051 case GL_DST_ALPHA:
1052 case GL_ONE_MINUS_DST_ALPHA:
1053 case GL_CONSTANT_COLOR:
1054 case GL_ONE_MINUS_CONSTANT_COLOR:
1055 case GL_CONSTANT_ALPHA:
1056 case GL_ONE_MINUS_CONSTANT_ALPHA:
1057 case GL_SRC_ALPHA_SATURATE:
1058 break;
1059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001061 }
1062
1063 switch (dstRGB)
1064 {
1065 case GL_ZERO:
1066 case GL_ONE:
1067 case GL_SRC_COLOR:
1068 case GL_ONE_MINUS_SRC_COLOR:
1069 case GL_DST_COLOR:
1070 case GL_ONE_MINUS_DST_COLOR:
1071 case GL_SRC_ALPHA:
1072 case GL_ONE_MINUS_SRC_ALPHA:
1073 case GL_DST_ALPHA:
1074 case GL_ONE_MINUS_DST_ALPHA:
1075 case GL_CONSTANT_COLOR:
1076 case GL_ONE_MINUS_CONSTANT_COLOR:
1077 case GL_CONSTANT_ALPHA:
1078 case GL_ONE_MINUS_CONSTANT_ALPHA:
1079 break;
1080 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001081 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001082 }
1083
1084 switch (srcAlpha)
1085 {
1086 case GL_ZERO:
1087 case GL_ONE:
1088 case GL_SRC_COLOR:
1089 case GL_ONE_MINUS_SRC_COLOR:
1090 case GL_DST_COLOR:
1091 case GL_ONE_MINUS_DST_COLOR:
1092 case GL_SRC_ALPHA:
1093 case GL_ONE_MINUS_SRC_ALPHA:
1094 case GL_DST_ALPHA:
1095 case GL_ONE_MINUS_DST_ALPHA:
1096 case GL_CONSTANT_COLOR:
1097 case GL_ONE_MINUS_CONSTANT_COLOR:
1098 case GL_CONSTANT_ALPHA:
1099 case GL_ONE_MINUS_CONSTANT_ALPHA:
1100 case GL_SRC_ALPHA_SATURATE:
1101 break;
1102 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001103 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001104 }
1105
1106 switch (dstAlpha)
1107 {
1108 case GL_ZERO:
1109 case GL_ONE:
1110 case GL_SRC_COLOR:
1111 case GL_ONE_MINUS_SRC_COLOR:
1112 case GL_DST_COLOR:
1113 case GL_ONE_MINUS_DST_COLOR:
1114 case GL_SRC_ALPHA:
1115 case GL_ONE_MINUS_SRC_ALPHA:
1116 case GL_DST_ALPHA:
1117 case GL_ONE_MINUS_DST_ALPHA:
1118 case GL_CONSTANT_COLOR:
1119 case GL_ONE_MINUS_CONSTANT_COLOR:
1120 case GL_CONSTANT_ALPHA:
1121 case GL_ONE_MINUS_CONSTANT_ALPHA:
1122 break;
1123 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001127 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1128 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1129
1130 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1131 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1132
1133 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001135 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 +00001136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001137 }
1138
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001140
1141 if (context)
1142 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001143 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144 }
1145 }
1146 catch(std::bad_alloc&)
1147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001148 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001149 }
1150}
1151
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001152void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001154 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 +00001155 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156
1157 try
1158 {
1159 if (size < 0)
1160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001161 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001162 }
1163
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001164 gl::Context *context = gl::getNonLostContext();
1165
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166 switch (usage)
1167 {
1168 case GL_STREAM_DRAW:
1169 case GL_STATIC_DRAW:
1170 case GL_DYNAMIC_DRAW:
1171 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001172
1173 case GL_STREAM_READ:
1174 case GL_STREAM_COPY:
1175 case GL_STATIC_READ:
1176 case GL_STATIC_COPY:
1177 case GL_DYNAMIC_READ:
1178 case GL_DYNAMIC_COPY:
1179 if (context && context->getClientVersion() < 3)
1180 {
1181 return gl::error(GL_INVALID_ENUM);
1182 }
1183 break;
1184
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001186 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001187 }
1188
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001189 if (context)
1190 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001191 // Check ES3 specific targets
1192 switch (target)
1193 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001194 case GL_COPY_READ_BUFFER:
1195 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001196 case GL_PIXEL_PACK_BUFFER:
1197 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001198 case GL_UNIFORM_BUFFER:
1199 case GL_TRANSFORM_FEEDBACK_BUFFER:
1200 if (context->getClientVersion() < 3)
1201 {
1202 return gl::error(GL_INVALID_ENUM);
1203 }
1204 }
1205
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001206 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001207
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001208 switch (target)
1209 {
1210 case GL_ARRAY_BUFFER:
1211 buffer = context->getArrayBuffer();
1212 break;
1213 case GL_ELEMENT_ARRAY_BUFFER:
1214 buffer = context->getElementArrayBuffer();
1215 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001216 case GL_COPY_READ_BUFFER:
1217 buffer = context->getCopyReadBuffer();
1218 break;
1219 case GL_COPY_WRITE_BUFFER:
1220 buffer = context->getCopyWriteBuffer();
1221 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001222 case GL_PIXEL_PACK_BUFFER:
1223 buffer = context->getPixelPackBuffer();
1224 break;
1225 case GL_PIXEL_UNPACK_BUFFER:
1226 buffer = context->getPixelUnpackBuffer();
1227 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001228 case GL_TRANSFORM_FEEDBACK_BUFFER:
1229 buffer = context->getGenericTransformFeedbackBuffer();
1230 break;
1231 case GL_UNIFORM_BUFFER:
1232 buffer = context->getGenericUniformBuffer();
1233 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001234 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001235 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001236 }
1237
1238 if (!buffer)
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 }
1242
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001243 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001244 }
1245 }
1246 catch(std::bad_alloc&)
1247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001249 }
1250}
1251
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001252void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001254 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 +00001255 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256
1257 try
1258 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001259 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001261 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001262 }
1263
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001264 if (data == NULL)
1265 {
1266 return;
1267 }
1268
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001270
1271 if (context)
1272 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001273 // Check ES3 specific targets
1274 switch (target)
1275 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001276 case GL_COPY_READ_BUFFER:
1277 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001278 case GL_PIXEL_PACK_BUFFER:
1279 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001280 case GL_UNIFORM_BUFFER:
1281 case GL_TRANSFORM_FEEDBACK_BUFFER:
1282 if (context->getClientVersion() < 3)
1283 {
1284 return gl::error(GL_INVALID_ENUM);
1285 }
1286 }
1287
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001288 gl::Buffer *buffer;
1289
1290 switch (target)
1291 {
1292 case GL_ARRAY_BUFFER:
1293 buffer = context->getArrayBuffer();
1294 break;
1295 case GL_ELEMENT_ARRAY_BUFFER:
1296 buffer = context->getElementArrayBuffer();
1297 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001298 case GL_COPY_READ_BUFFER:
1299 buffer = context->getCopyReadBuffer();
1300 break;
1301 case GL_COPY_WRITE_BUFFER:
1302 buffer = context->getCopyWriteBuffer();
1303 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001304 case GL_PIXEL_PACK_BUFFER:
1305 buffer = context->getPixelPackBuffer();
1306 break;
1307 case GL_PIXEL_UNPACK_BUFFER:
1308 buffer = context->getPixelUnpackBuffer();
1309 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001310 case GL_TRANSFORM_FEEDBACK_BUFFER:
1311 buffer = context->getGenericTransformFeedbackBuffer();
1312 break;
1313 case GL_UNIFORM_BUFFER:
1314 buffer = context->getGenericUniformBuffer();
1315 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001316 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001317 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001318 }
1319
1320 if (!buffer)
1321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001322 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001323 }
1324
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001325 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001327 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001328 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001329
1330 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 }
1333 catch(std::bad_alloc&)
1334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001336 }
1337}
1338
1339GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001341 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342
1343 try
1344 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001345 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001347 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001348 }
1349
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001351
1352 if (context)
1353 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001354 gl::Framebuffer *framebuffer = NULL;
1355 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1356 {
1357 framebuffer = context->getReadFramebuffer();
1358 }
1359 else
1360 {
1361 framebuffer = context->getDrawFramebuffer();
1362 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001363
1364 return framebuffer->completeness();
1365 }
1366 }
1367 catch(std::bad_alloc&)
1368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001369 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370 }
1371
1372 return 0;
1373}
1374
1375void __stdcall glClear(GLbitfield mask)
1376{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001377 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001378
1379 try
1380 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382
1383 if (context)
1384 {
1385 context->clear(mask);
1386 }
1387 }
1388 catch(std::bad_alloc&)
1389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001391 }
1392}
1393
1394void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001396 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001397 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398
1399 try
1400 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001401 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001402
1403 if (context)
1404 {
1405 context->setClearColor(red, green, blue, alpha);
1406 }
1407 }
1408 catch(std::bad_alloc&)
1409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001411 }
1412}
1413
1414void __stdcall glClearDepthf(GLclampf depth)
1415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001416 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001417
1418 try
1419 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001421
1422 if (context)
1423 {
1424 context->setClearDepth(depth);
1425 }
1426 }
1427 catch(std::bad_alloc&)
1428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 }
1431}
1432
1433void __stdcall glClearStencil(GLint s)
1434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001435 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436
1437 try
1438 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440
1441 if (context)
1442 {
1443 context->setClearStencil(s);
1444 }
1445 }
1446 catch(std::bad_alloc&)
1447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 }
1450}
1451
1452void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1453{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001454 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001455 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001463 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465 }
1466 catch(std::bad_alloc&)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 }
1470}
1471
1472void __stdcall glCompileShader(GLuint shader)
1473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001474 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 try
1477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479
1480 if (context)
1481 {
1482 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 if (!shaderObject)
1485 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001486 if (context->getProgram(shader))
1487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001488 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001489 }
1490 else
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001493 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001494 }
1495
1496 shaderObject->compile();
1497 }
1498 }
1499 catch(std::bad_alloc&)
1500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001501 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001502 }
1503}
1504
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001505void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1506 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001508 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001509 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001510 target, level, internalformat, width, height, border, imageSize, data);
1511
1512 try
1513 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001514 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001517 }
1518
daniel@transgaming.com01868132010-08-24 19:21:17 +00001519 switch (internalformat)
1520 {
1521 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1522 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001523 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1524 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001525 break;
1526 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001527 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001528 }
1529
1530 if (border != 0)
1531 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001532 return gl::error(GL_INVALID_OPERATION);
1533 }
1534
1535 if (width != 1 && width != 2 && width % 4 != 0)
1536 {
1537 return gl::error(GL_INVALID_OPERATION);
1538 }
1539
1540 if (height != 1 && height != 2 && height % 4 != 0)
1541 {
1542 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001543 }
1544
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001545 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001546
1547 if (context)
1548 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001549 if (level > context->getMaximumTextureLevel())
1550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001552 }
1553
1554 switch (target)
1555 {
1556 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001557 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1558 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001561 }
1562 break;
1563 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1564 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1565 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1566 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1567 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1568 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1569 if (width != height)
1570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001571 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001572 }
1573
1574 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1575 height > (context->getMaximumCubeTextureDimension() >> level))
1576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001578 }
1579 break;
1580 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001582 }
1583
gman@chromium.org50c526d2011-08-10 05:19:44 +00001584 switch (internalformat) {
1585 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1586 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1587 if (!context->supportsDXT1Textures())
1588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001589 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 +00001590 }
1591 break;
1592 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1593 if (!context->supportsDXT3Textures())
1594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 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 +00001596 }
1597 break;
1598 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1599 if (!context->supportsDXT5Textures())
1600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001601 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 +00001602 }
1603 break;
1604 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001605 }
1606
1607 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001610 }
1611
1612 if (target == GL_TEXTURE_2D)
1613 {
1614 gl::Texture2D *texture = context->getTexture2D();
1615
1616 if (!texture)
1617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001618 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001619 }
1620
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001621 if (texture->isImmutable())
1622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001624 }
1625
daniel@transgaming.com01868132010-08-24 19:21:17 +00001626 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1627 }
1628 else
1629 {
1630 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1631
1632 if (!texture)
1633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001635 }
1636
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001637 if (texture->isImmutable())
1638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001640 }
1641
daniel@transgaming.com01868132010-08-24 19:21:17 +00001642 switch (target)
1643 {
1644 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1645 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1646 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1647 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1648 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1649 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1650 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1651 break;
1652 default: UNREACHABLE();
1653 }
1654 }
1655 }
1656
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657 }
1658 catch(std::bad_alloc&)
1659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661 }
1662}
1663
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001664void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1665 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001667 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001668 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001669 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1671
1672 try
1673 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001674 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001676 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001677 }
1678
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001679 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001682 }
1683
daniel@transgaming.com01868132010-08-24 19:21:17 +00001684 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001685 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001686 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1687 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001688 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1689 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001690 break;
1691 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001693 }
1694
daniel@transgaming.com01868132010-08-24 19:21:17 +00001695 if (width == 0 || height == 0 || data == NULL)
1696 {
1697 return;
1698 }
1699
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001700 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001701
1702 if (context)
1703 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001704 if (level > context->getMaximumTextureLevel())
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001707 }
1708
gman@chromium.org50c526d2011-08-10 05:19:44 +00001709 switch (format) {
1710 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1711 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1712 if (!context->supportsDXT1Textures())
1713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001714 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 +00001715 }
1716 break;
1717 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1718 if (!context->supportsDXT3Textures())
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 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 +00001721 }
1722 break;
1723 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1724 if (!context->supportsDXT5Textures())
1725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001726 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 +00001727 }
1728 break;
1729 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001730 }
1731
1732 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001735 }
1736
1737 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001739 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 +00001740 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001741 }
1742
1743 if (target == GL_TEXTURE_2D)
1744 {
1745 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001746 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001747 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001748 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001749 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001750 }
1751 else if (gl::IsCubemapTextureTarget(target))
1752 {
1753 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001754 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001755 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001756 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001757 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001758 }
1759 else
1760 {
1761 UNREACHABLE();
1762 }
1763 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001764 }
1765 catch(std::bad_alloc&)
1766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768 }
1769}
1770
1771void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1772{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001773 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001774 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775 target, level, internalformat, x, y, width, height, border);
1776
1777 try
1778 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001779 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001782 }
1783
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001784 if (border != 0)
1785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001787 }
1788
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001790
1791 if (context)
1792 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001793 if (level > context->getMaximumTextureLevel())
1794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001795 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001796 }
1797
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001798 switch (target)
1799 {
1800 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001801 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1802 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001804 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001805 }
1806 break;
1807 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1808 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1809 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1810 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1811 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1812 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1813 if (width != height)
1814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001816 }
1817
1818 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1819 height > (context->getMaximumCubeTextureDimension() >> level))
1820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001822 }
1823 break;
1824 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001826 }
1827
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001828 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001829
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001830 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001832 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001833 }
1834
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001835 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001837 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001838 }
1839
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001840 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001841 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001842
1843 // [OpenGL ES 2.0.24] table 3.9
1844 switch (internalformat)
1845 {
1846 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001847 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001848 colorbufferFormat != GL_RGBA4 &&
1849 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001850 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001851 colorbufferFormat != GL_RGBA8_OES)
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001854 }
1855 break;
1856 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001857 case GL_RGB:
1858 if (colorbufferFormat != GL_RGB565 &&
1859 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001860 colorbufferFormat != GL_RGBA4 &&
1861 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001862 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001863 colorbufferFormat != GL_RGBA8_OES)
1864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001865 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001866 }
1867 break;
1868 case GL_LUMINANCE_ALPHA:
1869 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001870 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001871 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001872 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001873 colorbufferFormat != GL_RGBA8_OES)
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001876 }
1877 break;
1878 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1879 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001880 if (context->supportsDXT1Textures())
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001883 }
1884 else
1885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001886 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001887 }
1888 break;
1889 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1890 if (context->supportsDXT3Textures())
1891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001892 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001893 }
1894 else
1895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001896 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001897 }
1898 break;
1899 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1900 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001903 }
1904 else
1905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001906 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001907 }
1908 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001909 case GL_DEPTH_COMPONENT:
1910 case GL_DEPTH_COMPONENT16:
1911 case GL_DEPTH_COMPONENT32_OES:
1912 case GL_DEPTH_STENCIL_OES:
1913 case GL_DEPTH24_STENCIL8_OES:
1914 if (context->supportsDepthTextures())
1915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001916 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001917 }
1918 else
1919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001921 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001922 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001923 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001924 }
1925
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001926 if (target == GL_TEXTURE_2D)
1927 {
1928 gl::Texture2D *texture = context->getTexture2D();
1929
1930 if (!texture)
1931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001932 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001933 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001934
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001935 if (texture->isImmutable())
1936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001937 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001938 }
1939
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001940 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001941 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001942 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001943 {
1944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1945
1946 if (!texture)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001949 }
1950
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001951 if (texture->isImmutable())
1952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001954 }
1955
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001956 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001957 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001958 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961 catch(std::bad_alloc&)
1962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964 }
1965}
1966
1967void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001969 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001970 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 target, level, xoffset, yoffset, x, y, width, height);
1972
1973 try
1974 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001975 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001977 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001978 }
1979
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001980 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001983 }
1984
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001985 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001988 }
1989
1990 if (width == 0 || height == 0)
1991 {
1992 return;
1993 }
1994
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001996
1997 if (context)
1998 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001999 if (level > context->getMaximumTextureLevel())
2000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002002 }
2003
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002004 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002005
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002006 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002009 }
2010
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002011 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002013 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002014 }
2015
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002016 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00002017 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002018 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002019 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002020
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002021 if (target == GL_TEXTURE_2D)
2022 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002023 gl::Texture2D *tex2d = context->getTexture2D();
2024
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002025 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002026 {
2027 return; // error already registered by validateSubImageParams
2028 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002029 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002030 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002031 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002032 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002033 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002034 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2035
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002036 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002037 {
2038 return; // error already registered by validateSubImageParams
2039 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002040 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002041 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002042 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002043 else UNREACHABLE();
2044
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002045 // [OpenGL ES 2.0.24] table 3.9
2046 switch (textureFormat)
2047 {
2048 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002049 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002050 colorbufferFormat != GL_RGBA4 &&
2051 colorbufferFormat != GL_RGB5_A1 &&
2052 colorbufferFormat != GL_RGBA8_OES)
2053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002054 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002055 }
2056 break;
2057 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002058 case GL_RGB:
2059 if (colorbufferFormat != GL_RGB565 &&
2060 colorbufferFormat != GL_RGB8_OES &&
2061 colorbufferFormat != GL_RGBA4 &&
2062 colorbufferFormat != GL_RGB5_A1 &&
2063 colorbufferFormat != GL_RGBA8_OES)
2064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002065 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002066 }
2067 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002068 case GL_LUMINANCE_ALPHA:
2069 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002070 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002071 colorbufferFormat != GL_RGB5_A1 &&
2072 colorbufferFormat != GL_RGBA8_OES)
2073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002074 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002075 }
2076 break;
2077 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2078 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002079 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2080 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002081 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002082 case GL_DEPTH_COMPONENT:
2083 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002084 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002085 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002086 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002087 }
2088
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002089 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002090 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002092
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002093 catch(std::bad_alloc&)
2094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097}
2098
2099GLuint __stdcall glCreateProgram(void)
2100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002101 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102
2103 try
2104 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002105 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002106
2107 if (context)
2108 {
2109 return context->createProgram();
2110 }
2111 }
2112 catch(std::bad_alloc&)
2113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002114 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115 }
2116
2117 return 0;
2118}
2119
2120GLuint __stdcall glCreateShader(GLenum type)
2121{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002122 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002123
2124 try
2125 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002126 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127
2128 if (context)
2129 {
2130 switch (type)
2131 {
2132 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002133 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134 return context->createShader(type);
2135 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002136 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002137 }
2138 }
2139 }
2140 catch(std::bad_alloc&)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002143 }
2144
2145 return 0;
2146}
2147
2148void __stdcall glCullFace(GLenum mode)
2149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002150 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002151
2152 try
2153 {
2154 switch (mode)
2155 {
2156 case GL_FRONT:
2157 case GL_BACK:
2158 case GL_FRONT_AND_BACK:
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 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002164 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165 }
2166 }
2167 break;
2168 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171 }
2172 catch(std::bad_alloc&)
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175 }
2176}
2177
2178void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002180 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181
2182 try
2183 {
2184 if (n < 0)
2185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002186 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002187 }
2188
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002190
2191 if (context)
2192 {
2193 for (int i = 0; i < n; i++)
2194 {
2195 context->deleteBuffer(buffers[i]);
2196 }
2197 }
2198 }
2199 catch(std::bad_alloc&)
2200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002202 }
2203}
2204
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002205void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002207 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002208
2209 try
2210 {
2211 if (n < 0)
2212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002213 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002214 }
2215
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002216 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002217
2218 if (context)
2219 {
2220 for (int i = 0; i < n; i++)
2221 {
2222 context->deleteFence(fences[i]);
2223 }
2224 }
2225 }
2226 catch(std::bad_alloc&)
2227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002228 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002229 }
2230}
2231
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002234 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002235
2236 try
2237 {
2238 if (n < 0)
2239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002240 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002241 }
2242
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244
2245 if (context)
2246 {
2247 for (int i = 0; i < n; i++)
2248 {
2249 if (framebuffers[i] != 0)
2250 {
2251 context->deleteFramebuffer(framebuffers[i]);
2252 }
2253 }
2254 }
2255 }
2256 catch(std::bad_alloc&)
2257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 }
2260}
2261
2262void __stdcall glDeleteProgram(GLuint program)
2263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002264 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265
2266 try
2267 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002268 if (program == 0)
2269 {
2270 return;
2271 }
2272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
2275 if (context)
2276 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002277 if (!context->getProgram(program))
2278 {
2279 if(context->getShader(program))
2280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002281 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002282 }
2283 else
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002286 }
2287 }
2288
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002289 context->deleteProgram(program);
2290 }
2291 }
2292 catch(std::bad_alloc&)
2293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002294 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002295 }
2296}
2297
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002298void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2299{
2300 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2301
2302 try
2303 {
2304 if (n < 0)
2305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002307 }
2308
2309 gl::Context *context = gl::getNonLostContext();
2310
2311 if (context)
2312 {
2313 for (int i = 0; i < n; i++)
2314 {
2315 context->deleteQuery(ids[i]);
2316 }
2317 }
2318 }
2319 catch(std::bad_alloc&)
2320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002321 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002322 }
2323}
2324
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002327 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328
2329 try
2330 {
2331 if (n < 0)
2332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002333 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334 }
2335
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002336 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002337
2338 if (context)
2339 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002340 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 {
2342 context->deleteRenderbuffer(renderbuffers[i]);
2343 }
2344 }
2345 }
2346 catch(std::bad_alloc&)
2347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002348 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002349 }
2350}
2351
2352void __stdcall glDeleteShader(GLuint shader)
2353{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002354 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355
2356 try
2357 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002358 if (shader == 0)
2359 {
2360 return;
2361 }
2362
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002363 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 if (context)
2366 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002367 if (!context->getShader(shader))
2368 {
2369 if(context->getProgram(shader))
2370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002371 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002372 }
2373 else
2374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002376 }
2377 }
2378
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379 context->deleteShader(shader);
2380 }
2381 }
2382 catch(std::bad_alloc&)
2383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385 }
2386}
2387
2388void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002390 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391
2392 try
2393 {
2394 if (n < 0)
2395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002396 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002397 }
2398
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002399 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002400
2401 if (context)
2402 {
2403 for (int i = 0; i < n; i++)
2404 {
2405 if (textures[i] != 0)
2406 {
2407 context->deleteTexture(textures[i]);
2408 }
2409 }
2410 }
2411 }
2412 catch(std::bad_alloc&)
2413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002414 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415 }
2416}
2417
2418void __stdcall glDepthFunc(GLenum func)
2419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002420 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421
2422 try
2423 {
2424 switch (func)
2425 {
2426 case GL_NEVER:
2427 case GL_ALWAYS:
2428 case GL_LESS:
2429 case GL_LEQUAL:
2430 case GL_EQUAL:
2431 case GL_GREATER:
2432 case GL_GEQUAL:
2433 case GL_NOTEQUAL:
2434 break;
2435 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002436 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437 }
2438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440
2441 if (context)
2442 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002443 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 }
2445 }
2446 catch(std::bad_alloc&)
2447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 }
2450}
2451
2452void __stdcall glDepthMask(GLboolean flag)
2453{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002454 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002455
2456 try
2457 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002458 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459
2460 if (context)
2461 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002462 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002463 }
2464 }
2465 catch(std::bad_alloc&)
2466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 }
2469}
2470
2471void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002473 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474
2475 try
2476 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478
2479 if (context)
2480 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002481 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 }
2483 }
2484 catch(std::bad_alloc&)
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 }
2488}
2489
2490void __stdcall glDetachShader(GLuint program, GLuint shader)
2491{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002492 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002493
2494 try
2495 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002496 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497
2498 if (context)
2499 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002500
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002501 gl::Program *programObject = context->getProgram(program);
2502 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002503
2504 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002506 gl::Shader *shaderByProgramHandle;
2507 shaderByProgramHandle = context->getShader(program);
2508 if (!shaderByProgramHandle)
2509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002510 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002511 }
2512 else
2513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002515 }
2516 }
2517
2518 if (!shaderObject)
2519 {
2520 gl::Program *programByShaderHandle = context->getProgram(shader);
2521 if (!programByShaderHandle)
2522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002524 }
2525 else
2526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002527 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002528 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530
2531 if (!programObject->detachShader(shaderObject))
2532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 }
2536 }
2537 catch(std::bad_alloc&)
2538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002539 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002540 }
2541}
2542
2543void __stdcall glDisable(GLenum cap)
2544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002545 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002546
2547 try
2548 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002549 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550
2551 if (context)
2552 {
2553 switch (cap)
2554 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002555 case GL_CULL_FACE: context->setCullFace(false); break;
2556 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2557 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2558 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2559 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2560 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2561 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2562 case GL_BLEND: context->setBlend(false); break;
2563 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002565 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 }
2567 }
2568 }
2569 catch(std::bad_alloc&)
2570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002572 }
2573}
2574
2575void __stdcall glDisableVertexAttribArray(GLuint index)
2576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002577 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578
2579 try
2580 {
2581 if (index >= gl::MAX_VERTEX_ATTRIBS)
2582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002584 }
2585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587
2588 if (context)
2589 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002590 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591 }
2592 }
2593 catch(std::bad_alloc&)
2594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002596 }
2597}
2598
2599void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002601 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602
2603 try
2604 {
2605 if (count < 0 || first < 0)
2606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002608 }
2609
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002611
2612 if (context)
2613 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002614 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 }
2616 }
2617 catch(std::bad_alloc&)
2618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620 }
2621}
2622
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002623void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2624{
2625 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2626
2627 try
2628 {
2629 if (count < 0 || first < 0 || primcount < 0)
2630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002632 }
2633
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002634 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002635 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002636 gl::Context *context = gl::getNonLostContext();
2637
2638 if (context)
2639 {
2640 context->drawArrays(mode, first, count, primcount);
2641 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002642 }
2643 }
2644 catch(std::bad_alloc&)
2645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002646 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002647 }
2648}
2649
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002650void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002652 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 +00002653 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002654
2655 try
2656 {
2657 if (count < 0)
2658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002659 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002660 }
2661
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002662 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002663
2664 if (context)
2665 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002666 switch (type)
2667 {
2668 case GL_UNSIGNED_BYTE:
2669 case GL_UNSIGNED_SHORT:
2670 break;
2671 case GL_UNSIGNED_INT:
2672 if (!context->supports32bitIndices())
2673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002675 }
2676 break;
2677 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002678 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002679 }
2680
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002681 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682 }
2683 }
2684 catch(std::bad_alloc&)
2685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002687 }
2688}
2689
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002690void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2691{
2692 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2693 mode, count, type, indices, primcount);
2694
2695 try
2696 {
2697 if (count < 0 || primcount < 0)
2698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002700 }
2701
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002702 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002703 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002704 gl::Context *context = gl::getNonLostContext();
2705
2706 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002707 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002708 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002709 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002710 case GL_UNSIGNED_BYTE:
2711 case GL_UNSIGNED_SHORT:
2712 break;
2713 case GL_UNSIGNED_INT:
2714 if (!context->supports32bitIndices())
2715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002717 }
2718 break;
2719 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002720 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002721 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002722
2723 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002724 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002725 }
2726 }
2727 catch(std::bad_alloc&)
2728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002729 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002730 }
2731}
2732
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733void __stdcall glEnable(GLenum cap)
2734{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002735 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002736
2737 try
2738 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002739 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740
2741 if (context)
2742 {
2743 switch (cap)
2744 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002745 case GL_CULL_FACE: context->setCullFace(true); break;
2746 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2747 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2748 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2749 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2750 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2751 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2752 case GL_BLEND: context->setBlend(true); break;
2753 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002754 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002756 }
2757 }
2758 }
2759 catch(std::bad_alloc&)
2760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002762 }
2763}
2764
2765void __stdcall glEnableVertexAttribArray(GLuint index)
2766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002767 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002768
2769 try
2770 {
2771 if (index >= gl::MAX_VERTEX_ATTRIBS)
2772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002773 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002774 }
2775
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002776 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002777
2778 if (context)
2779 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002780 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002781 }
2782 }
2783 catch(std::bad_alloc&)
2784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002786 }
2787}
2788
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002789void __stdcall glEndQueryEXT(GLenum target)
2790{
2791 EVENT("GLenum target = 0x%X)", target);
2792
2793 try
2794 {
2795 switch (target)
2796 {
2797 case GL_ANY_SAMPLES_PASSED_EXT:
2798 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2799 break;
2800 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002801 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002802 }
2803
2804 gl::Context *context = gl::getNonLostContext();
2805
2806 if (context)
2807 {
2808 context->endQuery(target);
2809 }
2810 }
2811 catch(std::bad_alloc&)
2812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002814 }
2815}
2816
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002817void __stdcall glFinishFenceNV(GLuint fence)
2818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002819 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002820
2821 try
2822 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002823 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002824
2825 if (context)
2826 {
2827 gl::Fence* fenceObject = context->getFence(fence);
2828
2829 if (fenceObject == NULL)
2830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002831 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002832 }
2833
2834 fenceObject->finishFence();
2835 }
2836 }
2837 catch(std::bad_alloc&)
2838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002839 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002840 }
2841}
2842
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002843void __stdcall glFinish(void)
2844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002845 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846
2847 try
2848 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002849 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002850
2851 if (context)
2852 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002853 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002854 }
2855 }
2856 catch(std::bad_alloc&)
2857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002858 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002859 }
2860}
2861
2862void __stdcall glFlush(void)
2863{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002864 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002865
2866 try
2867 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002869
2870 if (context)
2871 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002872 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873 }
2874 }
2875 catch(std::bad_alloc&)
2876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002878 }
2879}
2880
2881void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2882{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002883 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002884 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002885
2886 try
2887 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002888 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002889 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002892 }
2893
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002894 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002895
2896 if (context)
2897 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002898 gl::Framebuffer *framebuffer = NULL;
2899 GLuint framebufferHandle = 0;
2900 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2901 {
2902 framebuffer = context->getReadFramebuffer();
2903 framebufferHandle = context->getReadFramebufferHandle();
2904 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002905 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002906 {
2907 framebuffer = context->getDrawFramebuffer();
2908 framebufferHandle = context->getDrawFramebufferHandle();
2909 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002910
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002911 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002913 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002914 }
2915
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002916 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002917 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002918 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2919
2920 if (colorAttachment >= context->getMaximumRenderTargets())
2921 {
2922 return gl::error(GL_INVALID_VALUE);
2923 }
2924
2925 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2926 }
2927 else
2928 {
2929 switch (attachment)
2930 {
2931 case GL_DEPTH_ATTACHMENT:
2932 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2933 break;
2934 case GL_STENCIL_ATTACHMENT:
2935 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2936 break;
2937 default:
2938 return gl::error(GL_INVALID_ENUM);
2939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 }
2941 }
2942 }
2943 catch(std::bad_alloc&)
2944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002946 }
2947}
2948
2949void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002951 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002952 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953
2954 try
2955 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002956 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002958 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 }
2960
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962
2963 if (context)
2964 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002965 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2966 {
2967 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2968
2969 if (colorAttachment >= context->getMaximumRenderTargets())
2970 {
2971 return gl::error(GL_INVALID_VALUE);
2972 }
2973 }
2974 else
2975 {
2976 switch (attachment)
2977 {
2978 case GL_DEPTH_ATTACHMENT:
2979 case GL_STENCIL_ATTACHMENT:
2980 break;
2981 default:
2982 return gl::error(GL_INVALID_ENUM);
2983 }
2984 }
2985
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002986 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002988 textarget = GL_NONE;
2989 }
2990 else
2991 {
2992 gl::Texture *tex = context->getTexture(texture);
2993
2994 if (tex == NULL)
2995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002996 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002997 }
2998
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 switch (textarget)
3000 {
3001 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003003 if (tex->getTarget() != GL_TEXTURE_2D)
3004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003005 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003006 }
3007 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003008 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003010 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003011 }
3012 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003014
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003015 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003021 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003022 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003024 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003025 }
3026 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003027 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003029 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003030 }
3031 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003032 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003033
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003036 }
3037
3038 if (level != 0)
3039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003040 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003041 }
3042 }
3043
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003044 gl::Framebuffer *framebuffer = NULL;
3045 GLuint framebufferHandle = 0;
3046 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3047 {
3048 framebuffer = context->getReadFramebuffer();
3049 framebufferHandle = context->getReadFramebufferHandle();
3050 }
3051 else
3052 {
3053 framebuffer = context->getDrawFramebuffer();
3054 framebufferHandle = context->getDrawFramebufferHandle();
3055 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003056
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003057 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003059 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060 }
3061
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003062 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003063 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003064 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3065
3066 if (colorAttachment >= context->getMaximumRenderTargets())
3067 {
3068 return gl::error(GL_INVALID_VALUE);
3069 }
3070
3071 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3072 }
3073 else
3074 {
3075 switch (attachment)
3076 {
3077 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3078 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3079 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003080 }
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 glFrontFace(GLenum mode)
3090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003091 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003092
3093 try
3094 {
3095 switch (mode)
3096 {
3097 case GL_CW:
3098 case GL_CCW:
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 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003104 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105 }
3106 }
3107 break;
3108 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003109 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003110 }
3111 }
3112 catch(std::bad_alloc&)
3113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003115 }
3116}
3117
3118void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3119{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003120 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003121
3122 try
3123 {
3124 if (n < 0)
3125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003126 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003127 }
3128
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003129 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003130
3131 if (context)
3132 {
3133 for (int i = 0; i < n; i++)
3134 {
3135 buffers[i] = context->createBuffer();
3136 }
3137 }
3138 }
3139 catch(std::bad_alloc&)
3140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003141 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003142 }
3143}
3144
3145void __stdcall glGenerateMipmap(GLenum target)
3146{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003147 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003148
3149 try
3150 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003151 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003152
3153 if (context)
3154 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003155 switch (target)
3156 {
3157 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003158 {
3159 gl::Texture2D *tex2d = context->getTexture2D();
3160
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003161 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003164 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003165 if (tex2d->isDepth(0))
3166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003167 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003168 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003169
3170 tex2d->generateMipmaps();
3171 break;
3172 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003173
3174 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003175 {
3176 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3177
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003178 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003180 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003181 }
3182
3183 texcube->generateMipmaps();
3184 break;
3185 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003186
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003187 case GL_TEXTURE_3D:
3188 {
3189 if (context->getClientVersion() < 3)
3190 {
3191 return gl::error(GL_INVALID_ENUM);
3192 }
3193
3194 gl::Texture3D *tex3D = context->getTexture3D();
3195 if (tex3D->isCompressed(0))
3196 {
3197 return gl::error(GL_INVALID_OPERATION);
3198 }
3199
3200 tex3D->generateMipmaps();
3201 break;
3202 }
3203
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003204 case GL_TEXTURE_2D_ARRAY:
3205 {
3206 if (context->getClientVersion() < 3)
3207 {
3208 return gl::error(GL_INVALID_ENUM);
3209 }
3210
3211 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3212 if (tex2darr->isCompressed(0))
3213 {
3214 return gl::error(GL_INVALID_OPERATION);
3215 }
3216
3217 tex2darr->generateMipmaps();
3218 break;
3219 }
3220
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003221 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003222 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003223 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003224 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225 }
3226 catch(std::bad_alloc&)
3227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003228 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003229 }
3230}
3231
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003232void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003234 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003235
3236 try
3237 {
3238 if (n < 0)
3239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003240 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003241 }
3242
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003243 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003244
3245 if (context)
3246 {
3247 for (int i = 0; i < n; i++)
3248 {
3249 fences[i] = context->createFence();
3250 }
3251 }
3252 }
3253 catch(std::bad_alloc&)
3254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003255 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003256 }
3257}
3258
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003261 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262
3263 try
3264 {
3265 if (n < 0)
3266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 }
3269
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271
3272 if (context)
3273 {
3274 for (int i = 0; i < n; i++)
3275 {
3276 framebuffers[i] = context->createFramebuffer();
3277 }
3278 }
3279 }
3280 catch(std::bad_alloc&)
3281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 }
3284}
3285
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003286void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3287{
3288 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3289
3290 try
3291 {
3292 if (n < 0)
3293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003294 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003295 }
3296
3297 gl::Context *context = gl::getNonLostContext();
3298
3299 if (context)
3300 {
3301 for (int i = 0; i < n; i++)
3302 {
3303 ids[i] = context->createQuery();
3304 }
3305 }
3306 }
3307 catch(std::bad_alloc&)
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003310 }
3311}
3312
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003315 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316
3317 try
3318 {
3319 if (n < 0)
3320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 }
3323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325
3326 if (context)
3327 {
3328 for (int i = 0; i < n; i++)
3329 {
3330 renderbuffers[i] = context->createRenderbuffer();
3331 }
3332 }
3333 }
3334 catch(std::bad_alloc&)
3335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003337 }
3338}
3339
3340void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003342 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343
3344 try
3345 {
3346 if (n < 0)
3347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 }
3350
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352
3353 if (context)
3354 {
3355 for (int i = 0; i < n; i++)
3356 {
3357 textures[i] = context->createTexture();
3358 }
3359 }
3360 }
3361 catch(std::bad_alloc&)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365}
3366
daniel@transgaming.com85423182010-04-22 13:35:27 +00003367void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003369 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003370 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 program, index, bufsize, length, size, type, name);
3372
3373 try
3374 {
3375 if (bufsize < 0)
3376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378 }
3379
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003381
3382 if (context)
3383 {
3384 gl::Program *programObject = context->getProgram(program);
3385
3386 if (!programObject)
3387 {
3388 if (context->getShader(program))
3389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003391 }
3392 else
3393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003395 }
3396 }
3397
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003398 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003400 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003401 }
3402
3403 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3404 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405 }
3406 catch(std::bad_alloc&)
3407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 }
3410}
3411
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003412void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003414 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003415 "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 +00003416 program, index, bufsize, length, size, type, name);
3417
3418 try
3419 {
3420 if (bufsize < 0)
3421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003422 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 }
3424
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003426
3427 if (context)
3428 {
3429 gl::Program *programObject = context->getProgram(program);
3430
3431 if (!programObject)
3432 {
3433 if (context->getShader(program))
3434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003435 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003436 }
3437 else
3438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003440 }
3441 }
3442
3443 if (index >= (GLuint)programObject->getActiveUniformCount())
3444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003445 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003446 }
3447
3448 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 }
3451 catch(std::bad_alloc&)
3452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 }
3455}
3456
3457void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3458{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003459 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 +00003460 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461
3462 try
3463 {
3464 if (maxcount < 0)
3465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003466 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003467 }
3468
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003470
3471 if (context)
3472 {
3473 gl::Program *programObject = context->getProgram(program);
3474
3475 if (!programObject)
3476 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003477 if (context->getShader(program))
3478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003479 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003480 }
3481 else
3482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003484 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003485 }
3486
3487 return programObject->getAttachedShaders(maxcount, count, shaders);
3488 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489 }
3490 catch(std::bad_alloc&)
3491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 }
3494}
3495
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003496int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003498 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499
3500 try
3501 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003503
3504 if (context)
3505 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003506
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 gl::Program *programObject = context->getProgram(program);
3508
3509 if (!programObject)
3510 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003511 if (context->getShader(program))
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003514 }
3515 else
3516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003517 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003518 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003519 }
3520
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003521 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003522 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003525 }
3526
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003527 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003528 }
3529 }
3530 catch(std::bad_alloc&)
3531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003532 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003533 }
3534
3535 return -1;
3536}
3537
3538void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003540 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541
3542 try
3543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003545
3546 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003547 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003548 if (!(context->getBooleanv(pname, params)))
3549 {
3550 GLenum nativeType;
3551 unsigned int numParams = 0;
3552 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003553 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003554
3555 if (numParams == 0)
3556 return; // it is known that the pname is valid, but there are no parameters to return
3557
3558 if (nativeType == GL_FLOAT)
3559 {
3560 GLfloat *floatParams = NULL;
3561 floatParams = new GLfloat[numParams];
3562
3563 context->getFloatv(pname, floatParams);
3564
3565 for (unsigned int i = 0; i < numParams; ++i)
3566 {
3567 if (floatParams[i] == 0.0f)
3568 params[i] = GL_FALSE;
3569 else
3570 params[i] = GL_TRUE;
3571 }
3572
3573 delete [] floatParams;
3574 }
3575 else if (nativeType == GL_INT)
3576 {
3577 GLint *intParams = NULL;
3578 intParams = new GLint[numParams];
3579
3580 context->getIntegerv(pname, intParams);
3581
3582 for (unsigned int i = 0; i < numParams; ++i)
3583 {
3584 if (intParams[i] == 0)
3585 params[i] = GL_FALSE;
3586 else
3587 params[i] = GL_TRUE;
3588 }
3589
3590 delete [] intParams;
3591 }
3592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593 }
3594 }
3595 catch(std::bad_alloc&)
3596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598 }
3599}
3600
3601void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003603 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 +00003604
3605 try
3606 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003608
3609 if (context)
3610 {
3611 gl::Buffer *buffer;
3612
3613 switch (target)
3614 {
3615 case GL_ARRAY_BUFFER:
3616 buffer = context->getArrayBuffer();
3617 break;
3618 case GL_ELEMENT_ARRAY_BUFFER:
3619 buffer = context->getElementArrayBuffer();
3620 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003622 }
3623
3624 if (!buffer)
3625 {
3626 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003627 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003628 }
3629
3630 switch (pname)
3631 {
3632 case GL_BUFFER_USAGE:
3633 *params = buffer->usage();
3634 break;
3635 case GL_BUFFER_SIZE:
3636 *params = buffer->size();
3637 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003638 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003639 }
3640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641 }
3642 catch(std::bad_alloc&)
3643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003645 }
3646}
3647
3648GLenum __stdcall glGetError(void)
3649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003650 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651
3652 gl::Context *context = gl::getContext();
3653
3654 if (context)
3655 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003656 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003657 }
3658
3659 return GL_NO_ERROR;
3660}
3661
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003662void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003664 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003665
3666 try
3667 {
3668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003669 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003670
3671 if (context)
3672 {
3673 gl::Fence *fenceObject = context->getFence(fence);
3674
3675 if (fenceObject == NULL)
3676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003678 }
3679
3680 fenceObject->getFenceiv(pname, params);
3681 }
3682 }
3683 catch(std::bad_alloc&)
3684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003685 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003686 }
3687}
3688
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003689void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003691 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003692
3693 try
3694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003696
3697 if (context)
3698 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003699 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003700 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003701 GLenum nativeType;
3702 unsigned int numParams = 0;
3703 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003705
3706 if (numParams == 0)
3707 return; // it is known that the pname is valid, but that there are no parameters to return.
3708
3709 if (nativeType == GL_BOOL)
3710 {
3711 GLboolean *boolParams = NULL;
3712 boolParams = new GLboolean[numParams];
3713
3714 context->getBooleanv(pname, boolParams);
3715
3716 for (unsigned int i = 0; i < numParams; ++i)
3717 {
3718 if (boolParams[i] == GL_FALSE)
3719 params[i] = 0.0f;
3720 else
3721 params[i] = 1.0f;
3722 }
3723
3724 delete [] boolParams;
3725 }
3726 else if (nativeType == GL_INT)
3727 {
3728 GLint *intParams = NULL;
3729 intParams = new GLint[numParams];
3730
3731 context->getIntegerv(pname, intParams);
3732
3733 for (unsigned int i = 0; i < numParams; ++i)
3734 {
3735 params[i] = (GLfloat)intParams[i];
3736 }
3737
3738 delete [] intParams;
3739 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003740 }
3741 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003742 }
3743 catch(std::bad_alloc&)
3744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003746 }
3747}
3748
3749void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003751 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 +00003752 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753
3754 try
3755 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003757
3758 if (context)
3759 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003760 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003763 }
3764
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003765 gl::Framebuffer *framebuffer = NULL;
3766 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3767 {
3768 if(context->getReadFramebufferHandle() == 0)
3769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003770 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003771 }
3772
3773 framebuffer = context->getReadFramebuffer();
3774 }
3775 else
3776 {
3777 if (context->getDrawFramebufferHandle() == 0)
3778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003780 }
3781
3782 framebuffer = context->getDrawFramebuffer();
3783 }
3784
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003785 GLenum attachmentType;
3786 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003787
3788 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003789 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003790 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3791
3792 if (colorAttachment >= context->getMaximumRenderTargets())
3793 {
3794 return gl::error(GL_INVALID_ENUM);
3795 }
3796
3797 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3798 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3799 }
3800 else
3801 {
3802 switch (attachment)
3803 {
3804 case GL_DEPTH_ATTACHMENT:
3805 attachmentType = framebuffer->getDepthbufferType();
3806 attachmentHandle = framebuffer->getDepthbufferHandle();
3807 break;
3808 case GL_STENCIL_ATTACHMENT:
3809 attachmentType = framebuffer->getStencilbufferType();
3810 attachmentHandle = framebuffer->getStencilbufferHandle();
3811 break;
3812 default: return gl::error(GL_INVALID_ENUM);
3813 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003814 }
3815
3816 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003817 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003818 {
3819 attachmentObjectType = attachmentType;
3820 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003821 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003822 {
3823 attachmentObjectType = GL_TEXTURE;
3824 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003825 else
3826 {
3827 UNREACHABLE();
3828 return;
3829 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003830
3831 switch (pname)
3832 {
3833 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3834 *params = attachmentObjectType;
3835 break;
3836 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3837 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3838 {
3839 *params = attachmentHandle;
3840 }
3841 else
3842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003844 }
3845 break;
3846 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3847 if (attachmentObjectType == GL_TEXTURE)
3848 {
3849 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3850 }
3851 else
3852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003854 }
3855 break;
3856 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3857 if (attachmentObjectType == GL_TEXTURE)
3858 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003859 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003860 {
3861 *params = attachmentType;
3862 }
3863 else
3864 {
3865 *params = 0;
3866 }
3867 }
3868 else
3869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003871 }
3872 break;
3873 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003874 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003875 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876 }
3877 }
3878 catch(std::bad_alloc&)
3879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 }
3882}
3883
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003884GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3885{
3886 EVENT("()");
3887
3888 try
3889 {
3890 gl::Context *context = gl::getContext();
3891
3892 if (context)
3893 {
3894 return context->getResetStatus();
3895 }
3896
3897 return GL_NO_ERROR;
3898 }
3899 catch(std::bad_alloc&)
3900 {
3901 return GL_OUT_OF_MEMORY;
3902 }
3903}
3904
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003905void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3906{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003907 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003908
3909 try
3910 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912
3913 if (context)
3914 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003915 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003917 GLenum nativeType;
3918 unsigned int numParams = 0;
3919 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003922 if (numParams == 0)
3923 return; // it is known that pname is valid, but there are no parameters to return
3924
3925 if (nativeType == GL_BOOL)
3926 {
3927 GLboolean *boolParams = NULL;
3928 boolParams = new GLboolean[numParams];
3929
3930 context->getBooleanv(pname, boolParams);
3931
3932 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003933 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003934 if (boolParams[i] == GL_FALSE)
3935 params[i] = 0;
3936 else
3937 params[i] = 1;
3938 }
3939
3940 delete [] boolParams;
3941 }
3942 else if (nativeType == GL_FLOAT)
3943 {
3944 GLfloat *floatParams = NULL;
3945 floatParams = new GLfloat[numParams];
3946
3947 context->getFloatv(pname, floatParams);
3948
3949 for (unsigned int i = 0; i < numParams; ++i)
3950 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003951 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 +00003952 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003953 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003955 else
3956 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 +00003957 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003958
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003959 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003961 }
3962 }
3963 }
3964 catch(std::bad_alloc&)
3965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 }
3968}
3969
3970void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003972 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973
3974 try
3975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977
3978 if (context)
3979 {
3980 gl::Program *programObject = context->getProgram(program);
3981
3982 if (!programObject)
3983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003984 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985 }
3986
3987 switch (pname)
3988 {
3989 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003990 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003991 return;
3992 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003993 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 return;
3995 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003996 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997 return;
3998 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003999 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004000 return;
4001 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004002 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003 return;
4004 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004005 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004006 return;
4007 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004008 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004009 return;
4010 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004011 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004012 return;
4013 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004014 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004015 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004016 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004017 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004018 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004020 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021 }
4022 }
4023 }
4024 catch(std::bad_alloc&)
4025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027 }
4028}
4029
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004030void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004031{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004032 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 +00004033 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004034
4035 try
4036 {
4037 if (bufsize < 0)
4038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004039 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004040 }
4041
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004042 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004043
4044 if (context)
4045 {
4046 gl::Program *programObject = context->getProgram(program);
4047
4048 if (!programObject)
4049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004051 }
4052
4053 programObject->getInfoLog(bufsize, length, infolog);
4054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055 }
4056 catch(std::bad_alloc&)
4057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004058 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059 }
4060}
4061
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004062void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4063{
4064 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4065
4066 try
4067 {
4068 switch (pname)
4069 {
4070 case GL_CURRENT_QUERY_EXT:
4071 break;
4072 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004074 }
4075
4076 gl::Context *context = gl::getNonLostContext();
4077
4078 if (context)
4079 {
4080 params[0] = context->getActiveQuery(target);
4081 }
4082 }
4083 catch(std::bad_alloc&)
4084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004086 }
4087}
4088
4089void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4090{
4091 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4092
4093 try
4094 {
4095 switch (pname)
4096 {
4097 case GL_QUERY_RESULT_EXT:
4098 case GL_QUERY_RESULT_AVAILABLE_EXT:
4099 break;
4100 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004102 }
4103 gl::Context *context = gl::getNonLostContext();
4104
4105 if (context)
4106 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004107 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4108
4109 if (!queryObject)
4110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004111 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004112 }
4113
4114 if (context->getActiveQuery(queryObject->getType()) == id)
4115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004116 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004117 }
4118
4119 switch(pname)
4120 {
4121 case GL_QUERY_RESULT_EXT:
4122 params[0] = queryObject->getResult();
4123 break;
4124 case GL_QUERY_RESULT_AVAILABLE_EXT:
4125 params[0] = queryObject->isResultAvailable();
4126 break;
4127 default:
4128 ASSERT(false);
4129 }
4130 }
4131 }
4132 catch(std::bad_alloc&)
4133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004134 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004135 }
4136}
4137
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4139{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004140 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 +00004141
4142 try
4143 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004145
4146 if (context)
4147 {
4148 if (target != GL_RENDERBUFFER)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004151 }
4152
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004153 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004156 }
4157
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004158 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004159
4160 switch (pname)
4161 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004162 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4163 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4164 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4165 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4166 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4167 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4168 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4169 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4170 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004171 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004172 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004173 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004174 *params = renderbuffer->getSamples();
4175 }
4176 else
4177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004178 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004179 }
4180 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004181 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004182 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004183 }
4184 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004185 }
4186 catch(std::bad_alloc&)
4187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004189 }
4190}
4191
4192void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4193{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004194 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004195
4196 try
4197 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004198 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199
4200 if (context)
4201 {
4202 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004203
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 if (!shaderObject)
4205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004206 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 }
4208
4209 switch (pname)
4210 {
4211 case GL_SHADER_TYPE:
4212 *params = shaderObject->getType();
4213 return;
4214 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004215 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216 return;
4217 case GL_COMPILE_STATUS:
4218 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4219 return;
4220 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004221 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 return;
4223 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004224 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004225 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004226 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4227 *params = shaderObject->getTranslatedSourceLength();
4228 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004229 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004230 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004231 }
4232 }
4233 }
4234 catch(std::bad_alloc&)
4235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004237 }
4238}
4239
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004240void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004242 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 +00004243 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244
4245 try
4246 {
4247 if (bufsize < 0)
4248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004250 }
4251
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004252 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004253
4254 if (context)
4255 {
4256 gl::Shader *shaderObject = context->getShader(shader);
4257
4258 if (!shaderObject)
4259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004261 }
4262
4263 shaderObject->getInfoLog(bufsize, length, infolog);
4264 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004265 }
4266 catch(std::bad_alloc&)
4267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004268 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269 }
4270}
4271
4272void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004274 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 +00004275 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276
4277 try
4278 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004279 switch (shadertype)
4280 {
4281 case GL_VERTEX_SHADER:
4282 case GL_FRAGMENT_SHADER:
4283 break;
4284 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004286 }
4287
4288 switch (precisiontype)
4289 {
4290 case GL_LOW_FLOAT:
4291 case GL_MEDIUM_FLOAT:
4292 case GL_HIGH_FLOAT:
4293 // Assume IEEE 754 precision
4294 range[0] = 127;
4295 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004296 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004297 break;
4298 case GL_LOW_INT:
4299 case GL_MEDIUM_INT:
4300 case GL_HIGH_INT:
4301 // Some (most) hardware only supports single-precision floating-point numbers,
4302 // which can accurately represent integers up to +/-16777216
4303 range[0] = 24;
4304 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004305 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004306 break;
4307 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004309 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004310 }
4311 catch(std::bad_alloc&)
4312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 }
4315}
4316
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004317void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004319 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 +00004320 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321
4322 try
4323 {
4324 if (bufsize < 0)
4325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 }
4328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004330
4331 if (context)
4332 {
4333 gl::Shader *shaderObject = context->getShader(shader);
4334
4335 if (!shaderObject)
4336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004338 }
4339
4340 shaderObject->getSource(bufsize, length, source);
4341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 }
4343 catch(std::bad_alloc&)
4344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004345 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004346 }
4347}
4348
zmo@google.coma574f782011-10-03 21:45:23 +00004349void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4350{
4351 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4352 shader, bufsize, length, source);
4353
4354 try
4355 {
4356 if (bufsize < 0)
4357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004359 }
4360
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004361 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004362
4363 if (context)
4364 {
4365 gl::Shader *shaderObject = context->getShader(shader);
4366
4367 if (!shaderObject)
4368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004369 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004370 }
4371
4372 shaderObject->getTranslatedSource(bufsize, length, source);
4373 }
4374 }
4375 catch(std::bad_alloc&)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004378 }
4379}
4380
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381const GLubyte* __stdcall glGetString(GLenum name)
4382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004383 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384
4385 try
4386 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 switch (name)
4390 {
4391 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004392 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004393 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004394 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004395 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004396 if (context->getClientVersion() == 2)
4397 {
4398 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4399 }
4400 else
4401 {
4402 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4403 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004405 if (context->getClientVersion() == 2)
4406 {
4407 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4408 }
4409 else
4410 {
4411 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4412 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004413 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004414 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004416 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417 }
4418 }
4419 catch(std::bad_alloc&)
4420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004421 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423}
4424
4425void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4426{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004427 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 +00004428
4429 try
4430 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004431 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004432
4433 if (context)
4434 {
4435 gl::Texture *texture;
4436
4437 switch (target)
4438 {
4439 case GL_TEXTURE_2D:
4440 texture = context->getTexture2D();
4441 break;
4442 case GL_TEXTURE_CUBE_MAP:
4443 texture = context->getTextureCubeMap();
4444 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004445 case GL_TEXTURE_3D:
4446 if (context->getClientVersion() < 3)
4447 {
4448 return gl::error(GL_INVALID_ENUM);
4449 }
4450 texture = context->getTexture3D();
4451 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004453 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004454 }
4455
4456 switch (pname)
4457 {
4458 case GL_TEXTURE_MAG_FILTER:
4459 *params = (GLfloat)texture->getMagFilter();
4460 break;
4461 case GL_TEXTURE_MIN_FILTER:
4462 *params = (GLfloat)texture->getMinFilter();
4463 break;
4464 case GL_TEXTURE_WRAP_S:
4465 *params = (GLfloat)texture->getWrapS();
4466 break;
4467 case GL_TEXTURE_WRAP_T:
4468 *params = (GLfloat)texture->getWrapT();
4469 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004470 case GL_TEXTURE_WRAP_R:
4471 if (context->getClientVersion() < 3)
4472 {
4473 return gl::error(GL_INVALID_ENUM);
4474 }
4475 *params = (GLfloat)texture->getWrapR();
4476 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004477 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4478 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4479 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004480 case GL_TEXTURE_USAGE_ANGLE:
4481 *params = (GLfloat)texture->getUsage();
4482 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004483 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4484 if (!context->supportsTextureFilterAnisotropy())
4485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004487 }
4488 *params = (GLfloat)texture->getMaxAnisotropy();
4489 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004492 }
4493 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494 }
4495 catch(std::bad_alloc&)
4496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004497 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498 }
4499}
4500
4501void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004503 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 +00004504
4505 try
4506 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004508
4509 if (context)
4510 {
4511 gl::Texture *texture;
4512
4513 switch (target)
4514 {
4515 case GL_TEXTURE_2D:
4516 texture = context->getTexture2D();
4517 break;
4518 case GL_TEXTURE_CUBE_MAP:
4519 texture = context->getTextureCubeMap();
4520 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004521 case GL_TEXTURE_3D:
4522 if (context->getClientVersion() < 3)
4523 {
4524 return gl::error(GL_INVALID_ENUM);
4525 }
4526 texture = context->getTexture3D();
4527 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004528 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004529 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004530 }
4531
4532 switch (pname)
4533 {
4534 case GL_TEXTURE_MAG_FILTER:
4535 *params = texture->getMagFilter();
4536 break;
4537 case GL_TEXTURE_MIN_FILTER:
4538 *params = texture->getMinFilter();
4539 break;
4540 case GL_TEXTURE_WRAP_S:
4541 *params = texture->getWrapS();
4542 break;
4543 case GL_TEXTURE_WRAP_T:
4544 *params = texture->getWrapT();
4545 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004546 case GL_TEXTURE_WRAP_R:
4547 if (context->getClientVersion() < 3)
4548 {
4549 return gl::error(GL_INVALID_ENUM);
4550 }
4551 *params = texture->getWrapR();
4552 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004553 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4554 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4555 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004556 case GL_TEXTURE_USAGE_ANGLE:
4557 *params = texture->getUsage();
4558 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004559 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4560 if (!context->supportsTextureFilterAnisotropy())
4561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004562 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004563 }
4564 *params = (GLint)texture->getMaxAnisotropy();
4565 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004568 }
4569 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004570 }
4571 catch(std::bad_alloc&)
4572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 }
4575}
4576
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004577void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4578{
4579 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4580 program, location, bufSize, params);
4581
4582 try
4583 {
4584 if (bufSize < 0)
4585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004587 }
4588
4589 gl::Context *context = gl::getNonLostContext();
4590
4591 if (context)
4592 {
4593 if (program == 0)
4594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004595 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004596 }
4597
4598 gl::Program *programObject = context->getProgram(program);
4599
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004600 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004602 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004603 }
4604
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004605 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4606 if (!programBinary)
4607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004608 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004609 }
4610
4611 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004614 }
4615 }
4616 }
4617 catch(std::bad_alloc&)
4618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004620 }
4621}
4622
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004625 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626
4627 try
4628 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004630
4631 if (context)
4632 {
4633 if (program == 0)
4634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004635 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004636 }
4637
4638 gl::Program *programObject = context->getProgram(program);
4639
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004640 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004643 }
4644
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004645 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4646 if (!programBinary)
4647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004648 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004649 }
4650
4651 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004654 }
4655 }
4656 }
4657 catch(std::bad_alloc&)
4658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004660 }
4661}
4662
4663void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4664{
4665 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4666 program, location, bufSize, params);
4667
4668 try
4669 {
4670 if (bufSize < 0)
4671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004673 }
4674
4675 gl::Context *context = gl::getNonLostContext();
4676
4677 if (context)
4678 {
4679 if (program == 0)
4680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004682 }
4683
4684 gl::Program *programObject = context->getProgram(program);
4685
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004686 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004689 }
4690
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004691 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4692 if (!programBinary)
4693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004694 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004695 }
4696
4697 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004700 }
4701 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 }
4703 catch(std::bad_alloc&)
4704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 }
4707}
4708
4709void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004711 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004712
4713 try
4714 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004715 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004716
4717 if (context)
4718 {
4719 if (program == 0)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004722 }
4723
4724 gl::Program *programObject = context->getProgram(program);
4725
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004726 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004728 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004729 }
4730
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004731 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4732 if (!programBinary)
4733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004734 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004735 }
4736
4737 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004739 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004740 }
4741 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 }
4743 catch(std::bad_alloc&)
4744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746 }
4747}
4748
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004749int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004751 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004752
4753 try
4754 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004755 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756
4757 if (strstr(name, "gl_") == name)
4758 {
4759 return -1;
4760 }
4761
4762 if (context)
4763 {
4764 gl::Program *programObject = context->getProgram(program);
4765
4766 if (!programObject)
4767 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004768 if (context->getShader(program))
4769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004770 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004771 }
4772 else
4773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004774 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004778 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004779 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004781 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004784 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785 }
4786 }
4787 catch(std::bad_alloc&)
4788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004789 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 }
4791
4792 return -1;
4793}
4794
4795void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004797 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798
4799 try
4800 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
daniel@transgaming.come0078962010-04-15 20:45:08 +00004803 if (context)
4804 {
4805 if (index >= gl::MAX_VERTEX_ATTRIBS)
4806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004807 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004808 }
4809
daniel@transgaming.com83921382011-01-08 05:46:00 +00004810 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004811
daniel@transgaming.come0078962010-04-15 20:45:08 +00004812 switch (pname)
4813 {
4814 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004815 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004816 break;
4817 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004818 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004819 break;
4820 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004821 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004822 break;
4823 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004824 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004825 break;
4826 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004827 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004828 break;
4829 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004830 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004831 break;
4832 case GL_CURRENT_VERTEX_ATTRIB:
4833 for (int i = 0; i < 4; ++i)
4834 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004835 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004836 }
4837 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004838 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4839 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4840 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004841 *params = (GLfloat)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
4853void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4854{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004855 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
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
daniel@transgaming.com83921382011-01-08 05:46:00 +00004868 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004869
daniel@transgaming.come0078962010-04-15 20:45:08 +00004870 switch (pname)
4871 {
4872 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004873 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004874 break;
4875 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004876 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004877 break;
4878 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004879 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004880 break;
4881 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004882 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004883 break;
4884 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004885 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004886 break;
4887 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004888 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004889 break;
4890 case GL_CURRENT_VERTEX_ATTRIB:
4891 for (int i = 0; i < 4; ++i)
4892 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004893 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004894 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4895 }
4896 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004897 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4898 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4899 // the same constant.
4900 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004901 *params = (GLint)attribState.mDivisor;
4902 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004903 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004904 }
4905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907 catch(std::bad_alloc&)
4908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004909 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910 }
4911}
4912
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004913void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004914{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004915 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916
4917 try
4918 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920
daniel@transgaming.come0078962010-04-15 20:45:08 +00004921 if (context)
4922 {
4923 if (index >= gl::MAX_VERTEX_ATTRIBS)
4924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004926 }
4927
4928 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004930 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004931 }
4932
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004933 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004934 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004935 }
4936 catch(std::bad_alloc&)
4937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939 }
4940}
4941
4942void __stdcall glHint(GLenum target, GLenum mode)
4943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004944 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945
4946 try
4947 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004948 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004949 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004950 case GL_FASTEST:
4951 case GL_NICEST:
4952 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004953 break;
4954 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004955 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004956 }
4957
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004958 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004959 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004960 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004961 case GL_GENERATE_MIPMAP_HINT:
4962 if (context) context->setGenerateMipmapHint(mode);
4963 break;
4964 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4965 if (context) context->setFragmentShaderDerivativeHint(mode);
4966 break;
4967 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004968 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004969 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971 catch(std::bad_alloc&)
4972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004974 }
4975}
4976
4977GLboolean __stdcall glIsBuffer(GLuint buffer)
4978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004979 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004980
4981 try
4982 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984
4985 if (context && buffer)
4986 {
4987 gl::Buffer *bufferObject = context->getBuffer(buffer);
4988
4989 if (bufferObject)
4990 {
4991 return GL_TRUE;
4992 }
4993 }
4994 }
4995 catch(std::bad_alloc&)
4996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004997 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998 }
4999
5000 return GL_FALSE;
5001}
5002
5003GLboolean __stdcall glIsEnabled(GLenum cap)
5004{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005005 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005006
5007 try
5008 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005009 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005010
5011 if (context)
5012 {
5013 switch (cap)
5014 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005015 case GL_CULL_FACE: return context->isCullFaceEnabled();
5016 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5017 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5018 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5019 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5020 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5021 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5022 case GL_BLEND: return context->isBlendEnabled();
5023 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005024 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005025 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005026 }
5027 }
5028 }
5029 catch(std::bad_alloc&)
5030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005031 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032 }
5033
5034 return false;
5035}
5036
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005037GLboolean __stdcall glIsFenceNV(GLuint fence)
5038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005039 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005040
5041 try
5042 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005043 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005044
5045 if (context)
5046 {
5047 gl::Fence *fenceObject = context->getFence(fence);
5048
5049 if (fenceObject == NULL)
5050 {
5051 return GL_FALSE;
5052 }
5053
5054 return fenceObject->isFence();
5055 }
5056 }
5057 catch(std::bad_alloc&)
5058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005059 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005060 }
5061
5062 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005063}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005067 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068
5069 try
5070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005072
5073 if (context && framebuffer)
5074 {
5075 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5076
5077 if (framebufferObject)
5078 {
5079 return GL_TRUE;
5080 }
5081 }
5082 }
5083 catch(std::bad_alloc&)
5084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005085 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005086 }
5087
5088 return GL_FALSE;
5089}
5090
5091GLboolean __stdcall glIsProgram(GLuint program)
5092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005093 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094
5095 try
5096 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098
5099 if (context && program)
5100 {
5101 gl::Program *programObject = context->getProgram(program);
5102
5103 if (programObject)
5104 {
5105 return GL_TRUE;
5106 }
5107 }
5108 }
5109 catch(std::bad_alloc&)
5110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005111 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005112 }
5113
5114 return GL_FALSE;
5115}
5116
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005117GLboolean __stdcall glIsQueryEXT(GLuint id)
5118{
5119 EVENT("(GLuint id = %d)", id);
5120
5121 try
5122 {
5123 if (id == 0)
5124 {
5125 return GL_FALSE;
5126 }
5127
5128 gl::Context *context = gl::getNonLostContext();
5129
5130 if (context)
5131 {
5132 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5133
5134 if (queryObject)
5135 {
5136 return GL_TRUE;
5137 }
5138 }
5139 }
5140 catch(std::bad_alloc&)
5141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005142 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005143 }
5144
5145 return GL_FALSE;
5146}
5147
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005150 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151
5152 try
5153 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005154 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005155
5156 if (context && renderbuffer)
5157 {
5158 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5159
5160 if (renderbufferObject)
5161 {
5162 return GL_TRUE;
5163 }
5164 }
5165 }
5166 catch(std::bad_alloc&)
5167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005168 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170
5171 return GL_FALSE;
5172}
5173
5174GLboolean __stdcall glIsShader(GLuint shader)
5175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005176 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177
5178 try
5179 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005181
5182 if (context && shader)
5183 {
5184 gl::Shader *shaderObject = context->getShader(shader);
5185
5186 if (shaderObject)
5187 {
5188 return GL_TRUE;
5189 }
5190 }
5191 }
5192 catch(std::bad_alloc&)
5193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005195 }
5196
5197 return GL_FALSE;
5198}
5199
5200GLboolean __stdcall glIsTexture(GLuint texture)
5201{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005202 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203
5204 try
5205 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005206 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207
5208 if (context && texture)
5209 {
5210 gl::Texture *textureObject = context->getTexture(texture);
5211
5212 if (textureObject)
5213 {
5214 return GL_TRUE;
5215 }
5216 }
5217 }
5218 catch(std::bad_alloc&)
5219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005220 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005221 }
5222
5223 return GL_FALSE;
5224}
5225
5226void __stdcall glLineWidth(GLfloat width)
5227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005228 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229
5230 try
5231 {
5232 if (width <= 0.0f)
5233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005234 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235 }
5236
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005238
5239 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005240 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005241 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242 }
5243 }
5244 catch(std::bad_alloc&)
5245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005247 }
5248}
5249
5250void __stdcall glLinkProgram(GLuint program)
5251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005252 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253
5254 try
5255 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257
5258 if (context)
5259 {
5260 gl::Program *programObject = context->getProgram(program);
5261
5262 if (!programObject)
5263 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005264 if (context->getShader(program))
5265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005266 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005267 }
5268 else
5269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005271 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005274 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005275 }
5276 }
5277 catch(std::bad_alloc&)
5278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005280 }
5281}
5282
5283void __stdcall glPixelStorei(GLenum pname, GLint param)
5284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005285 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286
5287 try
5288 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005290
5291 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005292 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005293 switch (pname)
5294 {
5295 case GL_UNPACK_ALIGNMENT:
5296 if (param != 1 && param != 2 && param != 4 && param != 8)
5297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005298 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005299 }
5300
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005301 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005302 break;
5303
5304 case GL_PACK_ALIGNMENT:
5305 if (param != 1 && param != 2 && param != 4 && param != 8)
5306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005308 }
5309
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005310 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005311 break;
5312
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005313 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5314 context->setPackReverseRowOrder(param != 0);
5315 break;
5316
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005317 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005320 }
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.com4f39fd92010-03-08 20:26:45 +00005325 }
5326}
5327
5328void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5329{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005330 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005331
5332 try
5333 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005335
5336 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005337 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005338 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 }
5340 }
5341 catch(std::bad_alloc&)
5342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344 }
5345}
5346
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005347void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5348 GLenum format, GLenum type, GLsizei bufSize,
5349 GLvoid *data)
5350{
5351 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5352 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5353 x, y, width, height, format, type, bufSize, data);
5354
5355 try
5356 {
5357 if (width < 0 || height < 0 || bufSize < 0)
5358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005360 }
5361
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005362 gl::Context *context = gl::getNonLostContext();
5363
5364 if (context)
5365 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005366 GLenum currentFormat, currentType;
5367
5368 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5369 // and attempting to read back if that's the case is an error. The error will be registered
5370 // by getCurrentReadFormat.
5371 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5372 return;
5373
5374 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005376 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005377 }
5378
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005379 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5380 }
5381 }
5382 catch(std::bad_alloc&)
5383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005385 }
5386}
5387
5388void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5389 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005391 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005392 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005393 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394
5395 try
5396 {
5397 if (width < 0 || height < 0)
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 if (context)
5405 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005406 GLenum currentFormat, currentType;
5407
5408 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5409 // and attempting to read back if that's the case is an error. The error will be registered
5410 // by getCurrentReadFormat.
5411 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5412 return;
5413
5414 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005417 }
5418
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005419 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 }
5421 }
5422 catch(std::bad_alloc&)
5423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426}
5427
5428void __stdcall glReleaseShaderCompiler(void)
5429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005430 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431
5432 try
5433 {
5434 gl::Shader::releaseCompiler();
5435 }
5436 catch(std::bad_alloc&)
5437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440}
5441
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005442void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005444 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 +00005445 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446
5447 try
5448 {
5449 switch (target)
5450 {
5451 case GL_RENDERBUFFER:
5452 break;
5453 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455 }
5456
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005457 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460 }
5461
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005462 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465 }
5466
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468
5469 if (context)
5470 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005471 if (width > context->getMaximumRenderbufferDimension() ||
5472 height > context->getMaximumRenderbufferDimension() ||
5473 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005475 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005476 }
5477
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005478 GLuint handle = context->getRenderbufferHandle();
5479 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005482 }
5483
5484 switch (internalformat)
5485 {
5486 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 case GL_RGBA4:
5488 case GL_RGB5_A1:
5489 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005490 case GL_RGB8_OES:
5491 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005493 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005494 break;
5495 case GL_SRGB8_ALPHA8:
5496 case GL_RGB10_A2:
5497 case GL_RG8:
5498 case GL_R8:
5499 if (context->getClientVersion() < 3)
5500 {
5501 return gl::error(GL_INVALID_ENUM);
5502 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005503 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005507
5508 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509 }
5510 }
5511 catch(std::bad_alloc&)
5512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514 }
5515}
5516
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005517void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5518{
5519 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5520}
5521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5523{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005524 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525
5526 try
5527 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005528 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005529
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 if (context)
5531 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005532 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533 }
5534 }
5535 catch(std::bad_alloc&)
5536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005537 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005538 }
5539}
5540
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005541void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5542{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005543 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005544
5545 try
5546 {
5547 if (condition != GL_ALL_COMPLETED_NV)
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005550 }
5551
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005552 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005553
5554 if (context)
5555 {
5556 gl::Fence *fenceObject = context->getFence(fence);
5557
5558 if (fenceObject == NULL)
5559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005560 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005561 }
5562
5563 fenceObject->setFence(condition);
5564 }
5565 }
5566 catch(std::bad_alloc&)
5567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005568 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005569 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005570}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005571
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005574 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 +00005575
5576 try
5577 {
5578 if (width < 0 || height < 0)
5579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005580 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005581 }
5582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005583 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005584
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 if (context)
5586 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005587 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588 }
5589 }
5590 catch(std::bad_alloc&)
5591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593 }
5594}
5595
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005596void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005598 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005599 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005600 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601
5602 try
5603 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005604 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 }
5607 catch(std::bad_alloc&)
5608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005610 }
5611}
5612
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005613void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005615 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 +00005616 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617
5618 try
5619 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005620 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005625 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626
5627 if (context)
5628 {
5629 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005630
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631 if (!shaderObject)
5632 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005633 if (context->getProgram(shader))
5634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005636 }
5637 else
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005641 }
5642
5643 shaderObject->setSource(count, string, length);
5644 }
5645 }
5646 catch(std::bad_alloc&)
5647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
5650}
5651
5652void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5653{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005654 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655}
5656
5657void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005659 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 +00005660
5661 try
5662 {
5663 switch (face)
5664 {
5665 case GL_FRONT:
5666 case GL_BACK:
5667 case GL_FRONT_AND_BACK:
5668 break;
5669 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 }
5672
5673 switch (func)
5674 {
5675 case GL_NEVER:
5676 case GL_ALWAYS:
5677 case GL_LESS:
5678 case GL_LEQUAL:
5679 case GL_EQUAL:
5680 case GL_GEQUAL:
5681 case GL_GREATER:
5682 case GL_NOTEQUAL:
5683 break;
5684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 }
5687
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005688 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689
5690 if (context)
5691 {
5692 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5693 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005694 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695 }
5696
5697 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5698 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005699 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 }
5702 }
5703 catch(std::bad_alloc&)
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707}
5708
5709void __stdcall glStencilMask(GLuint mask)
5710{
5711 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5712}
5713
5714void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005716 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717
5718 try
5719 {
5720 switch (face)
5721 {
5722 case GL_FRONT:
5723 case GL_BACK:
5724 case GL_FRONT_AND_BACK:
5725 break;
5726 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005727 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005731
5732 if (context)
5733 {
5734 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5735 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005736 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005737 }
5738
5739 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5740 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005741 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005742 }
5743 }
5744 }
5745 catch(std::bad_alloc&)
5746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748 }
5749}
5750
5751void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5752{
5753 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5754}
5755
5756void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005758 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 +00005759 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005760
5761 try
5762 {
5763 switch (face)
5764 {
5765 case GL_FRONT:
5766 case GL_BACK:
5767 case GL_FRONT_AND_BACK:
5768 break;
5769 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005771 }
5772
5773 switch (fail)
5774 {
5775 case GL_ZERO:
5776 case GL_KEEP:
5777 case GL_REPLACE:
5778 case GL_INCR:
5779 case GL_DECR:
5780 case GL_INVERT:
5781 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005782 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005783 break;
5784 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005785 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 }
5787
5788 switch (zfail)
5789 {
5790 case GL_ZERO:
5791 case GL_KEEP:
5792 case GL_REPLACE:
5793 case GL_INCR:
5794 case GL_DECR:
5795 case GL_INVERT:
5796 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005797 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005798 break;
5799 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802
5803 switch (zpass)
5804 {
5805 case GL_ZERO:
5806 case GL_KEEP:
5807 case GL_REPLACE:
5808 case GL_INCR:
5809 case GL_DECR:
5810 case GL_INVERT:
5811 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005812 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 break;
5814 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 }
5817
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005818 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819
5820 if (context)
5821 {
5822 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5823 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005824 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825 }
5826
5827 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5828 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005829 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005830 }
5831 }
5832 }
5833 catch(std::bad_alloc&)
5834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836 }
5837}
5838
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005839GLboolean __stdcall glTestFenceNV(GLuint fence)
5840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005841 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005842
5843 try
5844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005845 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005846
5847 if (context)
5848 {
5849 gl::Fence *fenceObject = context->getFence(fence);
5850
5851 if (fenceObject == NULL)
5852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005853 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005854 }
5855
5856 return fenceObject->testFence();
5857 }
5858 }
5859 catch(std::bad_alloc&)
5860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005861 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005862 }
5863
5864 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005865}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005866
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005867void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5868 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005870 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 +00005871 "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 +00005872 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005873
5874 try
5875 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005876 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005879 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005880
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005881 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005882 {
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
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005886 // validate <type> by itself (used as secondary key below)
5887 switch (type)
5888 {
5889 case GL_UNSIGNED_BYTE:
5890 case GL_UNSIGNED_SHORT_5_6_5:
5891 case GL_UNSIGNED_SHORT_4_4_4_4:
5892 case GL_UNSIGNED_SHORT_5_5_5_1:
5893 case GL_UNSIGNED_SHORT:
5894 case GL_UNSIGNED_INT:
5895 case GL_UNSIGNED_INT_24_8_OES:
5896 case GL_HALF_FLOAT_OES:
5897 case GL_FLOAT:
5898 break;
5899 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005901 }
5902
5903 // validate <format> + <type> combinations
5904 // - invalid <format> -> sets INVALID_ENUM
5905 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005906 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 {
5908 case GL_ALPHA:
5909 case GL_LUMINANCE:
5910 case GL_LUMINANCE_ALPHA:
5911 switch (type)
5912 {
5913 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005914 case GL_FLOAT:
5915 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005916 break;
5917 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005919 }
5920 break;
5921 case GL_RGB:
5922 switch (type)
5923 {
5924 case GL_UNSIGNED_BYTE:
5925 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005926 case GL_FLOAT:
5927 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928 break;
5929 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931 }
5932 break;
5933 case GL_RGBA:
5934 switch (type)
5935 {
5936 case GL_UNSIGNED_BYTE:
5937 case GL_UNSIGNED_SHORT_4_4_4_4:
5938 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005939 case GL_FLOAT:
5940 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941 break;
5942 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944 }
5945 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005946 case GL_BGRA_EXT:
5947 switch (type)
5948 {
5949 case GL_UNSIGNED_BYTE:
5950 break;
5951 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005952 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005953 }
5954 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005955 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5956 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005957 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5958 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005959 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005960 case GL_DEPTH_COMPONENT:
5961 switch (type)
5962 {
5963 case GL_UNSIGNED_SHORT:
5964 case GL_UNSIGNED_INT:
5965 break;
5966 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005967 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005968 }
5969 break;
5970 case GL_DEPTH_STENCIL_OES:
5971 switch (type)
5972 {
5973 case GL_UNSIGNED_INT_24_8_OES:
5974 break;
5975 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005976 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005977 }
5978 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005979 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005980 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981 }
5982
5983 if (border != 0)
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986 }
5987
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989
5990 if (context)
5991 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005992 if (level > context->getMaximumTextureLevel())
5993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005995 }
5996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005997 switch (target)
5998 {
5999 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006000 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6001 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006003 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006004 }
6005 break;
6006 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6007 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6008 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6009 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6010 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6011 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6012 if (width != height)
6013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006014 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006015 }
6016
6017 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6018 height > (context->getMaximumCubeTextureDimension() >> level))
6019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006020 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006021 }
6022 break;
6023 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006025 }
6026
gman@chromium.org50c526d2011-08-10 05:19:44 +00006027 switch (format) {
6028 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6029 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6030 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006032 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006033 }
6034 else
6035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006036 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006037 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006038 break;
6039 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6040 if (context->supportsDXT3Textures())
6041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006042 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006043 }
6044 else
6045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006046 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006047 }
6048 break;
6049 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6050 if (context->supportsDXT5Textures())
6051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006052 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006053 }
6054 else
6055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006056 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006057 }
6058 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006059 case GL_DEPTH_COMPONENT:
6060 case GL_DEPTH_STENCIL_OES:
6061 if (!context->supportsDepthTextures())
6062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006064 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006065 if (target != GL_TEXTURE_2D)
6066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006067 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006068 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006069 // OES_depth_texture supports loading depth data and multiple levels,
6070 // but ANGLE_depth_texture does not
6071 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006073 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006074 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006075 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006076 default:
6077 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006078 }
6079
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006080 if (type == GL_FLOAT)
6081 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006082 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006084 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006085 }
6086 }
6087 else if (type == GL_HALF_FLOAT_OES)
6088 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006089 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006091 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006092 }
6093 }
6094
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095 if (target == GL_TEXTURE_2D)
6096 {
6097 gl::Texture2D *texture = context->getTexture2D();
6098
6099 if (!texture)
6100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006102 }
6103
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006104 if (texture->isImmutable())
6105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006106 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006107 }
6108
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006109 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006110 }
6111 else
6112 {
6113 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6114
6115 if (!texture)
6116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006117 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118 }
6119
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006120 if (texture->isImmutable())
6121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006122 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006123 }
6124
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006125 switch (target)
6126 {
6127 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006128 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006129 break;
6130 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006131 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132 break;
6133 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006134 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006135 break;
6136 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006137 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006138 break;
6139 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006140 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006141 break;
6142 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006143 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144 break;
6145 default: UNREACHABLE();
6146 }
6147 }
6148 }
6149 }
6150 catch(std::bad_alloc&)
6151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006152 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006153 }
6154}
6155
6156void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6157{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006158 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6159
6160 try
6161 {
6162 gl::Context *context = gl::getNonLostContext();
6163
6164 if (context)
6165 {
6166 gl::Texture *texture;
6167
6168 switch (target)
6169 {
6170 case GL_TEXTURE_2D:
6171 texture = context->getTexture2D();
6172 break;
6173 case GL_TEXTURE_CUBE_MAP:
6174 texture = context->getTextureCubeMap();
6175 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006176 case GL_TEXTURE_3D:
6177 if (context->getClientVersion() < 3)
6178 {
6179 return gl::error(GL_INVALID_ENUM);
6180 }
6181 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006182 case GL_TEXTURE_2D_ARRAY:
6183 if (context->getClientVersion() < 3)
6184 {
6185 return gl::error(GL_INVALID_ENUM);
6186 }
6187 texture = context->getTexture2DArray();
6188 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006189 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006190 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006191 }
6192
6193 switch (pname)
6194 {
6195 case GL_TEXTURE_WRAP_S:
6196 if (!texture->setWrapS((GLenum)param))
6197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006199 }
6200 break;
6201 case GL_TEXTURE_WRAP_T:
6202 if (!texture->setWrapT((GLenum)param))
6203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006204 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006205 }
6206 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006207 case GL_TEXTURE_WRAP_R:
6208 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6209 {
6210 return gl::error(GL_INVALID_ENUM);
6211 }
6212 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006213 case GL_TEXTURE_MIN_FILTER:
6214 if (!texture->setMinFilter((GLenum)param))
6215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006216 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006217 }
6218 break;
6219 case GL_TEXTURE_MAG_FILTER:
6220 if (!texture->setMagFilter((GLenum)param))
6221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006222 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006223 }
6224 break;
6225 case GL_TEXTURE_USAGE_ANGLE:
6226 if (!texture->setUsage((GLenum)param))
6227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006229 }
6230 break;
6231 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6232 if (!context->supportsTextureFilterAnisotropy())
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006235 }
6236 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006239 }
6240 break;
6241 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006243 }
6244 }
6245 }
6246 catch(std::bad_alloc&)
6247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006249 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006250}
6251
6252void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6253{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006254 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006255}
6256
6257void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006259 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006260
6261 try
6262 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006263 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006264
6265 if (context)
6266 {
6267 gl::Texture *texture;
6268
6269 switch (target)
6270 {
6271 case GL_TEXTURE_2D:
6272 texture = context->getTexture2D();
6273 break;
6274 case GL_TEXTURE_CUBE_MAP:
6275 texture = context->getTextureCubeMap();
6276 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006277 case GL_TEXTURE_3D:
6278 if (context->getClientVersion() < 3)
6279 {
6280 return gl::error(GL_INVALID_ENUM);
6281 }
6282 texture = context->getTexture3D();
6283 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006284 case GL_TEXTURE_2D_ARRAY:
6285 if (context->getClientVersion() < 3)
6286 {
6287 return gl::error(GL_INVALID_ENUM);
6288 }
6289 texture = context->getTexture2DArray();
6290 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006291 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006292 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006293 }
6294
6295 switch (pname)
6296 {
6297 case GL_TEXTURE_WRAP_S:
6298 if (!texture->setWrapS((GLenum)param))
6299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006300 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006301 }
6302 break;
6303 case GL_TEXTURE_WRAP_T:
6304 if (!texture->setWrapT((GLenum)param))
6305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006306 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006307 }
6308 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006309 case GL_TEXTURE_WRAP_R:
6310 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6311 {
6312 return gl::error(GL_INVALID_ENUM);
6313 }
6314 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006315 case GL_TEXTURE_MIN_FILTER:
6316 if (!texture->setMinFilter((GLenum)param))
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320 break;
6321 case GL_TEXTURE_MAG_FILTER:
6322 if (!texture->setMagFilter((GLenum)param))
6323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006325 }
6326 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006327 case GL_TEXTURE_USAGE_ANGLE:
6328 if (!texture->setUsage((GLenum)param))
6329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006331 }
6332 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006333 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6334 if (!context->supportsTextureFilterAnisotropy())
6335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006336 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006337 }
6338 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006341 }
6342 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006344 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006345 }
6346 }
6347 }
6348 catch(std::bad_alloc&)
6349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006351 }
6352}
6353
6354void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6355{
6356 glTexParameteri(target, pname, *params);
6357}
6358
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006359void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6360{
6361 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6362 target, levels, internalformat, width, height);
6363
6364 try
6365 {
6366 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006368 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006369 }
6370
6371 if (width < 1 || height < 1 || levels < 1)
6372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006374 }
6375
6376 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006379 }
6380
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006381 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006383 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006384 }
6385
6386 GLenum format = gl::ExtractFormat(internalformat);
6387 GLenum type = gl::ExtractType(internalformat);
6388
6389 if (format == GL_NONE || type == GL_NONE)
6390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006392 }
6393
6394 gl::Context *context = gl::getNonLostContext();
6395
6396 if (context)
6397 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006398 switch (target)
6399 {
6400 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006401 if (width > context->getMaximum2DTextureDimension() ||
6402 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006404 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006405 }
6406 break;
6407 case GL_TEXTURE_CUBE_MAP:
6408 if (width > context->getMaximumCubeTextureDimension() ||
6409 height > context->getMaximumCubeTextureDimension())
6410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006412 }
6413 break;
6414 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006415 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006416 }
6417
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006418 if (levels != 1 && !context->supportsNonPower2Texture())
6419 {
6420 if (!gl::isPow2(width) || !gl::isPow2(height))
6421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006423 }
6424 }
6425
daniel@transgaming.come1077362011-11-11 04:16:50 +00006426 switch (internalformat)
6427 {
6428 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6429 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6430 if (!context->supportsDXT1Textures())
6431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006432 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006433 }
6434 break;
6435 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6436 if (!context->supportsDXT3Textures())
6437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006439 }
6440 break;
6441 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6442 if (!context->supportsDXT5Textures())
6443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006444 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006445 }
6446 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006447 case GL_RGBA32F_EXT:
6448 case GL_RGB32F_EXT:
6449 case GL_ALPHA32F_EXT:
6450 case GL_LUMINANCE32F_EXT:
6451 case GL_LUMINANCE_ALPHA32F_EXT:
6452 if (!context->supportsFloat32Textures())
6453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006455 }
6456 break;
6457 case GL_RGBA16F_EXT:
6458 case GL_RGB16F_EXT:
6459 case GL_ALPHA16F_EXT:
6460 case GL_LUMINANCE16F_EXT:
6461 case GL_LUMINANCE_ALPHA16F_EXT:
6462 if (!context->supportsFloat16Textures())
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006465 }
6466 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006467 case GL_DEPTH_COMPONENT16:
6468 case GL_DEPTH_COMPONENT32_OES:
6469 case GL_DEPTH24_STENCIL8_OES:
6470 if (!context->supportsDepthTextures())
6471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006473 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006474 if (target != GL_TEXTURE_2D)
6475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006476 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006477 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006478 // ANGLE_depth_texture only supports 1-level textures
6479 if (levels != 1)
6480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006482 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006483 break;
6484 default:
6485 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006486 }
6487
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006488 if (target == GL_TEXTURE_2D)
6489 {
6490 gl::Texture2D *texture = context->getTexture2D();
6491
6492 if (!texture || texture->id() == 0)
6493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006494 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006495 }
6496
6497 if (texture->isImmutable())
6498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006500 }
6501
6502 texture->storage(levels, internalformat, width, height);
6503 }
6504 else if (target == GL_TEXTURE_CUBE_MAP)
6505 {
6506 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6507
6508 if (!texture || texture->id() == 0)
6509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006511 }
6512
6513 if (texture->isImmutable())
6514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006516 }
6517
6518 texture->storage(levels, internalformat, width);
6519 }
6520 else UNREACHABLE();
6521 }
6522 }
6523 catch(std::bad_alloc&)
6524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006526 }
6527}
6528
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006529void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6530 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006532 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006533 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006534 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006535 target, level, xoffset, yoffset, width, height, format, type, pixels);
6536
6537 try
6538 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006539 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006541 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006542 }
6543
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006544 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006546 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006547 }
6548
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006549 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006552 }
6553
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006554 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006555 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006556 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006557 }
6558
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006560
6561 if (context)
6562 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006563 if (level > context->getMaximumTextureLevel())
6564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006565 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006566 }
6567
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006568 if (format == GL_FLOAT)
6569 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006570 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006572 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006573 }
6574 }
6575 else if (format == GL_HALF_FLOAT_OES)
6576 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006577 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006580 }
6581 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006582 else if (gl::IsDepthTexture(format))
6583 {
6584 if (!context->supportsDepthTextures())
6585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006587 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006588 if (target != GL_TEXTURE_2D)
6589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006590 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006591 }
6592 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006594 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006595
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006596 if (width == 0 || height == 0 || pixels == NULL)
6597 {
6598 return;
6599 }
6600
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006601 if (target == GL_TEXTURE_2D)
6602 {
6603 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006604 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006605 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006606 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006607 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006608 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006609 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006610 {
6611 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006612 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006613 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006614 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006615 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006616 }
6617 else
6618 {
6619 UNREACHABLE();
6620 }
6621 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006622 }
6623 catch(std::bad_alloc&)
6624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006626 }
6627}
6628
6629void __stdcall glUniform1f(GLint location, GLfloat x)
6630{
6631 glUniform1fv(location, 1, &x);
6632}
6633
6634void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006636 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006637
6638 try
6639 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006640 if (count < 0)
6641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643 }
6644
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006645 if (location == -1)
6646 {
6647 return;
6648 }
6649
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006650 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006651
6652 if (context)
6653 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006654 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006655 if (!programBinary)
6656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006657 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006658 }
6659
6660 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006662 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006663 }
6664 }
6665 }
6666 catch(std::bad_alloc&)
6667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006669 }
6670}
6671
6672void __stdcall glUniform1i(GLint location, GLint x)
6673{
6674 glUniform1iv(location, 1, &x);
6675}
6676
6677void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6678{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006679 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006680
6681 try
6682 {
6683 if (count < 0)
6684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006685 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006686 }
6687
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006688 if (location == -1)
6689 {
6690 return;
6691 }
6692
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006693 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006694
6695 if (context)
6696 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006697 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006698 if (!programBinary)
6699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006700 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006701 }
6702
6703 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006705 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006706 }
6707 }
6708 }
6709 catch(std::bad_alloc&)
6710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006711 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006712 }
6713}
6714
6715void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6716{
6717 GLfloat xy[2] = {x, y};
6718
6719 glUniform2fv(location, 1, (GLfloat*)&xy);
6720}
6721
6722void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6723{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006724 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006725
6726 try
6727 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006728 if (count < 0)
6729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006731 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006732
6733 if (location == -1)
6734 {
6735 return;
6736 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006737
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006738 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006739
6740 if (context)
6741 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006742 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006743 if (!programBinary)
6744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006745 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006746 }
6747
6748 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006750 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006751 }
6752 }
6753 }
6754 catch(std::bad_alloc&)
6755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006757 }
6758}
6759
6760void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6761{
6762 GLint xy[4] = {x, y};
6763
6764 glUniform2iv(location, 1, (GLint*)&xy);
6765}
6766
6767void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006769 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006770
6771 try
6772 {
6773 if (count < 0)
6774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006775 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006776 }
6777
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006778 if (location == -1)
6779 {
6780 return;
6781 }
6782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006784
6785 if (context)
6786 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006787 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006788 if (!programBinary)
6789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006790 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006791 }
6792
6793 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006795 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006796 }
6797 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006798 }
6799 catch(std::bad_alloc&)
6800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006801 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006802 }
6803}
6804
6805void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6806{
6807 GLfloat xyz[3] = {x, y, z};
6808
6809 glUniform3fv(location, 1, (GLfloat*)&xyz);
6810}
6811
6812void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6813{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006814 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006815
6816 try
6817 {
6818 if (count < 0)
6819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006820 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006821 }
6822
6823 if (location == -1)
6824 {
6825 return;
6826 }
6827
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006828 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006829
6830 if (context)
6831 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006832 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006833 if (!programBinary)
6834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006835 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006836 }
6837
6838 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006841 }
6842 }
6843 }
6844 catch(std::bad_alloc&)
6845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006847 }
6848}
6849
6850void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6851{
6852 GLint xyz[3] = {x, y, z};
6853
6854 glUniform3iv(location, 1, (GLint*)&xyz);
6855}
6856
6857void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006859 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006860
6861 try
6862 {
6863 if (count < 0)
6864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006866 }
6867
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006868 if (location == -1)
6869 {
6870 return;
6871 }
6872
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006873 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006874
6875 if (context)
6876 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006877 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006878 if (!programBinary)
6879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006880 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006881 }
6882
6883 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006886 }
6887 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006888 }
6889 catch(std::bad_alloc&)
6890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006892 }
6893}
6894
6895void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6896{
6897 GLfloat xyzw[4] = {x, y, z, w};
6898
6899 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6900}
6901
6902void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006904 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006905
6906 try
6907 {
6908 if (count < 0)
6909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006911 }
6912
6913 if (location == -1)
6914 {
6915 return;
6916 }
6917
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006919
6920 if (context)
6921 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006922 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006923 if (!programBinary)
6924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006925 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006926 }
6927
6928 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006931 }
6932 }
6933 }
6934 catch(std::bad_alloc&)
6935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006937 }
6938}
6939
6940void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6941{
6942 GLint xyzw[4] = {x, y, z, w};
6943
6944 glUniform4iv(location, 1, (GLint*)&xyzw);
6945}
6946
6947void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006949 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006950
6951 try
6952 {
6953 if (count < 0)
6954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006955 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006956 }
6957
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006958 if (location == -1)
6959 {
6960 return;
6961 }
6962
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006964
6965 if (context)
6966 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006967 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006968 if (!programBinary)
6969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006970 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006971 }
6972
6973 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006975 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006976 }
6977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006978 }
6979 catch(std::bad_alloc&)
6980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006981 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006982 }
6983}
6984
6985void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6986{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006987 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006988 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006989
6990 try
6991 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006992 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006995 }
6996
6997 if (location == -1)
6998 {
6999 return;
7000 }
7001
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007003
7004 if (context)
7005 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007006 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7007 {
7008 return gl::error(GL_INVALID_VALUE);
7009 }
7010
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007011 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007012 if (!programBinary)
7013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007014 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007015 }
7016
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007017 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007019 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007020 }
7021 }
7022 }
7023 catch(std::bad_alloc&)
7024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007025 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007026 }
7027}
7028
7029void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7030{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007031 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007032 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007033
7034 try
7035 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007036 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007038 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007039 }
7040
7041 if (location == -1)
7042 {
7043 return;
7044 }
7045
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007047
7048 if (context)
7049 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007050 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7051 {
7052 return gl::error(GL_INVALID_VALUE);
7053 }
7054
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007055 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007056 if (!programBinary)
7057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007058 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007059 }
7060
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007061 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007063 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007064 }
7065 }
7066 }
7067 catch(std::bad_alloc&)
7068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007070 }
7071}
7072
7073void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7074{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007075 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007076 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007077
7078 try
7079 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007080 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007083 }
7084
7085 if (location == -1)
7086 {
7087 return;
7088 }
7089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007091
7092 if (context)
7093 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007094 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7095 {
7096 return gl::error(GL_INVALID_VALUE);
7097 }
7098
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007099 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007100 if (!programBinary)
7101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007102 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007103 }
7104
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007105 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007107 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007108 }
7109 }
7110 }
7111 catch(std::bad_alloc&)
7112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007114 }
7115}
7116
7117void __stdcall glUseProgram(GLuint program)
7118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007119 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007120
7121 try
7122 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007123 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007124
7125 if (context)
7126 {
7127 gl::Program *programObject = context->getProgram(program);
7128
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007129 if (!programObject && program != 0)
7130 {
7131 if (context->getShader(program))
7132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007133 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007134 }
7135 else
7136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007137 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007138 }
7139 }
7140
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007141 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144 }
7145
7146 context->useProgram(program);
7147 }
7148 }
7149 catch(std::bad_alloc&)
7150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007151 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007152 }
7153}
7154
7155void __stdcall glValidateProgram(GLuint program)
7156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007157 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007158
7159 try
7160 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007161 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007162
7163 if (context)
7164 {
7165 gl::Program *programObject = context->getProgram(program);
7166
7167 if (!programObject)
7168 {
7169 if (context->getShader(program))
7170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007171 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007172 }
7173 else
7174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007176 }
7177 }
7178
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007179 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007181 }
7182 catch(std::bad_alloc&)
7183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007185 }
7186}
7187
7188void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007190 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007191
7192 try
7193 {
7194 if (index >= gl::MAX_VERTEX_ATTRIBS)
7195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007196 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007197 }
7198
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007199 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007200
7201 if (context)
7202 {
7203 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007204 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007205 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007206 }
7207 catch(std::bad_alloc&)
7208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007210 }
7211}
7212
7213void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007215 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007216
7217 try
7218 {
7219 if (index >= gl::MAX_VERTEX_ATTRIBS)
7220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007222 }
7223
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007225
7226 if (context)
7227 {
7228 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007229 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007230 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007231 }
7232 catch(std::bad_alloc&)
7233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007235 }
7236}
7237
7238void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007240 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007241
7242 try
7243 {
7244 if (index >= gl::MAX_VERTEX_ATTRIBS)
7245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007246 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007247 }
7248
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007249 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007250
7251 if (context)
7252 {
7253 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007254 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007255 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007256 }
7257 catch(std::bad_alloc&)
7258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007260 }
7261}
7262
7263void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007265 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007266
7267 try
7268 {
7269 if (index >= gl::MAX_VERTEX_ATTRIBS)
7270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007271 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007272 }
7273
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007275
7276 if (context)
7277 {
7278 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007279 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007281 }
7282 catch(std::bad_alloc&)
7283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007285 }
7286}
7287
7288void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7289{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007290 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 +00007291
7292 try
7293 {
7294 if (index >= gl::MAX_VERTEX_ATTRIBS)
7295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007297 }
7298
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007299 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007300
7301 if (context)
7302 {
7303 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007304 context->setVertexAttribf(index, vals);
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
7313void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007315 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007316
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.com4f39fd92010-03-08 20:26:45 +00007322 }
7323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007325
7326 if (context)
7327 {
7328 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007329 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007330 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007331 }
7332 catch(std::bad_alloc&)
7333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007334 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007335 }
7336}
7337
7338void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007340 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 +00007341
7342 try
7343 {
7344 if (index >= gl::MAX_VERTEX_ATTRIBS)
7345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007346 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007347 }
7348
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007350
7351 if (context)
7352 {
7353 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007354 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007355 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007356 }
7357 catch(std::bad_alloc&)
7358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007359 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007360 }
7361}
7362
7363void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7364{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007365 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007366
7367 try
7368 {
7369 if (index >= gl::MAX_VERTEX_ATTRIBS)
7370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007371 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007372 }
7373
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007374 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007375
7376 if (context)
7377 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007378 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007379 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007380 }
7381 catch(std::bad_alloc&)
7382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007384 }
7385}
7386
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007387void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7388{
7389 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7390
7391 try
7392 {
7393 if (index >= gl::MAX_VERTEX_ATTRIBS)
7394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007395 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007396 }
7397
7398 gl::Context *context = gl::getNonLostContext();
7399
7400 if (context)
7401 {
7402 context->setVertexAttribDivisor(index, divisor);
7403 }
7404 }
7405 catch(std::bad_alloc&)
7406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007407 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007408 }
7409}
7410
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007411void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007413 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007414 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007415 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007416
7417 try
7418 {
7419 if (index >= gl::MAX_VERTEX_ATTRIBS)
7420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007421 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007422 }
7423
7424 if (size < 1 || size > 4)
7425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007427 }
7428
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007429 gl::Context *context = gl::getNonLostContext();
7430
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007431 switch (type)
7432 {
7433 case GL_BYTE:
7434 case GL_UNSIGNED_BYTE:
7435 case GL_SHORT:
7436 case GL_UNSIGNED_SHORT:
7437 case GL_FIXED:
7438 case GL_FLOAT:
7439 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007440 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007441 case GL_INT:
7442 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007443 case GL_INT_2_10_10_10_REV:
7444 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007445 if (context && context->getClientVersion() < 3)
7446 {
7447 return gl::error(GL_INVALID_ENUM);
7448 }
7449 else
7450 {
7451 break;
7452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007453 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007455 }
7456
7457 if (stride < 0)
7458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007460 }
7461
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007462 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7463 {
7464 return gl::error(GL_INVALID_OPERATION);
7465 }
7466
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007467 if (context)
7468 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007469 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7470 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007471 }
7472 }
7473 catch(std::bad_alloc&)
7474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007475 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007476 }
7477}
7478
7479void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007481 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 +00007482
7483 try
7484 {
7485 if (width < 0 || height < 0)
7486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007488 }
7489
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007490 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007491
7492 if (context)
7493 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007494 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007495 }
7496 }
7497 catch(std::bad_alloc&)
7498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007499 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007500 }
7501}
7502
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007503// OpenGL ES 3.0 functions
7504
7505void __stdcall glReadBuffer(GLenum mode)
7506{
7507 EVENT("(GLenum mode = 0x%X)", mode);
7508
7509 try
7510 {
7511 gl::Context *context = gl::getNonLostContext();
7512
7513 if (context)
7514 {
7515 if (context->getClientVersion() < 3)
7516 {
7517 return gl::error(GL_INVALID_OPERATION);
7518 }
7519 }
7520
7521 UNIMPLEMENTED();
7522 }
7523 catch(std::bad_alloc&)
7524 {
7525 return gl::error(GL_OUT_OF_MEMORY);
7526 }
7527}
7528
7529void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7530{
7531 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7532 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7533
7534 try
7535 {
7536 gl::Context *context = gl::getNonLostContext();
7537
7538 if (context)
7539 {
7540 if (context->getClientVersion() < 3)
7541 {
7542 return gl::error(GL_INVALID_OPERATION);
7543 }
7544 }
7545
7546 UNIMPLEMENTED();
7547 }
7548 catch(std::bad_alloc&)
7549 {
7550 return gl::error(GL_OUT_OF_MEMORY);
7551 }
7552}
7553
7554void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7555{
7556 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7557 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7558 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7559 target, level, internalformat, width, height, depth, border, format, type, pixels);
7560
7561 try
7562 {
7563 gl::Context *context = gl::getNonLostContext();
7564
7565 if (context)
7566 {
7567 if (context->getClientVersion() < 3)
7568 {
7569 return gl::error(GL_INVALID_OPERATION);
7570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007571
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007572 // validateES3TexImageFormat sets the error code if there is an error
7573 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7574 0, 0, 0, width, height, depth, border, format, type))
7575 {
7576 return;
7577 }
7578
7579 switch(target)
7580 {
7581 case GL_TEXTURE_3D:
7582 {
7583 gl::Texture3D *texture = context->getTexture3D();
7584 texture->setImage(level, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7585 }
7586 break;
7587
7588 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007589 {
7590 gl::Texture2DArray *texture = context->getTexture2DArray();
7591 texture->setImage(level, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7592 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007593 break;
7594
7595 default:
7596 return gl::error(GL_INVALID_ENUM);
7597 }
7598 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007599 }
7600 catch(std::bad_alloc&)
7601 {
7602 return gl::error(GL_OUT_OF_MEMORY);
7603 }
7604}
7605
7606void __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)
7607{
7608 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7609 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7610 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7611 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7612
7613 try
7614 {
7615 gl::Context *context = gl::getNonLostContext();
7616
7617 if (context)
7618 {
7619 if (context->getClientVersion() < 3)
7620 {
7621 return gl::error(GL_INVALID_OPERATION);
7622 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007623
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007624 if (!pixels)
7625 {
7626 return gl::error(GL_INVALID_VALUE);
7627 }
7628
7629 // validateES3TexImageFormat sets the error code if there is an error
7630 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7631 xoffset, yoffset, zoffset, width, height, depth, 0,
7632 format, type))
7633 {
7634 return;
7635 }
7636
7637 switch(target)
7638 {
7639 case GL_TEXTURE_3D:
7640 {
7641 gl::Texture3D *texture = context->getTexture3D();
7642 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7643 }
7644 break;
7645
7646 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007647 {
7648 gl::Texture2DArray *texture = context->getTexture2DArray();
7649 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7650 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007651 break;
7652
7653 default:
7654 return gl::error(GL_INVALID_ENUM);
7655 }
7656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657 }
7658 catch(std::bad_alloc&)
7659 {
7660 return gl::error(GL_OUT_OF_MEMORY);
7661 }
7662}
7663
7664void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7665{
7666 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7667 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7668 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7669
7670 try
7671 {
7672 gl::Context *context = gl::getNonLostContext();
7673
7674 if (context)
7675 {
7676 if (context->getClientVersion() < 3)
7677 {
7678 return gl::error(GL_INVALID_OPERATION);
7679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007680
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007681 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7682 x, y, width, height))
7683 {
7684 return;
7685 }
7686
7687 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7688 gl::Texture *texture = NULL;
7689 switch (target)
7690 {
7691 case GL_TEXTURE_3D:
7692 texture = context->getTexture3D();
7693 break;
7694
7695 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007696 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007697 break;
7698
7699 default:
7700 return gl::error(GL_INVALID_ENUM);
7701 }
7702
7703 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007705 }
7706 catch(std::bad_alloc&)
7707 {
7708 return gl::error(GL_OUT_OF_MEMORY);
7709 }
7710}
7711
7712void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7713{
7714 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7715 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7716 "const GLvoid* data = 0x%0.8p)",
7717 target, level, internalformat, width, height, depth, border, imageSize, data);
7718
7719 try
7720 {
7721 gl::Context *context = gl::getNonLostContext();
7722
7723 if (context)
7724 {
7725 if (context->getClientVersion() < 3)
7726 {
7727 return gl::error(GL_INVALID_OPERATION);
7728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007729
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007730 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, internalformat))
7731 {
7732 return gl::error(GL_INVALID_VALUE);
7733 }
7734
7735 // validateES3TexImageFormat sets the error code if there is an error
7736 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7737 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7738 {
7739 return;
7740 }
7741
7742 switch(target)
7743 {
7744 case GL_TEXTURE_3D:
7745 {
7746 gl::Texture3D *texture = context->getTexture3D();
7747 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7748 }
7749 break;
7750
7751 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007752 {
7753 gl::Texture2DArray *texture = context->getTexture2DArray();
7754 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7755 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007756 break;
7757
7758 default:
7759 return gl::error(GL_INVALID_ENUM);
7760 }
7761 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007762 }
7763 catch(std::bad_alloc&)
7764 {
7765 return gl::error(GL_OUT_OF_MEMORY);
7766 }
7767}
7768
7769void __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)
7770{
7771 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7772 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7773 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7774 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7775
7776 try
7777 {
7778 gl::Context *context = gl::getNonLostContext();
7779
7780 if (context)
7781 {
7782 if (context->getClientVersion() < 3)
7783 {
7784 return gl::error(GL_INVALID_OPERATION);
7785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007786
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007787 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, format))
7788 {
7789 return gl::error(GL_INVALID_VALUE);
7790 }
7791
7792 if (!data)
7793 {
7794 return gl::error(GL_INVALID_VALUE);
7795 }
7796
7797 // validateES3TexImageFormat sets the error code if there is an error
7798 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7799 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7800 {
7801 return;
7802 }
7803
7804 switch(target)
7805 {
7806 case GL_TEXTURE_3D:
7807 {
7808 gl::Texture3D *texture = context->getTexture3D();
7809 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7810 format, imageSize, data);
7811 }
7812 break;
7813
7814 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007815 {
7816 gl::Texture2DArray *texture = context->getTexture2DArray();
7817 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7818 format, imageSize, data);
7819 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007820 break;
7821
7822 default:
7823 return gl::error(GL_INVALID_ENUM);
7824 }
7825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007826 }
7827 catch(std::bad_alloc&)
7828 {
7829 return gl::error(GL_OUT_OF_MEMORY);
7830 }
7831}
7832
7833void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7834{
7835 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7836
7837 try
7838 {
7839 gl::Context *context = gl::getNonLostContext();
7840
7841 if (context)
7842 {
7843 if (context->getClientVersion() < 3)
7844 {
7845 return gl::error(GL_INVALID_OPERATION);
7846 }
7847 }
7848
7849 UNIMPLEMENTED();
7850 }
7851 catch(std::bad_alloc&)
7852 {
7853 return gl::error(GL_OUT_OF_MEMORY);
7854 }
7855}
7856
7857void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7858{
7859 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7860
7861 try
7862 {
7863 gl::Context *context = gl::getNonLostContext();
7864
7865 if (context)
7866 {
7867 if (context->getClientVersion() < 3)
7868 {
7869 return gl::error(GL_INVALID_OPERATION);
7870 }
7871 }
7872
7873 UNIMPLEMENTED();
7874 }
7875 catch(std::bad_alloc&)
7876 {
7877 return gl::error(GL_OUT_OF_MEMORY);
7878 }
7879}
7880
7881GLboolean __stdcall glIsQuery(GLuint id)
7882{
7883 EVENT("(GLuint id = %u)", id);
7884
7885 try
7886 {
7887 gl::Context *context = gl::getNonLostContext();
7888
7889 if (context)
7890 {
7891 if (context->getClientVersion() < 3)
7892 {
7893 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7894 }
7895 }
7896
7897 UNIMPLEMENTED();
7898 }
7899 catch(std::bad_alloc&)
7900 {
7901 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7902 }
7903
7904 return GL_FALSE;
7905}
7906
7907void __stdcall glBeginQuery(GLenum target, GLuint id)
7908{
7909 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7910
7911 try
7912 {
7913 gl::Context *context = gl::getNonLostContext();
7914
7915 if (context)
7916 {
7917 if (context->getClientVersion() < 3)
7918 {
7919 return gl::error(GL_INVALID_OPERATION);
7920 }
7921 }
7922
7923 UNIMPLEMENTED();
7924 }
7925 catch(std::bad_alloc&)
7926 {
7927 return gl::error(GL_OUT_OF_MEMORY);
7928 }
7929}
7930
7931void __stdcall glEndQuery(GLenum target)
7932{
7933 EVENT("(GLenum target = 0x%X)", target);
7934
7935 try
7936 {
7937 gl::Context *context = gl::getNonLostContext();
7938
7939 if (context)
7940 {
7941 if (context->getClientVersion() < 3)
7942 {
7943 return gl::error(GL_INVALID_OPERATION);
7944 }
7945 }
7946
7947 UNIMPLEMENTED();
7948 }
7949 catch(std::bad_alloc&)
7950 {
7951 return gl::error(GL_OUT_OF_MEMORY);
7952 }
7953}
7954
7955void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7956{
7957 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7958
7959 try
7960 {
7961 gl::Context *context = gl::getNonLostContext();
7962
7963 if (context)
7964 {
7965 if (context->getClientVersion() < 3)
7966 {
7967 return gl::error(GL_INVALID_OPERATION);
7968 }
7969 }
7970
7971 UNIMPLEMENTED();
7972 }
7973 catch(std::bad_alloc&)
7974 {
7975 return gl::error(GL_OUT_OF_MEMORY);
7976 }
7977}
7978
7979void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7980{
7981 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7982
7983 try
7984 {
7985 gl::Context *context = gl::getNonLostContext();
7986
7987 if (context)
7988 {
7989 if (context->getClientVersion() < 3)
7990 {
7991 return gl::error(GL_INVALID_OPERATION);
7992 }
7993 }
7994
7995 UNIMPLEMENTED();
7996 }
7997 catch(std::bad_alloc&)
7998 {
7999 return gl::error(GL_OUT_OF_MEMORY);
8000 }
8001}
8002
8003GLboolean __stdcall glUnmapBuffer(GLenum target)
8004{
8005 EVENT("(GLenum target = 0x%X)", target);
8006
8007 try
8008 {
8009 gl::Context *context = gl::getNonLostContext();
8010
8011 if (context)
8012 {
8013 if (context->getClientVersion() < 3)
8014 {
8015 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8016 }
8017 }
8018
8019 UNIMPLEMENTED();
8020 }
8021 catch(std::bad_alloc&)
8022 {
8023 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8024 }
8025
8026 return GL_FALSE;
8027}
8028
8029void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8030{
8031 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8032
8033 try
8034 {
8035 gl::Context *context = gl::getNonLostContext();
8036
8037 if (context)
8038 {
8039 if (context->getClientVersion() < 3)
8040 {
8041 return gl::error(GL_INVALID_OPERATION);
8042 }
8043 }
8044
8045 UNIMPLEMENTED();
8046 }
8047 catch(std::bad_alloc&)
8048 {
8049 return gl::error(GL_OUT_OF_MEMORY);
8050 }
8051}
8052
8053void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8054{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008055 try
8056 {
8057 gl::Context *context = gl::getNonLostContext();
8058
8059 if (context)
8060 {
8061 if (context->getClientVersion() < 3)
8062 {
8063 return gl::error(GL_INVALID_OPERATION);
8064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008065
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008066 glDrawBuffersEXT(n, bufs);
8067 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008068 }
8069 catch(std::bad_alloc&)
8070 {
8071 return gl::error(GL_OUT_OF_MEMORY);
8072 }
8073}
8074
8075void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8076{
8077 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8078 location, count, transpose, value);
8079
8080 try
8081 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008082 if (count < 0)
8083 {
8084 return gl::error(GL_INVALID_VALUE);
8085 }
8086
8087 if (location == -1)
8088 {
8089 return;
8090 }
8091
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008092 gl::Context *context = gl::getNonLostContext();
8093
8094 if (context)
8095 {
8096 if (context->getClientVersion() < 3)
8097 {
8098 return gl::error(GL_INVALID_OPERATION);
8099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008100
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008101 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8102 if (!programBinary)
8103 {
8104 return gl::error(GL_INVALID_OPERATION);
8105 }
8106
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008107 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008108 {
8109 return gl::error(GL_INVALID_OPERATION);
8110 }
8111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008112 }
8113 catch(std::bad_alloc&)
8114 {
8115 return gl::error(GL_OUT_OF_MEMORY);
8116 }
8117}
8118
8119void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8120{
8121 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8122 location, count, transpose, value);
8123
8124 try
8125 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008126 if (count < 0)
8127 {
8128 return gl::error(GL_INVALID_VALUE);
8129 }
8130
8131 if (location == -1)
8132 {
8133 return;
8134 }
8135
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008136 gl::Context *context = gl::getNonLostContext();
8137
8138 if (context)
8139 {
8140 if (context->getClientVersion() < 3)
8141 {
8142 return gl::error(GL_INVALID_OPERATION);
8143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008144
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008145 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8146 if (!programBinary)
8147 {
8148 return gl::error(GL_INVALID_OPERATION);
8149 }
8150
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008151 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008152 {
8153 return gl::error(GL_INVALID_OPERATION);
8154 }
8155 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008156 }
8157 catch(std::bad_alloc&)
8158 {
8159 return gl::error(GL_OUT_OF_MEMORY);
8160 }
8161}
8162
8163void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8164{
8165 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8166 location, count, transpose, value);
8167
8168 try
8169 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008170 if (count < 0)
8171 {
8172 return gl::error(GL_INVALID_VALUE);
8173 }
8174
8175 if (location == -1)
8176 {
8177 return;
8178 }
8179
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180 gl::Context *context = gl::getNonLostContext();
8181
8182 if (context)
8183 {
8184 if (context->getClientVersion() < 3)
8185 {
8186 return gl::error(GL_INVALID_OPERATION);
8187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008188
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008189 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8190 if (!programBinary)
8191 {
8192 return gl::error(GL_INVALID_OPERATION);
8193 }
8194
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008195 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008196 {
8197 return gl::error(GL_INVALID_OPERATION);
8198 }
8199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008200 }
8201 catch(std::bad_alloc&)
8202 {
8203 return gl::error(GL_OUT_OF_MEMORY);
8204 }
8205}
8206
8207void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8208{
8209 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8210 location, count, transpose, value);
8211
8212 try
8213 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008214 if (count < 0)
8215 {
8216 return gl::error(GL_INVALID_VALUE);
8217 }
8218
8219 if (location == -1)
8220 {
8221 return;
8222 }
8223
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008224 gl::Context *context = gl::getNonLostContext();
8225
8226 if (context)
8227 {
8228 if (context->getClientVersion() < 3)
8229 {
8230 return gl::error(GL_INVALID_OPERATION);
8231 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008232
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008233 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8234 if (!programBinary)
8235 {
8236 return gl::error(GL_INVALID_OPERATION);
8237 }
8238
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008239 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008240 {
8241 return gl::error(GL_INVALID_OPERATION);
8242 }
8243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008244 }
8245 catch(std::bad_alloc&)
8246 {
8247 return gl::error(GL_OUT_OF_MEMORY);
8248 }
8249}
8250
8251void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8252{
8253 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8254 location, count, transpose, value);
8255
8256 try
8257 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008258 if (count < 0)
8259 {
8260 return gl::error(GL_INVALID_VALUE);
8261 }
8262
8263 if (location == -1)
8264 {
8265 return;
8266 }
8267
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008268 gl::Context *context = gl::getNonLostContext();
8269
8270 if (context)
8271 {
8272 if (context->getClientVersion() < 3)
8273 {
8274 return gl::error(GL_INVALID_OPERATION);
8275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008276
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008277 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8278 if (!programBinary)
8279 {
8280 return gl::error(GL_INVALID_OPERATION);
8281 }
8282
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008283 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008284 {
8285 return gl::error(GL_INVALID_OPERATION);
8286 }
8287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008288 }
8289 catch(std::bad_alloc&)
8290 {
8291 return gl::error(GL_OUT_OF_MEMORY);
8292 }
8293}
8294
8295void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8296{
8297 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8298 location, count, transpose, value);
8299
8300 try
8301 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008302 if (count < 0)
8303 {
8304 return gl::error(GL_INVALID_VALUE);
8305 }
8306
8307 if (location == -1)
8308 {
8309 return;
8310 }
8311
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008312 gl::Context *context = gl::getNonLostContext();
8313
8314 if (context)
8315 {
8316 if (context->getClientVersion() < 3)
8317 {
8318 return gl::error(GL_INVALID_OPERATION);
8319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008320
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008321 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8322 if (!programBinary)
8323 {
8324 return gl::error(GL_INVALID_OPERATION);
8325 }
8326
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008327 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008328 {
8329 return gl::error(GL_INVALID_OPERATION);
8330 }
8331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008332 }
8333 catch(std::bad_alloc&)
8334 {
8335 return gl::error(GL_OUT_OF_MEMORY);
8336 }
8337}
8338
8339void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8340{
8341 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8342 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8343 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8344
8345 try
8346 {
8347 gl::Context *context = gl::getNonLostContext();
8348
8349 if (context)
8350 {
8351 if (context->getClientVersion() < 3)
8352 {
8353 return gl::error(GL_INVALID_OPERATION);
8354 }
8355 }
8356
8357 UNIMPLEMENTED();
8358 }
8359 catch(std::bad_alloc&)
8360 {
8361 return gl::error(GL_OUT_OF_MEMORY);
8362 }
8363}
8364
8365void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8366{
8367 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8368 target, samples, internalformat, width, height);
8369
8370 try
8371 {
8372 gl::Context *context = gl::getNonLostContext();
8373
8374 if (context)
8375 {
8376 if (context->getClientVersion() < 3)
8377 {
8378 return gl::error(GL_INVALID_OPERATION);
8379 }
8380 }
8381
8382 UNIMPLEMENTED();
8383 }
8384 catch(std::bad_alloc&)
8385 {
8386 return gl::error(GL_OUT_OF_MEMORY);
8387 }
8388}
8389
8390void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8391{
8392 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8393 target, attachment, texture, level, layer);
8394
8395 try
8396 {
8397 gl::Context *context = gl::getNonLostContext();
8398
8399 if (context)
8400 {
8401 if (context->getClientVersion() < 3)
8402 {
8403 return gl::error(GL_INVALID_OPERATION);
8404 }
8405 }
8406
8407 UNIMPLEMENTED();
8408 }
8409 catch(std::bad_alloc&)
8410 {
8411 return gl::error(GL_OUT_OF_MEMORY);
8412 }
8413}
8414
8415GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8416{
8417 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8418 target, offset, length, access);
8419
8420 try
8421 {
8422 gl::Context *context = gl::getNonLostContext();
8423
8424 if (context)
8425 {
8426 if (context->getClientVersion() < 3)
8427 {
8428 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8429 }
8430 }
8431
8432 UNIMPLEMENTED();
8433 }
8434 catch(std::bad_alloc&)
8435 {
8436 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8437 }
8438
8439 return NULL;
8440}
8441
8442void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8443{
8444 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8445
8446 try
8447 {
8448 gl::Context *context = gl::getNonLostContext();
8449
8450 if (context)
8451 {
8452 if (context->getClientVersion() < 3)
8453 {
8454 return gl::error(GL_INVALID_OPERATION);
8455 }
8456 }
8457
8458 UNIMPLEMENTED();
8459 }
8460 catch(std::bad_alloc&)
8461 {
8462 return gl::error(GL_OUT_OF_MEMORY);
8463 }
8464}
8465
8466void __stdcall glBindVertexArray(GLuint array)
8467{
8468 EVENT("(GLuint array = %u)", array);
8469
8470 try
8471 {
8472 gl::Context *context = gl::getNonLostContext();
8473
8474 if (context)
8475 {
8476 if (context->getClientVersion() < 3)
8477 {
8478 return gl::error(GL_INVALID_OPERATION);
8479 }
8480 }
8481
8482 UNIMPLEMENTED();
8483 }
8484 catch(std::bad_alloc&)
8485 {
8486 return gl::error(GL_OUT_OF_MEMORY);
8487 }
8488}
8489
8490void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8491{
8492 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8493
8494 try
8495 {
8496 gl::Context *context = gl::getNonLostContext();
8497
8498 if (context)
8499 {
8500 if (context->getClientVersion() < 3)
8501 {
8502 return gl::error(GL_INVALID_OPERATION);
8503 }
8504 }
8505
8506 UNIMPLEMENTED();
8507 }
8508 catch(std::bad_alloc&)
8509 {
8510 return gl::error(GL_OUT_OF_MEMORY);
8511 }
8512}
8513
8514void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8515{
8516 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8517
8518 try
8519 {
8520 gl::Context *context = gl::getNonLostContext();
8521
8522 if (context)
8523 {
8524 if (context->getClientVersion() < 3)
8525 {
8526 return gl::error(GL_INVALID_OPERATION);
8527 }
8528 }
8529
8530 UNIMPLEMENTED();
8531 }
8532 catch(std::bad_alloc&)
8533 {
8534 return gl::error(GL_OUT_OF_MEMORY);
8535 }
8536}
8537
8538GLboolean __stdcall glIsVertexArray(GLuint array)
8539{
8540 EVENT("(GLuint array = %u)", array);
8541
8542 try
8543 {
8544 gl::Context *context = gl::getNonLostContext();
8545
8546 if (context)
8547 {
8548 if (context->getClientVersion() < 3)
8549 {
8550 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8551 }
8552 }
8553
8554 UNIMPLEMENTED();
8555 }
8556 catch(std::bad_alloc&)
8557 {
8558 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8559 }
8560
8561 return GL_FALSE;
8562}
8563
8564void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8565{
8566 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8567 target, index, data);
8568
8569 try
8570 {
8571 gl::Context *context = gl::getNonLostContext();
8572
8573 if (context)
8574 {
8575 if (context->getClientVersion() < 3)
8576 {
8577 return gl::error(GL_INVALID_OPERATION);
8578 }
8579 }
8580
8581 UNIMPLEMENTED();
8582 }
8583 catch(std::bad_alloc&)
8584 {
8585 return gl::error(GL_OUT_OF_MEMORY);
8586 }
8587}
8588
8589void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8590{
8591 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8592
8593 try
8594 {
8595 gl::Context *context = gl::getNonLostContext();
8596
8597 if (context)
8598 {
8599 if (context->getClientVersion() < 3)
8600 {
8601 return gl::error(GL_INVALID_OPERATION);
8602 }
8603 }
8604
8605 UNIMPLEMENTED();
8606 }
8607 catch(std::bad_alloc&)
8608 {
8609 return gl::error(GL_OUT_OF_MEMORY);
8610 }
8611}
8612
8613void __stdcall glEndTransformFeedback(void)
8614{
8615 EVENT("(void)");
8616
8617 try
8618 {
8619 gl::Context *context = gl::getNonLostContext();
8620
8621 if (context)
8622 {
8623 if (context->getClientVersion() < 3)
8624 {
8625 return gl::error(GL_INVALID_OPERATION);
8626 }
8627 }
8628
8629 UNIMPLEMENTED();
8630 }
8631 catch(std::bad_alloc&)
8632 {
8633 return gl::error(GL_OUT_OF_MEMORY);
8634 }
8635}
8636
8637void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8638{
8639 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8640 target, index, buffer, offset, size);
8641
8642 try
8643 {
8644 gl::Context *context = gl::getNonLostContext();
8645
8646 if (context)
8647 {
8648 if (context->getClientVersion() < 3)
8649 {
8650 return gl::error(GL_INVALID_OPERATION);
8651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008652
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008653 switch (target)
8654 {
8655 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008656 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008657 {
8658 return gl::error(GL_INVALID_VALUE);
8659 }
8660 break;
8661
8662 case GL_UNIFORM_BUFFER:
8663 if (index >= context->getMaximumCombinedUniformBufferBindings())
8664 {
8665 return gl::error(GL_INVALID_VALUE);
8666 }
8667 break;
8668
8669 default:
8670 return gl::error(GL_INVALID_ENUM);
8671 }
8672
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008673 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008674 {
8675 return gl::error(GL_INVALID_VALUE);
8676 }
8677
8678 switch (target)
8679 {
8680 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008681
8682 // size and offset must be a multiple of 4
8683 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8684 {
8685 return gl::error(GL_INVALID_VALUE);
8686 }
8687
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008688 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8689 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008690 break;
8691
8692 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008693
8694 // it is an error to bind an offset not a multiple of the alignment
8695 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8696 {
8697 return gl::error(GL_INVALID_VALUE);
8698 }
8699
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008700 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8701 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008702 break;
8703
8704 default:
8705 UNREACHABLE();
8706 }
8707 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008708 }
8709 catch(std::bad_alloc&)
8710 {
8711 return gl::error(GL_OUT_OF_MEMORY);
8712 }
8713}
8714
8715void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8716{
8717 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8718 target, index, buffer);
8719
8720 try
8721 {
8722 gl::Context *context = gl::getNonLostContext();
8723
8724 if (context)
8725 {
8726 if (context->getClientVersion() < 3)
8727 {
8728 return gl::error(GL_INVALID_OPERATION);
8729 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008730
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008731 switch (target)
8732 {
8733 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008734 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008735 {
8736 return gl::error(GL_INVALID_VALUE);
8737 }
8738 break;
8739
8740 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008741 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008742 {
8743 return gl::error(GL_INVALID_VALUE);
8744 }
8745 break;
8746
8747 default:
8748 return gl::error(GL_INVALID_ENUM);
8749 }
8750
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008751 switch (target)
8752 {
8753 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008754 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008755 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008756 break;
8757
8758 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008759 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008760 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008761 break;
8762
8763 default:
8764 UNREACHABLE();
8765 }
8766 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008767 }
8768 catch(std::bad_alloc&)
8769 {
8770 return gl::error(GL_OUT_OF_MEMORY);
8771 }
8772}
8773
8774void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8775{
8776 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8777 program, count, varyings, bufferMode);
8778
8779 try
8780 {
8781 gl::Context *context = gl::getNonLostContext();
8782
8783 if (context)
8784 {
8785 if (context->getClientVersion() < 3)
8786 {
8787 return gl::error(GL_INVALID_OPERATION);
8788 }
8789 }
8790
8791 UNIMPLEMENTED();
8792 }
8793 catch(std::bad_alloc&)
8794 {
8795 return gl::error(GL_OUT_OF_MEMORY);
8796 }
8797}
8798
8799void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8800{
8801 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8802 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8803 program, index, bufSize, length, size, type, name);
8804
8805 try
8806 {
8807 gl::Context *context = gl::getNonLostContext();
8808
8809 if (context)
8810 {
8811 if (context->getClientVersion() < 3)
8812 {
8813 return gl::error(GL_INVALID_OPERATION);
8814 }
8815 }
8816
8817 UNIMPLEMENTED();
8818 }
8819 catch(std::bad_alloc&)
8820 {
8821 return gl::error(GL_OUT_OF_MEMORY);
8822 }
8823}
8824
8825void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8826{
8827 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8828 index, size, type, stride, pointer);
8829
8830 try
8831 {
8832 gl::Context *context = gl::getNonLostContext();
8833
8834 if (context)
8835 {
8836 if (context->getClientVersion() < 3)
8837 {
8838 return gl::error(GL_INVALID_OPERATION);
8839 }
8840 }
8841
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008842 if (index >= gl::MAX_VERTEX_ATTRIBS)
8843 {
8844 return gl::error(GL_INVALID_VALUE);
8845 }
8846
8847 if (size < 1 || size > 4)
8848 {
8849 return gl::error(GL_INVALID_VALUE);
8850 }
8851
8852 switch (type)
8853 {
8854 case GL_BYTE:
8855 case GL_UNSIGNED_BYTE:
8856 case GL_SHORT:
8857 case GL_UNSIGNED_SHORT:
8858 case GL_INT:
8859 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008860 case GL_INT_2_10_10_10_REV:
8861 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008862 break;
8863 default:
8864 return gl::error(GL_INVALID_ENUM);
8865 }
8866
8867 if (stride < 0)
8868 {
8869 return gl::error(GL_INVALID_VALUE);
8870 }
8871
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008872 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8873 {
8874 return gl::error(GL_INVALID_OPERATION);
8875 }
8876
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008877 if (context)
8878 {
8879 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8880 stride, pointer);
8881 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008882 }
8883 catch(std::bad_alloc&)
8884 {
8885 return gl::error(GL_OUT_OF_MEMORY);
8886 }
8887}
8888
8889void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8890{
8891 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8892 index, pname, params);
8893
8894 try
8895 {
8896 gl::Context *context = gl::getNonLostContext();
8897
8898 if (context)
8899 {
8900 if (context->getClientVersion() < 3)
8901 {
8902 return gl::error(GL_INVALID_OPERATION);
8903 }
8904 }
8905
8906 UNIMPLEMENTED();
8907 }
8908 catch(std::bad_alloc&)
8909 {
8910 return gl::error(GL_OUT_OF_MEMORY);
8911 }
8912}
8913
8914void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8915{
8916 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8917 index, pname, params);
8918
8919 try
8920 {
8921 gl::Context *context = gl::getNonLostContext();
8922
8923 if (context)
8924 {
8925 if (context->getClientVersion() < 3)
8926 {
8927 return gl::error(GL_INVALID_OPERATION);
8928 }
8929 }
8930
8931 UNIMPLEMENTED();
8932 }
8933 catch(std::bad_alloc&)
8934 {
8935 return gl::error(GL_OUT_OF_MEMORY);
8936 }
8937}
8938
8939void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8940{
8941 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8942 index, x, y, z, w);
8943
8944 try
8945 {
8946 gl::Context *context = gl::getNonLostContext();
8947
8948 if (context)
8949 {
8950 if (context->getClientVersion() < 3)
8951 {
8952 return gl::error(GL_INVALID_OPERATION);
8953 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008954
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008955 if (index >= gl::MAX_VERTEX_ATTRIBS)
8956 {
8957 return gl::error(GL_INVALID_VALUE);
8958 }
8959
8960 GLint vals[4] = { x, y, z, w };
8961 context->setVertexAttribi(index, vals);
8962 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008963 }
8964 catch(std::bad_alloc&)
8965 {
8966 return gl::error(GL_OUT_OF_MEMORY);
8967 }
8968}
8969
8970void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8971{
8972 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8973 index, x, y, z, w);
8974
8975 try
8976 {
8977 gl::Context *context = gl::getNonLostContext();
8978
8979 if (context)
8980 {
8981 if (context->getClientVersion() < 3)
8982 {
8983 return gl::error(GL_INVALID_OPERATION);
8984 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008985
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008986 if (index >= gl::MAX_VERTEX_ATTRIBS)
8987 {
8988 return gl::error(GL_INVALID_VALUE);
8989 }
8990
8991 GLuint vals[4] = { x, y, z, w };
8992 context->setVertexAttribu(index, vals);
8993 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008994 }
8995 catch(std::bad_alloc&)
8996 {
8997 return gl::error(GL_OUT_OF_MEMORY);
8998 }
8999}
9000
9001void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9002{
9003 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9004
9005 try
9006 {
9007 gl::Context *context = gl::getNonLostContext();
9008
9009 if (context)
9010 {
9011 if (context->getClientVersion() < 3)
9012 {
9013 return gl::error(GL_INVALID_OPERATION);
9014 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009015
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009016 if (index >= gl::MAX_VERTEX_ATTRIBS)
9017 {
9018 return gl::error(GL_INVALID_VALUE);
9019 }
9020
9021 context->setVertexAttribi(index, v);
9022 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009023 }
9024 catch(std::bad_alloc&)
9025 {
9026 return gl::error(GL_OUT_OF_MEMORY);
9027 }
9028}
9029
9030void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9031{
9032 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9033
9034 try
9035 {
9036 gl::Context *context = gl::getNonLostContext();
9037
9038 if (context)
9039 {
9040 if (context->getClientVersion() < 3)
9041 {
9042 return gl::error(GL_INVALID_OPERATION);
9043 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009044
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009045 if (index >= gl::MAX_VERTEX_ATTRIBS)
9046 {
9047 return gl::error(GL_INVALID_VALUE);
9048 }
9049
9050 context->setVertexAttribu(index, v);
9051 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009052 }
9053 catch(std::bad_alloc&)
9054 {
9055 return gl::error(GL_OUT_OF_MEMORY);
9056 }
9057}
9058
9059void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9060{
9061 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9062 program, location, params);
9063
9064 try
9065 {
9066 gl::Context *context = gl::getNonLostContext();
9067
9068 if (context)
9069 {
9070 if (context->getClientVersion() < 3)
9071 {
9072 return gl::error(GL_INVALID_OPERATION);
9073 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009074
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009075 if (program == 0)
9076 {
9077 return gl::error(GL_INVALID_VALUE);
9078 }
9079
9080 gl::Program *programObject = context->getProgram(program);
9081
9082 if (!programObject || !programObject->isLinked())
9083 {
9084 return gl::error(GL_INVALID_OPERATION);
9085 }
9086
9087 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9088 if (!programBinary)
9089 {
9090 return gl::error(GL_INVALID_OPERATION);
9091 }
9092
9093 if (!programBinary->getUniformuiv(location, NULL, params))
9094 {
9095 return gl::error(GL_INVALID_OPERATION);
9096 }
9097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009098 }
9099 catch(std::bad_alloc&)
9100 {
9101 return gl::error(GL_OUT_OF_MEMORY);
9102 }
9103}
9104
9105GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9106{
9107 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9108 program, name);
9109
9110 try
9111 {
9112 gl::Context *context = gl::getNonLostContext();
9113
9114 if (context)
9115 {
9116 if (context->getClientVersion() < 3)
9117 {
9118 return gl::error(GL_INVALID_OPERATION, 0);
9119 }
9120 }
9121
9122 UNIMPLEMENTED();
9123 }
9124 catch(std::bad_alloc&)
9125 {
9126 return gl::error(GL_OUT_OF_MEMORY, 0);
9127 }
9128
9129 return 0;
9130}
9131
9132void __stdcall glUniform1ui(GLint location, GLuint v0)
9133{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009134 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009135}
9136
9137void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9138{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009139 const GLuint xy[] = { v0, v1 };
9140 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009141}
9142
9143void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9144{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009145 const GLuint xyz[] = { v0, v1, v2 };
9146 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009147}
9148
9149void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9150{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009151 const GLuint xyzw[] = { v0, v1, v2, v3 };
9152 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009153}
9154
9155void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9156{
9157 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9158 location, count, value);
9159
9160 try
9161 {
9162 gl::Context *context = gl::getNonLostContext();
9163
9164 if (context)
9165 {
9166 if (context->getClientVersion() < 3)
9167 {
9168 return gl::error(GL_INVALID_OPERATION);
9169 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009170
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009171 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9172 if (!programBinary)
9173 {
9174 return gl::error(GL_INVALID_OPERATION);
9175 }
9176
9177 if (!programBinary->setUniform1uiv(location, count, value))
9178 {
9179 return gl::error(GL_INVALID_OPERATION);
9180 }
9181 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009182 }
9183 catch(std::bad_alloc&)
9184 {
9185 return gl::error(GL_OUT_OF_MEMORY);
9186 }
9187}
9188
9189void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9190{
9191 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9192 location, count, value);
9193
9194 try
9195 {
9196 gl::Context *context = gl::getNonLostContext();
9197
9198 if (context)
9199 {
9200 if (context->getClientVersion() < 3)
9201 {
9202 return gl::error(GL_INVALID_OPERATION);
9203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009204
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009205 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9206 if (!programBinary)
9207 {
9208 return gl::error(GL_INVALID_OPERATION);
9209 }
9210
9211 if (!programBinary->setUniform2uiv(location, count, value))
9212 {
9213 return gl::error(GL_INVALID_OPERATION);
9214 }
9215 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009216 }
9217 catch(std::bad_alloc&)
9218 {
9219 return gl::error(GL_OUT_OF_MEMORY);
9220 }
9221}
9222
9223void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9224{
9225 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9226 location, count, value);
9227
9228 try
9229 {
9230 gl::Context *context = gl::getNonLostContext();
9231
9232 if (context)
9233 {
9234 if (context->getClientVersion() < 3)
9235 {
9236 return gl::error(GL_INVALID_OPERATION);
9237 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009238
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009239 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9240 if (!programBinary)
9241 {
9242 return gl::error(GL_INVALID_OPERATION);
9243 }
9244
9245 if (!programBinary->setUniform3uiv(location, count, value))
9246 {
9247 return gl::error(GL_INVALID_OPERATION);
9248 }
9249 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009250 }
9251 catch(std::bad_alloc&)
9252 {
9253 return gl::error(GL_OUT_OF_MEMORY);
9254 }
9255}
9256
9257void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9258{
9259 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9260 location, count, value);
9261
9262 try
9263 {
9264 gl::Context *context = gl::getNonLostContext();
9265
9266 if (context)
9267 {
9268 if (context->getClientVersion() < 3)
9269 {
9270 return gl::error(GL_INVALID_OPERATION);
9271 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009272
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009273 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9274 if (!programBinary)
9275 {
9276 return gl::error(GL_INVALID_OPERATION);
9277 }
9278
9279 if (!programBinary->setUniform4uiv(location, count, value))
9280 {
9281 return gl::error(GL_INVALID_OPERATION);
9282 }
9283 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009284 }
9285 catch(std::bad_alloc&)
9286 {
9287 return gl::error(GL_OUT_OF_MEMORY);
9288 }
9289}
9290
9291void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9292{
9293 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9294 buffer, drawbuffer, value);
9295
9296 try
9297 {
9298 gl::Context *context = gl::getNonLostContext();
9299
9300 if (context)
9301 {
9302 if (context->getClientVersion() < 3)
9303 {
9304 return gl::error(GL_INVALID_OPERATION);
9305 }
9306 }
9307
9308 UNIMPLEMENTED();
9309 }
9310 catch(std::bad_alloc&)
9311 {
9312 return gl::error(GL_OUT_OF_MEMORY);
9313 }
9314}
9315
9316void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9317{
9318 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9319 buffer, drawbuffer, value);
9320
9321 try
9322 {
9323 gl::Context *context = gl::getNonLostContext();
9324
9325 if (context)
9326 {
9327 if (context->getClientVersion() < 3)
9328 {
9329 return gl::error(GL_INVALID_OPERATION);
9330 }
9331 }
9332
9333 UNIMPLEMENTED();
9334 }
9335 catch(std::bad_alloc&)
9336 {
9337 return gl::error(GL_OUT_OF_MEMORY);
9338 }
9339}
9340
9341void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9342{
9343 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9344 buffer, drawbuffer, value);
9345
9346 try
9347 {
9348 gl::Context *context = gl::getNonLostContext();
9349
9350 if (context)
9351 {
9352 if (context->getClientVersion() < 3)
9353 {
9354 return gl::error(GL_INVALID_OPERATION);
9355 }
9356 }
9357
9358 UNIMPLEMENTED();
9359 }
9360 catch(std::bad_alloc&)
9361 {
9362 return gl::error(GL_OUT_OF_MEMORY);
9363 }
9364}
9365
9366void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9367{
9368 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9369 buffer, drawbuffer, depth, stencil);
9370
9371 try
9372 {
9373 gl::Context *context = gl::getNonLostContext();
9374
9375 if (context)
9376 {
9377 if (context->getClientVersion() < 3)
9378 {
9379 return gl::error(GL_INVALID_OPERATION);
9380 }
9381 }
9382
9383 UNIMPLEMENTED();
9384 }
9385 catch(std::bad_alloc&)
9386 {
9387 return gl::error(GL_OUT_OF_MEMORY);
9388 }
9389}
9390
9391const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9392{
9393 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9394
9395 try
9396 {
9397 gl::Context *context = gl::getNonLostContext();
9398
9399 if (context)
9400 {
9401 if (context->getClientVersion() < 3)
9402 {
9403 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9404 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009405
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009406 if (name != GL_EXTENSIONS)
9407 {
9408 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9409 }
9410
9411 if (index >= context->getNumExtensions())
9412 {
9413 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9414 }
9415
9416 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9417 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009418 }
9419 catch(std::bad_alloc&)
9420 {
9421 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9422 }
9423
9424 return NULL;
9425}
9426
9427void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9428{
9429 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9430 readTarget, writeTarget, readOffset, writeOffset, size);
9431
9432 try
9433 {
9434 gl::Context *context = gl::getNonLostContext();
9435
9436 if (context)
9437 {
9438 if (context->getClientVersion() < 3)
9439 {
9440 return gl::error(GL_INVALID_OPERATION);
9441 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009442
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009443 gl::Buffer *readBuffer = NULL;
9444 switch (readTarget)
9445 {
9446 case GL_ARRAY_BUFFER:
9447 readBuffer = context->getArrayBuffer();
9448 break;
9449 case GL_COPY_READ_BUFFER:
9450 readBuffer = context->getCopyReadBuffer();
9451 break;
9452 case GL_COPY_WRITE_BUFFER:
9453 readBuffer = context->getCopyWriteBuffer();
9454 break;
9455 case GL_ELEMENT_ARRAY_BUFFER:
9456 readBuffer = context->getElementArrayBuffer();
9457 break;
9458 case GL_PIXEL_PACK_BUFFER:
9459 readBuffer = context->getPixelPackBuffer();
9460 break;
9461 case GL_PIXEL_UNPACK_BUFFER:
9462 readBuffer = context->getPixelUnpackBuffer();
9463 break;
9464 case GL_TRANSFORM_FEEDBACK_BUFFER:
9465 readBuffer = context->getGenericTransformFeedbackBuffer();
9466 break;
9467 case GL_UNIFORM_BUFFER:
9468 readBuffer = context->getGenericUniformBuffer();
9469 break;
9470 default:
9471 return gl::error(GL_INVALID_ENUM);
9472 }
9473
9474 gl::Buffer *writeBuffer = NULL;
9475 switch (writeTarget)
9476 {
9477 case GL_ARRAY_BUFFER:
9478 writeBuffer = context->getArrayBuffer();
9479 break;
9480 case GL_COPY_READ_BUFFER:
9481 writeBuffer = context->getCopyReadBuffer();
9482 break;
9483 case GL_COPY_WRITE_BUFFER:
9484 writeBuffer = context->getCopyWriteBuffer();
9485 break;
9486 case GL_ELEMENT_ARRAY_BUFFER:
9487 writeBuffer = context->getElementArrayBuffer();
9488 break;
9489 case GL_PIXEL_PACK_BUFFER:
9490 writeBuffer = context->getPixelPackBuffer();
9491 break;
9492 case GL_PIXEL_UNPACK_BUFFER:
9493 writeBuffer = context->getPixelUnpackBuffer();
9494 break;
9495 case GL_TRANSFORM_FEEDBACK_BUFFER:
9496 writeBuffer = context->getGenericTransformFeedbackBuffer();
9497 break;
9498 case GL_UNIFORM_BUFFER:
9499 writeBuffer = context->getGenericUniformBuffer();
9500 break;
9501 default:
9502 return gl::error(GL_INVALID_ENUM);
9503 }
9504
9505 if (!readBuffer || !writeBuffer)
9506 {
9507 return gl::error(GL_INVALID_OPERATION);
9508 }
9509
9510 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9511 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9512 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9513 {
9514 return gl::error(GL_INVALID_VALUE);
9515 }
9516
9517 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9518 {
9519 return gl::error(GL_INVALID_VALUE);
9520 }
9521
9522 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9523
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009524 // if size is zero, the copy is a successful no-op
9525 if (size > 0)
9526 {
9527 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9528 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009529 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009530 }
9531 catch(std::bad_alloc&)
9532 {
9533 return gl::error(GL_OUT_OF_MEMORY);
9534 }
9535}
9536
9537void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9538{
9539 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9540 program, uniformCount, uniformNames, uniformIndices);
9541
9542 try
9543 {
9544 gl::Context *context = gl::getNonLostContext();
9545
9546 if (context)
9547 {
9548 if (context->getClientVersion() < 3)
9549 {
9550 return gl::error(GL_INVALID_OPERATION);
9551 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009552
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009553 if (uniformCount < 0)
9554 {
9555 return gl::error(GL_INVALID_VALUE);
9556 }
9557
9558 gl::Program *programObject = context->getProgram(program);
9559
9560 if (!programObject)
9561 {
9562 if (context->getShader(program))
9563 {
9564 return gl::error(GL_INVALID_OPERATION);
9565 }
9566 else
9567 {
9568 return gl::error(GL_INVALID_VALUE);
9569 }
9570 }
9571
9572 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9573 if (!programObject->isLinked() || !programBinary)
9574 {
9575 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9576 {
9577 uniformIndices[uniformId] = GL_INVALID_INDEX;
9578 }
9579 }
9580 else
9581 {
9582 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9583 {
9584 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9585 }
9586 }
9587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009588 }
9589 catch(std::bad_alloc&)
9590 {
9591 return gl::error(GL_OUT_OF_MEMORY);
9592 }
9593}
9594
9595void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9596{
9597 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9598 program, uniformCount, uniformIndices, pname, params);
9599
9600 try
9601 {
9602 gl::Context *context = gl::getNonLostContext();
9603
9604 if (context)
9605 {
9606 if (context->getClientVersion() < 3)
9607 {
9608 return gl::error(GL_INVALID_OPERATION);
9609 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009610
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009611 if (uniformCount < 0)
9612 {
9613 return gl::error(GL_INVALID_VALUE);
9614 }
9615
9616 gl::Program *programObject = context->getProgram(program);
9617
9618 if (!programObject)
9619 {
9620 if (context->getShader(program))
9621 {
9622 return gl::error(GL_INVALID_OPERATION);
9623 }
9624 else
9625 {
9626 return gl::error(GL_INVALID_VALUE);
9627 }
9628 }
9629
9630 switch (pname)
9631 {
9632 case GL_UNIFORM_TYPE:
9633 case GL_UNIFORM_SIZE:
9634 case GL_UNIFORM_NAME_LENGTH:
9635 case GL_UNIFORM_BLOCK_INDEX:
9636 case GL_UNIFORM_OFFSET:
9637 case GL_UNIFORM_ARRAY_STRIDE:
9638 case GL_UNIFORM_MATRIX_STRIDE:
9639 case GL_UNIFORM_IS_ROW_MAJOR:
9640 break;
9641 default:
9642 return gl::error(GL_INVALID_ENUM);
9643 }
9644
9645 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9646
9647 if (!programBinary && uniformCount > 0)
9648 {
9649 return gl::error(GL_INVALID_VALUE);
9650 }
9651
9652 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9653 {
9654 const GLuint index = uniformIndices[uniformId];
9655
9656 if (index >= (GLuint)programBinary->getActiveUniformCount())
9657 {
9658 return gl::error(GL_INVALID_VALUE);
9659 }
9660 }
9661
9662 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9663 {
9664 const GLuint index = uniformIndices[uniformId];
9665 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9666 }
9667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009668 }
9669 catch(std::bad_alloc&)
9670 {
9671 return gl::error(GL_OUT_OF_MEMORY);
9672 }
9673}
9674
9675GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9676{
9677 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9678
9679 try
9680 {
9681 gl::Context *context = gl::getNonLostContext();
9682
9683 if (context)
9684 {
9685 if (context->getClientVersion() < 3)
9686 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009687 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009689
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009690 gl::Program *programObject = context->getProgram(program);
9691
9692 if (!programObject)
9693 {
9694 if (context->getShader(program))
9695 {
9696 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9697 }
9698 else
9699 {
9700 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9701 }
9702 }
9703
9704 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9705 if (!programBinary)
9706 {
9707 return GL_INVALID_INDEX;
9708 }
9709
9710 return programBinary->getUniformBlockIndex(uniformBlockName);
9711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009712 }
9713 catch(std::bad_alloc&)
9714 {
9715 return gl::error(GL_OUT_OF_MEMORY, 0);
9716 }
9717
9718 return 0;
9719}
9720
9721void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9722{
9723 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9724 program, uniformBlockIndex, pname, params);
9725
9726 try
9727 {
9728 gl::Context *context = gl::getNonLostContext();
9729
9730 if (context)
9731 {
9732 if (context->getClientVersion() < 3)
9733 {
9734 return gl::error(GL_INVALID_OPERATION);
9735 }
9736 }
9737
9738 UNIMPLEMENTED();
9739 }
9740 catch(std::bad_alloc&)
9741 {
9742 return gl::error(GL_OUT_OF_MEMORY);
9743 }
9744}
9745
9746void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9747{
9748 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9749 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9750
9751 try
9752 {
9753 gl::Context *context = gl::getNonLostContext();
9754
9755 if (context)
9756 {
9757 if (context->getClientVersion() < 3)
9758 {
9759 return gl::error(GL_INVALID_OPERATION);
9760 }
9761 }
9762
9763 UNIMPLEMENTED();
9764 }
9765 catch(std::bad_alloc&)
9766 {
9767 return gl::error(GL_OUT_OF_MEMORY);
9768 }
9769}
9770
9771void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9772{
9773 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9774 program, uniformBlockIndex, uniformBlockBinding);
9775
9776 try
9777 {
9778 gl::Context *context = gl::getNonLostContext();
9779
9780 if (context)
9781 {
9782 if (context->getClientVersion() < 3)
9783 {
9784 return gl::error(GL_INVALID_OPERATION);
9785 }
9786 }
9787
9788 UNIMPLEMENTED();
9789 }
9790 catch(std::bad_alloc&)
9791 {
9792 return gl::error(GL_OUT_OF_MEMORY);
9793 }
9794}
9795
9796void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9797{
9798 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9799 mode, first, count, instanceCount);
9800
9801 try
9802 {
9803 gl::Context *context = gl::getNonLostContext();
9804
9805 if (context)
9806 {
9807 if (context->getClientVersion() < 3)
9808 {
9809 return gl::error(GL_INVALID_OPERATION);
9810 }
9811 }
9812
9813 UNIMPLEMENTED();
9814 }
9815 catch(std::bad_alloc&)
9816 {
9817 return gl::error(GL_OUT_OF_MEMORY);
9818 }
9819}
9820
9821void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9822{
9823 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9824 mode, count, type, indices, instanceCount);
9825
9826 try
9827 {
9828 gl::Context *context = gl::getNonLostContext();
9829
9830 if (context)
9831 {
9832 if (context->getClientVersion() < 3)
9833 {
9834 return gl::error(GL_INVALID_OPERATION);
9835 }
9836 }
9837
9838 UNIMPLEMENTED();
9839 }
9840 catch(std::bad_alloc&)
9841 {
9842 return gl::error(GL_OUT_OF_MEMORY);
9843 }
9844}
9845
9846GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9847{
9848 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9849
9850 try
9851 {
9852 gl::Context *context = gl::getNonLostContext();
9853
9854 if (context)
9855 {
9856 if (context->getClientVersion() < 3)
9857 {
9858 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9859 }
9860 }
9861
9862 UNIMPLEMENTED();
9863 }
9864 catch(std::bad_alloc&)
9865 {
9866 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9867 }
9868
9869 return NULL;
9870}
9871
9872GLboolean __stdcall glIsSync(GLsync sync)
9873{
9874 EVENT("(GLsync sync = 0x%0.8p)", sync);
9875
9876 try
9877 {
9878 gl::Context *context = gl::getNonLostContext();
9879
9880 if (context)
9881 {
9882 if (context->getClientVersion() < 3)
9883 {
9884 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9885 }
9886 }
9887
9888 UNIMPLEMENTED();
9889 }
9890 catch(std::bad_alloc&)
9891 {
9892 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9893 }
9894
9895 return GL_FALSE;
9896}
9897
9898void __stdcall glDeleteSync(GLsync sync)
9899{
9900 EVENT("(GLsync sync = 0x%0.8p)", sync);
9901
9902 try
9903 {
9904 gl::Context *context = gl::getNonLostContext();
9905
9906 if (context)
9907 {
9908 if (context->getClientVersion() < 3)
9909 {
9910 return gl::error(GL_INVALID_OPERATION);
9911 }
9912 }
9913
9914 UNIMPLEMENTED();
9915 }
9916 catch(std::bad_alloc&)
9917 {
9918 return gl::error(GL_OUT_OF_MEMORY);
9919 }
9920}
9921
9922GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9923{
9924 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9925 sync, flags, timeout);
9926
9927 try
9928 {
9929 gl::Context *context = gl::getNonLostContext();
9930
9931 if (context)
9932 {
9933 if (context->getClientVersion() < 3)
9934 {
9935 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9936 }
9937 }
9938
9939 UNIMPLEMENTED();
9940 }
9941 catch(std::bad_alloc&)
9942 {
9943 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9944 }
9945
9946 return GL_FALSE;
9947}
9948
9949void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9950{
9951 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9952 sync, flags, timeout);
9953
9954 try
9955 {
9956 gl::Context *context = gl::getNonLostContext();
9957
9958 if (context)
9959 {
9960 if (context->getClientVersion() < 3)
9961 {
9962 return gl::error(GL_INVALID_OPERATION);
9963 }
9964 }
9965
9966 UNIMPLEMENTED();
9967 }
9968 catch(std::bad_alloc&)
9969 {
9970 return gl::error(GL_OUT_OF_MEMORY);
9971 }
9972}
9973
9974void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9975{
9976 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9977 pname, params);
9978
9979 try
9980 {
9981 gl::Context *context = gl::getNonLostContext();
9982
9983 if (context)
9984 {
9985 if (context->getClientVersion() < 3)
9986 {
9987 return gl::error(GL_INVALID_OPERATION);
9988 }
9989 }
9990
9991 UNIMPLEMENTED();
9992 }
9993 catch(std::bad_alloc&)
9994 {
9995 return gl::error(GL_OUT_OF_MEMORY);
9996 }
9997}
9998
9999void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10000{
10001 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10002 sync, pname, bufSize, length, values);
10003
10004 try
10005 {
10006 gl::Context *context = gl::getNonLostContext();
10007
10008 if (context)
10009 {
10010 if (context->getClientVersion() < 3)
10011 {
10012 return gl::error(GL_INVALID_OPERATION);
10013 }
10014 }
10015
10016 UNIMPLEMENTED();
10017 }
10018 catch(std::bad_alloc&)
10019 {
10020 return gl::error(GL_OUT_OF_MEMORY);
10021 }
10022}
10023
10024void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10025{
10026 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10027 target, index, data);
10028
10029 try
10030 {
10031 gl::Context *context = gl::getNonLostContext();
10032
10033 if (context)
10034 {
10035 if (context->getClientVersion() < 3)
10036 {
10037 return gl::error(GL_INVALID_OPERATION);
10038 }
10039 }
10040
10041 UNIMPLEMENTED();
10042 }
10043 catch(std::bad_alloc&)
10044 {
10045 return gl::error(GL_OUT_OF_MEMORY);
10046 }
10047}
10048
10049void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10050{
10051 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10052 target, pname, params);
10053
10054 try
10055 {
10056 gl::Context *context = gl::getNonLostContext();
10057
10058 if (context)
10059 {
10060 if (context->getClientVersion() < 3)
10061 {
10062 return gl::error(GL_INVALID_OPERATION);
10063 }
10064 }
10065
10066 UNIMPLEMENTED();
10067 }
10068 catch(std::bad_alloc&)
10069 {
10070 return gl::error(GL_OUT_OF_MEMORY);
10071 }
10072}
10073
10074void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10075{
10076 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10077
10078 try
10079 {
10080 gl::Context *context = gl::getNonLostContext();
10081
10082 if (context)
10083 {
10084 if (context->getClientVersion() < 3)
10085 {
10086 return gl::error(GL_INVALID_OPERATION);
10087 }
10088 }
10089
10090 UNIMPLEMENTED();
10091 }
10092 catch(std::bad_alloc&)
10093 {
10094 return gl::error(GL_OUT_OF_MEMORY);
10095 }
10096}
10097
10098void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10099{
10100 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10101
10102 try
10103 {
10104 gl::Context *context = gl::getNonLostContext();
10105
10106 if (context)
10107 {
10108 if (context->getClientVersion() < 3)
10109 {
10110 return gl::error(GL_INVALID_OPERATION);
10111 }
10112 }
10113
10114 UNIMPLEMENTED();
10115 }
10116 catch(std::bad_alloc&)
10117 {
10118 return gl::error(GL_OUT_OF_MEMORY);
10119 }
10120}
10121
10122GLboolean __stdcall glIsSampler(GLuint sampler)
10123{
10124 EVENT("(GLuint sampler = %u)", sampler);
10125
10126 try
10127 {
10128 gl::Context *context = gl::getNonLostContext();
10129
10130 if (context)
10131 {
10132 if (context->getClientVersion() < 3)
10133 {
10134 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10135 }
10136 }
10137
10138 UNIMPLEMENTED();
10139 }
10140 catch(std::bad_alloc&)
10141 {
10142 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10143 }
10144
10145 return GL_FALSE;
10146}
10147
10148void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10149{
10150 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10151
10152 try
10153 {
10154 gl::Context *context = gl::getNonLostContext();
10155
10156 if (context)
10157 {
10158 if (context->getClientVersion() < 3)
10159 {
10160 return gl::error(GL_INVALID_OPERATION);
10161 }
10162 }
10163
10164 UNIMPLEMENTED();
10165 }
10166 catch(std::bad_alloc&)
10167 {
10168 return gl::error(GL_OUT_OF_MEMORY);
10169 }
10170}
10171
10172void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10173{
10174 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10175
10176 try
10177 {
10178 gl::Context *context = gl::getNonLostContext();
10179
10180 if (context)
10181 {
10182 if (context->getClientVersion() < 3)
10183 {
10184 return gl::error(GL_INVALID_OPERATION);
10185 }
10186 }
10187
10188 UNIMPLEMENTED();
10189 }
10190 catch(std::bad_alloc&)
10191 {
10192 return gl::error(GL_OUT_OF_MEMORY);
10193 }
10194}
10195
10196void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10197{
10198 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10199 sampler, pname, param);
10200
10201 try
10202 {
10203 gl::Context *context = gl::getNonLostContext();
10204
10205 if (context)
10206 {
10207 if (context->getClientVersion() < 3)
10208 {
10209 return gl::error(GL_INVALID_OPERATION);
10210 }
10211 }
10212
10213 UNIMPLEMENTED();
10214 }
10215 catch(std::bad_alloc&)
10216 {
10217 return gl::error(GL_OUT_OF_MEMORY);
10218 }
10219}
10220
10221void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10222{
10223 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10224
10225 try
10226 {
10227 gl::Context *context = gl::getNonLostContext();
10228
10229 if (context)
10230 {
10231 if (context->getClientVersion() < 3)
10232 {
10233 return gl::error(GL_INVALID_OPERATION);
10234 }
10235 }
10236
10237 UNIMPLEMENTED();
10238 }
10239 catch(std::bad_alloc&)
10240 {
10241 return gl::error(GL_OUT_OF_MEMORY);
10242 }
10243}
10244
10245void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10246{
10247 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10248
10249 try
10250 {
10251 gl::Context *context = gl::getNonLostContext();
10252
10253 if (context)
10254 {
10255 if (context->getClientVersion() < 3)
10256 {
10257 return gl::error(GL_INVALID_OPERATION);
10258 }
10259 }
10260
10261 UNIMPLEMENTED();
10262 }
10263 catch(std::bad_alloc&)
10264 {
10265 return gl::error(GL_OUT_OF_MEMORY);
10266 }
10267}
10268
10269void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10270{
10271 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10272
10273 try
10274 {
10275 gl::Context *context = gl::getNonLostContext();
10276
10277 if (context)
10278 {
10279 if (context->getClientVersion() < 3)
10280 {
10281 return gl::error(GL_INVALID_OPERATION);
10282 }
10283 }
10284
10285 UNIMPLEMENTED();
10286 }
10287 catch(std::bad_alloc&)
10288 {
10289 return gl::error(GL_OUT_OF_MEMORY);
10290 }
10291}
10292
10293void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10294{
10295 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10296
10297 try
10298 {
10299 gl::Context *context = gl::getNonLostContext();
10300
10301 if (context)
10302 {
10303 if (context->getClientVersion() < 3)
10304 {
10305 return gl::error(GL_INVALID_OPERATION);
10306 }
10307 }
10308
10309 UNIMPLEMENTED();
10310 }
10311 catch(std::bad_alloc&)
10312 {
10313 return gl::error(GL_OUT_OF_MEMORY);
10314 }
10315}
10316
10317void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10318{
10319 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10320
10321 try
10322 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010323 if (index >= gl::MAX_VERTEX_ATTRIBS)
10324 {
10325 return gl::error(GL_INVALID_VALUE);
10326 }
10327
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010328 gl::Context *context = gl::getNonLostContext();
10329
10330 if (context)
10331 {
10332 if (context->getClientVersion() < 3)
10333 {
10334 return gl::error(GL_INVALID_OPERATION);
10335 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010336
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010337 context->setVertexAttribDivisor(index, divisor);
10338 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010339 }
10340 catch(std::bad_alloc&)
10341 {
10342 return gl::error(GL_OUT_OF_MEMORY);
10343 }
10344}
10345
10346void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10347{
10348 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10349
10350 try
10351 {
10352 gl::Context *context = gl::getNonLostContext();
10353
10354 if (context)
10355 {
10356 if (context->getClientVersion() < 3)
10357 {
10358 return gl::error(GL_INVALID_OPERATION);
10359 }
10360 }
10361
10362 UNIMPLEMENTED();
10363 }
10364 catch(std::bad_alloc&)
10365 {
10366 return gl::error(GL_OUT_OF_MEMORY);
10367 }
10368}
10369
10370void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10371{
10372 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10373
10374 try
10375 {
10376 gl::Context *context = gl::getNonLostContext();
10377
10378 if (context)
10379 {
10380 if (context->getClientVersion() < 3)
10381 {
10382 return gl::error(GL_INVALID_OPERATION);
10383 }
10384 }
10385
10386 UNIMPLEMENTED();
10387 }
10388 catch(std::bad_alloc&)
10389 {
10390 return gl::error(GL_OUT_OF_MEMORY);
10391 }
10392}
10393
10394void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10395{
10396 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10397
10398 try
10399 {
10400 gl::Context *context = gl::getNonLostContext();
10401
10402 if (context)
10403 {
10404 if (context->getClientVersion() < 3)
10405 {
10406 return gl::error(GL_INVALID_OPERATION);
10407 }
10408 }
10409
10410 UNIMPLEMENTED();
10411 }
10412 catch(std::bad_alloc&)
10413 {
10414 return gl::error(GL_OUT_OF_MEMORY);
10415 }
10416}
10417
10418GLboolean __stdcall glIsTransformFeedback(GLuint id)
10419{
10420 EVENT("(GLuint id = %u)", id);
10421
10422 try
10423 {
10424 gl::Context *context = gl::getNonLostContext();
10425
10426 if (context)
10427 {
10428 if (context->getClientVersion() < 3)
10429 {
10430 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10431 }
10432 }
10433
10434 UNIMPLEMENTED();
10435 }
10436 catch(std::bad_alloc&)
10437 {
10438 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10439 }
10440
10441 return GL_FALSE;
10442}
10443
10444void __stdcall glPauseTransformFeedback(void)
10445{
10446 EVENT("(void)");
10447
10448 try
10449 {
10450 gl::Context *context = gl::getNonLostContext();
10451
10452 if (context)
10453 {
10454 if (context->getClientVersion() < 3)
10455 {
10456 return gl::error(GL_INVALID_OPERATION);
10457 }
10458 }
10459
10460 UNIMPLEMENTED();
10461 }
10462 catch(std::bad_alloc&)
10463 {
10464 return gl::error(GL_OUT_OF_MEMORY);
10465 }
10466}
10467
10468void __stdcall glResumeTransformFeedback(void)
10469{
10470 EVENT("(void)");
10471
10472 try
10473 {
10474 gl::Context *context = gl::getNonLostContext();
10475
10476 if (context)
10477 {
10478 if (context->getClientVersion() < 3)
10479 {
10480 return gl::error(GL_INVALID_OPERATION);
10481 }
10482 }
10483
10484 UNIMPLEMENTED();
10485 }
10486 catch(std::bad_alloc&)
10487 {
10488 return gl::error(GL_OUT_OF_MEMORY);
10489 }
10490}
10491
10492void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10493{
10494 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10495 program, bufSize, length, binaryFormat, binary);
10496
10497 try
10498 {
10499 gl::Context *context = gl::getNonLostContext();
10500
10501 if (context)
10502 {
10503 if (context->getClientVersion() < 3)
10504 {
10505 return gl::error(GL_INVALID_OPERATION);
10506 }
10507 }
10508
10509 UNIMPLEMENTED();
10510 }
10511 catch(std::bad_alloc&)
10512 {
10513 return gl::error(GL_OUT_OF_MEMORY);
10514 }
10515}
10516
10517void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10518{
10519 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10520 program, binaryFormat, binary, length);
10521
10522 try
10523 {
10524 gl::Context *context = gl::getNonLostContext();
10525
10526 if (context)
10527 {
10528 if (context->getClientVersion() < 3)
10529 {
10530 return gl::error(GL_INVALID_OPERATION);
10531 }
10532 }
10533
10534 UNIMPLEMENTED();
10535 }
10536 catch(std::bad_alloc&)
10537 {
10538 return gl::error(GL_OUT_OF_MEMORY);
10539 }
10540}
10541
10542void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10543{
10544 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10545 program, pname, value);
10546
10547 try
10548 {
10549 gl::Context *context = gl::getNonLostContext();
10550
10551 if (context)
10552 {
10553 if (context->getClientVersion() < 3)
10554 {
10555 return gl::error(GL_INVALID_OPERATION);
10556 }
10557 }
10558
10559 UNIMPLEMENTED();
10560 }
10561 catch(std::bad_alloc&)
10562 {
10563 return gl::error(GL_OUT_OF_MEMORY);
10564 }
10565}
10566
10567void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10568{
10569 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10570 target, numAttachments, attachments);
10571
10572 try
10573 {
10574 gl::Context *context = gl::getNonLostContext();
10575
10576 if (context)
10577 {
10578 if (context->getClientVersion() < 3)
10579 {
10580 return gl::error(GL_INVALID_OPERATION);
10581 }
10582 }
10583
10584 UNIMPLEMENTED();
10585 }
10586 catch(std::bad_alloc&)
10587 {
10588 return gl::error(GL_OUT_OF_MEMORY);
10589 }
10590}
10591
10592void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10593{
10594 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10595 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10596 target, numAttachments, attachments, x, y, width, height);
10597
10598 try
10599 {
10600 gl::Context *context = gl::getNonLostContext();
10601
10602 if (context)
10603 {
10604 if (context->getClientVersion() < 3)
10605 {
10606 return gl::error(GL_INVALID_OPERATION);
10607 }
10608 }
10609
10610 UNIMPLEMENTED();
10611 }
10612 catch(std::bad_alloc&)
10613 {
10614 return gl::error(GL_OUT_OF_MEMORY);
10615 }
10616}
10617
10618void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10619{
10620 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10621 target, levels, internalformat, width, height);
10622
10623 try
10624 {
10625 gl::Context *context = gl::getNonLostContext();
10626
10627 if (context)
10628 {
10629 if (context->getClientVersion() < 3)
10630 {
10631 return gl::error(GL_INVALID_OPERATION);
10632 }
10633 }
10634
10635 UNIMPLEMENTED();
10636 }
10637 catch(std::bad_alloc&)
10638 {
10639 return gl::error(GL_OUT_OF_MEMORY);
10640 }
10641}
10642
10643void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10644{
10645 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10646 "GLsizei height = %d, GLsizei depth = %d)",
10647 target, levels, internalformat, width, height, depth);
10648
10649 try
10650 {
10651 gl::Context *context = gl::getNonLostContext();
10652
10653 if (context)
10654 {
10655 if (context->getClientVersion() < 3)
10656 {
10657 return gl::error(GL_INVALID_OPERATION);
10658 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010659 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010660 }
10661 catch(std::bad_alloc&)
10662 {
10663 return gl::error(GL_OUT_OF_MEMORY);
10664 }
10665}
10666
10667void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10668{
10669 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10670 "GLint* params = 0x%0.8p)",
10671 target, internalformat, pname, bufSize, params);
10672
10673 try
10674 {
10675 gl::Context *context = gl::getNonLostContext();
10676
10677 if (context)
10678 {
10679 if (context->getClientVersion() < 3)
10680 {
10681 return gl::error(GL_INVALID_OPERATION);
10682 }
10683 }
10684
10685 UNIMPLEMENTED();
10686 }
10687 catch(std::bad_alloc&)
10688 {
10689 return gl::error(GL_OUT_OF_MEMORY);
10690 }
10691}
10692
10693// Extension functions
10694
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010695void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10696 GLbitfield mask, GLenum filter)
10697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010698 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010699 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10700 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10701 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10702
10703 try
10704 {
10705 switch (filter)
10706 {
10707 case GL_NEAREST:
10708 break;
10709 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010711 }
10712
10713 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010716 }
10717
10718 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10719 {
10720 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010721 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010722 }
10723
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010724 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010725
10726 if (context)
10727 {
10728 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10729 {
10730 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010731 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010732 }
10733
10734 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10735 }
10736 }
10737 catch(std::bad_alloc&)
10738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010740 }
10741}
10742
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010743void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10744 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010745{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010746 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010747 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010748 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010749 target, level, internalformat, width, height, depth, border, format, type, pixels);
10750
10751 try
10752 {
10753 UNIMPLEMENTED(); // FIXME
10754 }
10755 catch(std::bad_alloc&)
10756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010757 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010758 }
10759}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010760
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010761void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10762 GLenum *binaryFormat, void *binary)
10763{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010764 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 +000010765 program, bufSize, length, binaryFormat, binary);
10766
10767 try
10768 {
10769 gl::Context *context = gl::getNonLostContext();
10770
10771 if (context)
10772 {
10773 gl::Program *programObject = context->getProgram(program);
10774
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010775 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010777 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010778 }
10779
10780 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10781
10782 if (!programBinary)
10783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010784 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010785 }
10786
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010787 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010789 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010790 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010791
10792 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010793 }
10794 }
10795 catch(std::bad_alloc&)
10796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010797 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010798 }
10799}
10800
10801void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10802 const void *binary, GLint length)
10803{
10804 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10805 program, binaryFormat, binary, length);
10806
10807 try
10808 {
10809 gl::Context *context = gl::getNonLostContext();
10810
10811 if (context)
10812 {
10813 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010815 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010816 }
10817
10818 gl::Program *programObject = context->getProgram(program);
10819
10820 if (!programObject)
10821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010822 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010823 }
10824
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010825 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010826 }
10827 }
10828 catch(std::bad_alloc&)
10829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010830 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010831 }
10832}
10833
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010834void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10835{
10836 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10837
10838 try
10839 {
10840 gl::Context *context = gl::getNonLostContext();
10841
10842 if (context)
10843 {
10844 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10845 {
10846 return gl::error(GL_INVALID_VALUE);
10847 }
10848
10849 if (context->getDrawFramebufferHandle() == 0)
10850 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010851 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010852 {
10853 return gl::error(GL_INVALID_OPERATION);
10854 }
10855
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010856 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010857 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010858 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010859 }
10860 }
10861 else
10862 {
10863 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10864 {
10865 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10866 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10867 {
10868 return gl::error(GL_INVALID_OPERATION);
10869 }
10870 }
10871 }
10872
10873 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10874
10875 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10876 {
10877 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10878 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010879
10880 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10881 {
10882 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10883 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010884 }
10885 }
10886 catch (std::bad_alloc&)
10887 {
10888 return gl::error(GL_OUT_OF_MEMORY);
10889 }
10890}
10891
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010892__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10893{
10894 struct Extension
10895 {
10896 const char *name;
10897 __eglMustCastToProperFunctionPointerType address;
10898 };
10899
10900 static const Extension glExtensions[] =
10901 {
10902 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010903 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010904 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010905 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10906 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10907 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10908 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10909 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10910 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10911 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010912 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010913 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010914 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10915 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10916 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10917 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010918 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10919 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10920 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10921 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10922 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10923 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10924 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010925 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010926 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10927 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10928 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010929 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10930 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010931
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010932 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010933 {
10934 if (strcmp(procname, glExtensions[ext].name) == 0)
10935 {
10936 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10937 }
10938 }
10939
10940 return NULL;
10941}
10942
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010943// Non-public functions used by EGL
10944
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010945bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010946{
10947 EVENT("(egl::Surface* surface = 0x%0.8p)",
10948 surface);
10949
10950 try
10951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010952 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010953
10954 if (context)
10955 {
10956 gl::Texture2D *textureObject = context->getTexture2D();
10957
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010958 if (textureObject->isImmutable())
10959 {
10960 return false;
10961 }
10962
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010963 if (textureObject)
10964 {
10965 textureObject->bindTexImage(surface);
10966 }
10967 }
10968 }
10969 catch(std::bad_alloc&)
10970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010971 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010972 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010973
10974 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010975}
10976
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010977}