blob: 80681c8b6163662cdd3068afc7f8f3406784c270 [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"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000025bool validImageSize(GLint level, GLsizei width, GLsizei height, GLsizei depth)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000026{
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000027 if (level < 0 || width < 0 || height < 0 || depth < 0)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000028 {
29 return false;
30 }
31
32 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
33 {
34 return true;
35 }
36
37 if (level == 0)
38 {
39 return true;
40 }
41
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000042 if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000043 {
44 return true;
45 }
46
47 return false;
48}
49
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000050// Verify that format/type are one of the combinations from table 3.4.
51bool checkTextureFormatType(GLenum format, GLenum type)
52{
53 // validate <format> by itself (used as secondary key below)
54 switch (format)
55 {
56 case GL_RGBA:
57 case GL_BGRA_EXT:
58 case GL_RGB:
59 case GL_ALPHA:
60 case GL_LUMINANCE:
61 case GL_LUMINANCE_ALPHA:
62 case GL_DEPTH_COMPONENT:
63 case GL_DEPTH_STENCIL_OES:
64 break;
65 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000066 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000067 }
68
69 // invalid <type> -> sets INVALID_ENUM
70 // invalid <format>+<type> combination -> sets INVALID_OPERATION
71 switch (type)
72 {
73 case GL_UNSIGNED_BYTE:
74 switch (format)
75 {
76 case GL_RGBA:
77 case GL_BGRA_EXT:
78 case GL_RGB:
79 case GL_ALPHA:
80 case GL_LUMINANCE:
81 case GL_LUMINANCE_ALPHA:
82 return true;
83 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000084 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000085 }
86
87 case GL_FLOAT:
88 case GL_HALF_FLOAT_OES:
89 switch (format)
90 {
91 case GL_RGBA:
92 case GL_RGB:
93 case GL_ALPHA:
94 case GL_LUMINANCE:
95 case GL_LUMINANCE_ALPHA:
96 return true;
97 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000098 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000099 }
100
101 case GL_UNSIGNED_SHORT_4_4_4_4:
102 case GL_UNSIGNED_SHORT_5_5_5_1:
103 switch (format)
104 {
105 case GL_RGBA:
106 return true;
107 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000108 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000109 }
110
111 case GL_UNSIGNED_SHORT_5_6_5:
112 switch (format)
113 {
114 case GL_RGB:
115 return true;
116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000117 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000118 }
119
120 case GL_UNSIGNED_SHORT:
121 case GL_UNSIGNED_INT:
122 switch (format)
123 {
124 case GL_DEPTH_COMPONENT:
125 return true;
126 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000127 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000128 }
129
130 case GL_UNSIGNED_INT_24_8_OES:
131 switch (format)
132 {
133 case GL_DEPTH_STENCIL_OES:
134 return true;
135 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000136 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000137 }
138
139 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000140 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000141 }
142}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000143
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000144bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000145 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000146 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000147{
148 if (!texture)
149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000150 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000151 }
152
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000153 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000156 }
157
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000158 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000159 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000160 GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000161 if (internalformat != texture->getInternalFormat(level))
162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000163 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000164 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000165 }
166
167 if (compressed)
168 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000169 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
170 (height % 4 != 0 && height != texture->getHeight(0)))
171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000172 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000173 }
174 }
175
176 if (xoffset + width > texture->getWidth(level) ||
177 yoffset + height > texture->getHeight(level))
178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000179 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000180 }
181
182 return true;
183}
184
185bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000186 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000187 gl::TextureCubeMap *texture)
188{
189 if (!texture)
190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000191 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000192 }
193
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000194 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000196 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000197 }
198
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000199 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000200 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000201 GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000202 if (internalformat != texture->getInternalFormat(target, level))
203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000204 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000205 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000206 }
207
208 if (compressed)
209 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000210 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
211 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000213 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000214 }
215 }
216
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000217 if (xoffset + width > texture->getWidth(target, level) ||
218 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000220 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000221 }
222
223 return true;
224}
225
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000226bool validateES3TexImageFormat(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
227 GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
228 GLint border, GLenum format, GLenum type)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000229{
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000230 // Validate image size
231 if (level < 0 || width < 0 || height < 0 || depth < 0 )
232 {
233 return gl::error(GL_INVALID_VALUE, false);
234 }
235
236 if (isCompressed)
237 {
238 if (width != 1 && width != 2 && width % 4 != 0)
239 {
240 return gl::error(GL_INVALID_OPERATION, false);
241 }
242
243 if (height != 1 && height != 2 && height % 4 != 0)
244 {
245 return gl::error(GL_INVALID_OPERATION, false);
246 }
247 }
248
249 // Verify zero border
250 if (border != 0)
251 {
252 return gl::error(GL_INVALID_VALUE, false);
253 }
254
255 // Validate dimensions based on Context limits and validate the texture
256 if (level > context->getMaximumTextureLevel())
257 {
258 return gl::error(GL_INVALID_VALUE, false);
259 }
260
261 gl::Texture *texture = NULL;
262 bool textureCompressed = false;
263 GLenum textureInternalFormat = GL_NONE;
264 GLint textureLevelWidth = 0;
265 GLint textureLevelHeight = 0;
266 GLint textureLevelDepth = 0;
267 switch (target)
268 {
269 case GL_TEXTURE_2D:
270 {
271 if (width > (context->getMaximum2DTextureDimension() >> level) ||
272 height > (context->getMaximum2DTextureDimension() >> level))
273 {
274 return gl::error(GL_INVALID_VALUE, false);
275 }
276
277 gl::Texture2D *texture2d = context->getTexture2D();
278 if (texture2d)
279 {
280 textureCompressed = texture2d->isCompressed(level);
281 textureInternalFormat = texture2d->getInternalFormat(level);
282 textureLevelWidth = texture2d->getWidth(level);
283 textureLevelHeight = texture2d->getHeight(level);
284 textureLevelDepth = 1;
285 texture = texture2d;
286 }
287 }
288 break;
289
290 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
291 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
292 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
293 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
294 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
295 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
296 {
297 if (width != height)
298 {
299 return gl::error(GL_INVALID_VALUE, false);
300 }
301
302 if (width > (context->getMaximumCubeTextureDimension() >> level))
303 {
304 return gl::error(GL_INVALID_VALUE, false);
305 }
306
307 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
308 if (textureCube)
309 {
310 textureCompressed = textureCube->isCompressed(target, level);
311 textureInternalFormat = textureCube->getInternalFormat(target, level);
312 textureLevelWidth = textureCube->getWidth(target, level);
313 textureLevelHeight = textureCube->getHeight(target, level);
314 textureLevelDepth = 1;
315 texture = textureCube;
316 }
317 }
318 break;
319
320 case GL_TEXTURE_3D:
321 {
322 if (width > (context->getMaximum3DTextureDimension() >> level) ||
323 height > (context->getMaximum3DTextureDimension() >> level) ||
324 depth > (context->getMaximum3DTextureDimension() >> level))
325 {
326 return gl::error(GL_INVALID_VALUE, false);
327 }
328
329 gl::Texture3D *texture3d = context->getTexture3D();
330 if (texture3d)
331 {
332 textureCompressed = texture3d->isCompressed(level);
333 textureInternalFormat = texture3d->getInternalFormat(level);
334 textureLevelWidth = texture3d->getWidth(level);
335 textureLevelHeight = texture3d->getHeight(level);
336 textureLevelDepth = texture3d->getDepth(level);
337 texture = texture3d;
338 }
339 }
340 break;
341
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +0000342 case GL_TEXTURE_2D_ARRAY:
343 {
344 if (width > (context->getMaximum2DTextureDimension() >> level) ||
345 height > (context->getMaximum2DTextureDimension() >> level) ||
346 depth > (context->getMaximum2DArrayTextureLayers() >> level))
347 {
348 return gl::error(GL_INVALID_VALUE, false);
349 }
350
351 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
352 if (texture2darray)
353 {
354 textureCompressed = texture2darray->isCompressed(level);
355 textureInternalFormat = texture2darray->getInternalFormat(level);
356 textureLevelWidth = texture2darray->getWidth(level);
357 textureLevelHeight = texture2darray->getHeight(level);
358 textureLevelDepth = texture2darray->getDepth(level);
359 texture = texture2darray;
360 }
361 }
362 break;
363
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000364 default:
365 return gl::error(GL_INVALID_ENUM, false);
366 }
367
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000368 if (!texture)
369 {
370 return gl::error(GL_INVALID_OPERATION, false);
371 }
372
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000373 if (texture->isImmutable())
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000374 {
375 return gl::error(GL_INVALID_OPERATION, false);
376 }
377
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000378 // Validate texture formats
379 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
380 if (isCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000381 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000382 if (!gl::IsFormatCompressed(actualInternalFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000383 {
384 return gl::error(GL_INVALID_ENUM, false);
385 }
386
387 if (target == GL_TEXTURE_3D)
388 {
389 return gl::error(GL_INVALID_OPERATION, false);
390 }
391 }
392 else
393 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000394 if (!gl::IsValidInternalFormat(actualInternalFormat, context) ||
395 !gl::IsValidFormat(format, context->getClientVersion()) ||
396 !gl::IsValidType(type, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000397 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000398 return gl::error(GL_INVALID_ENUM, false);
399 }
400
401 if (!gl::IsValidFormatCombination(actualInternalFormat, format, type, context->getClientVersion()))
402 {
403 return gl::error(GL_INVALID_OPERATION, false);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000404 }
405
406 if ((target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) &&
407 (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000408 {
409 return gl::error(GL_INVALID_OPERATION, false);
410 }
411 }
412
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000413 // Validate sub image parameters
414 if (isSubImage)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000415 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000416 if (isCompressed != textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000417 {
418 return gl::error(GL_INVALID_OPERATION, false);
419 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000420
421 if (format != GL_NONE)
422 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000423 GLenum internalformat = gl::GetSizedInternalFormat(format, type, context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000424 if (internalformat != textureInternalFormat)
425 {
426 return gl::error(GL_INVALID_OPERATION, false);
427 }
428 }
429
430 if (isCompressed)
431 {
432 if ((width % 4 != 0 && width != textureLevelWidth) ||
433 (height % 4 != 0 && height != textureLevelHeight))
434 {
435 return gl::error(GL_INVALID_OPERATION, false);
436 }
437 }
438
439 if (width == 0 || height == 0 || depth == 0)
440 {
441 return false;
442 }
443
444 if (xoffset < 0 || yoffset < 0 || zoffset < 0)
445 {
446 return gl::error(GL_INVALID_VALUE, false);
447 }
448
449 if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
450 std::numeric_limits<GLsizei>::max() - yoffset < height ||
451 std::numeric_limits<GLsizei>::max() - zoffset < depth)
452 {
453 return gl::error(GL_INVALID_VALUE, false);
454 }
455
456 if (xoffset + width > textureLevelWidth ||
457 yoffset + height > textureLevelHeight ||
458 zoffset + depth > textureLevelDepth)
459 {
460 return gl::error(GL_INVALID_VALUE, false);
461 }
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000462 }
463
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000464 return true;
465}
466
467bool validateCopyTexImageParameters(gl::Context *context, GLenum target, bool isCompressed, GLint level,
468 GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
469 GLsizei width, GLsizei height)
470{
471 if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000472 {
473 return gl::error(GL_INVALID_VALUE, false);
474 }
475
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000476 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
477 {
478 return gl::error(GL_INVALID_VALUE, false);
479 }
480
481 if (width == 0 || height == 0)
482 {
483 return false;
484 }
485
486 if (level > context->getMaximumTextureLevel())
487 {
488 return gl::error(GL_INVALID_VALUE, false);
489 }
490
491 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
492
493 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
494 {
495 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
496 }
497
498 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
499 {
500 return gl::error(GL_INVALID_OPERATION, false);
501 }
502
503 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
504 GLenum colorbufferFormat = source->getInternalFormat();
505 gl::Texture *texture = NULL;
506 GLenum textureFormat = GL_RGBA;
507 bool textureCompressed = false;
508 GLint textureLevelWidth = 0;
509 GLint textureLevelHeight = 0;
510 GLint textureLevelDepth = 0;
511 switch (target)
512 {
513 case GL_TEXTURE_2D:
514 {
515 gl::Texture2D *texture2d = context->getTexture2D();
516 if (texture2d)
517 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000518 textureFormat = gl::GetFormat(texture2d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000519 textureCompressed = texture2d->isCompressed(level);
520 textureLevelWidth = texture2d->getWidth(level);
521 textureLevelHeight = texture2d->getHeight(level);
522 textureLevelDepth = 1;
523 texture = texture2d;
524 }
525 }
526 break;
527
528 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
529 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
530 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
531 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
532 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
533 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
534 {
535 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
536 if (textureCube)
537 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000538 textureFormat = gl::GetFormat(textureCube->getInternalFormat(target, level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000539 textureCompressed = textureCube->isCompressed(target, level);
540 textureLevelWidth = textureCube->getWidth(target, level);
541 textureLevelHeight = textureCube->getHeight(target, level);
542 textureLevelDepth = 1;
543 texture = textureCube;
544 }
545 }
546 break;
547
548 case GL_TEXTURE_3D:
549 {
550 gl::Texture3D *texture3d = context->getTexture3D();
551 if (texture3d)
552 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000553 textureFormat = gl::GetFormat(texture3d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000554 textureCompressed = texture3d->isCompressed(level);
555 textureLevelWidth = texture3d->getWidth(level);
556 textureLevelHeight = texture3d->getHeight(level);
557 textureLevelDepth = texture3d->getDepth(level);
558 texture = texture3d;
559 }
560 }
561 break;
562
563 default:
564 return gl::error(GL_INVALID_ENUM, false);
565 }
566
567 if (!texture)
568 {
569 return gl::error(GL_INVALID_OPERATION, false);
570 }
571
572 if (isCompressed != textureCompressed)
573 {
574 return gl::error(GL_INVALID_OPERATION, false);
575 }
576
577 if (isCompressed)
578 {
579 if ((width % 4 != 0 && width != textureLevelWidth) ||
580 (height % 4 != 0 && height != textureLevelHeight))
581 {
582 return gl::error(GL_INVALID_OPERATION, false);
583 }
584 }
585
586 if (xoffset + width > textureLevelWidth ||
587 yoffset + height > textureLevelHeight ||
588 zoffset >= textureLevelDepth)
589 {
590 return gl::error(GL_INVALID_VALUE, false);
591 }
592
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000593 if (!gl::IsValidCopyTexImageCombination(textureFormat, colorbufferFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000594 {
595 return gl::error(GL_INVALID_OPERATION, false);
596 }
597
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000598 return true;
599}
600
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000601// check for combinations of format and type that are valid for ReadPixels
602bool validReadFormatType(GLenum format, GLenum type)
603{
604 switch (format)
605 {
606 case GL_RGBA:
607 switch (type)
608 {
609 case GL_UNSIGNED_BYTE:
610 break;
611 default:
612 return false;
613 }
614 break;
615 case GL_BGRA_EXT:
616 switch (type)
617 {
618 case GL_UNSIGNED_BYTE:
619 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
620 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
621 break;
622 default:
623 return false;
624 }
625 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000626 default:
627 return false;
628 }
629 return true;
630}
631
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +0000632bool validateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
633 const GLenum* attachments)
634{
635 bool defaultFramebuffer = false;
636
637 switch (target)
638 {
639 case GL_DRAW_FRAMEBUFFER:
640 case GL_FRAMEBUFFER:
641 defaultFramebuffer = context->getDrawFramebufferHandle() == 0;
642 break;
643 case GL_READ_FRAMEBUFFER:
644 defaultFramebuffer = context->getReadFramebufferHandle() == 0;
645 break;
646 default:
647 return gl::error(GL_INVALID_ENUM, false);
648 }
649
650 for (int i = 0; i < numAttachments; ++i)
651 {
652 if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
653 {
654 if (defaultFramebuffer)
655 {
656 return gl::error(GL_INVALID_ENUM, false);
657 }
658
659 if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getMaximumRenderTargets())
660 {
661 return gl::error(GL_INVALID_OPERATION, false);
662 }
663 }
664 else
665 {
666 switch (attachments[i])
667 {
668 case GL_DEPTH_ATTACHMENT:
669 case GL_STENCIL_ATTACHMENT:
670 case GL_DEPTH_STENCIL_ATTACHMENT:
671 if (defaultFramebuffer)
672 {
673 return gl::error(GL_INVALID_ENUM, false);
674 }
675 break;
676 case GL_COLOR:
677 case GL_DEPTH:
678 case GL_STENCIL:
679 if (!defaultFramebuffer)
680 {
681 return gl::error(GL_INVALID_ENUM, false);
682 }
683 break;
684 default:
685 return gl::error(GL_INVALID_ENUM, false);
686 }
687 }
688 }
689
690 return true;
691}
692
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693extern "C"
694{
695
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000696// OpenGL ES 2.0 functions
697
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698void __stdcall glActiveTexture(GLenum texture)
699{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000700 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000701
702 try
703 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000704 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000705
706 if (context)
707 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000708 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000710 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000711 }
712
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000713 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000714 }
715 }
716 catch(std::bad_alloc&)
717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000718 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000719 }
720}
721
722void __stdcall glAttachShader(GLuint program, GLuint shader)
723{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000724 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000725
726 try
727 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729
730 if (context)
731 {
732 gl::Program *programObject = context->getProgram(program);
733 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000734
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000735 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000736 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000737 if (context->getShader(program))
738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000739 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000740 }
741 else
742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000743 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000744 }
745 }
746
747 if (!shaderObject)
748 {
749 if (context->getProgram(shader))
750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000751 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000752 }
753 else
754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000756 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 }
758
759 if (!programObject->attachShader(shaderObject))
760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000761 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762 }
763 }
764 }
765 catch(std::bad_alloc&)
766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768 }
769}
770
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000771void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
772{
773 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
774
775 try
776 {
777 switch (target)
778 {
779 case GL_ANY_SAMPLES_PASSED_EXT:
780 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
781 break;
782 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000783 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000784 }
785
786 if (id == 0)
787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000788 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000789 }
790
791 gl::Context *context = gl::getNonLostContext();
792
793 if (context)
794 {
795 context->beginQuery(target, id);
796 }
797 }
798 catch(std::bad_alloc&)
799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000800 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000801 }
802}
803
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000804void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000805{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000806 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000807
808 try
809 {
810 if (index >= gl::MAX_VERTEX_ATTRIBS)
811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000813 }
814
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000815 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000816
817 if (context)
818 {
819 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000820
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821 if (!programObject)
822 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000823 if (context->getShader(program))
824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000825 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000826 }
827 else
828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000829 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000830 }
831 }
832
833 if (strncmp(name, "gl_", 3) == 0)
834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000835 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 }
837
838 programObject->bindAttributeLocation(index, name);
839 }
840 }
841 catch(std::bad_alloc&)
842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000843 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000844 }
845}
846
847void __stdcall glBindBuffer(GLenum target, GLuint buffer)
848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000849 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000850
851 try
852 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000854
855 if (context)
856 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000857 // Check ES3 specific targets
858 switch (target)
859 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000860 case GL_COPY_READ_BUFFER:
861 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000862 case GL_PIXEL_PACK_BUFFER:
863 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000864 case GL_UNIFORM_BUFFER:
865 case GL_TRANSFORM_FEEDBACK_BUFFER:
866 if (context->getClientVersion() < 3)
867 {
868 return gl::error(GL_INVALID_ENUM);
869 }
870 }
871
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872 switch (target)
873 {
874 case GL_ARRAY_BUFFER:
875 context->bindArrayBuffer(buffer);
876 return;
877 case GL_ELEMENT_ARRAY_BUFFER:
878 context->bindElementArrayBuffer(buffer);
879 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000880 case GL_COPY_READ_BUFFER:
881 context->bindCopyReadBuffer(buffer);
882 return;
883 case GL_COPY_WRITE_BUFFER:
884 context->bindCopyWriteBuffer(buffer);
885 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000886 case GL_PIXEL_PACK_BUFFER:
887 context->bindPixelPackBuffer(buffer);
888 return;
889 case GL_PIXEL_UNPACK_BUFFER:
890 context->bindPixelUnpackBuffer(buffer);
891 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000892 case GL_UNIFORM_BUFFER:
893 context->bindGenericUniformBuffer(buffer);
894 return;
895 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000896 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000897 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000898 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000899 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900 }
901 }
902 }
903 catch(std::bad_alloc&)
904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000905 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000906 }
907}
908
909void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000911 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000912
913 try
914 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000915 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000918 }
919
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000921
922 if (context)
923 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000924 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
925 {
926 context->bindReadFramebuffer(framebuffer);
927 }
928
929 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
930 {
931 context->bindDrawFramebuffer(framebuffer);
932 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000933 }
934 }
935 catch(std::bad_alloc&)
936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000937 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000938 }
939}
940
941void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
942{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000943 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000944
945 try
946 {
947 if (target != GL_RENDERBUFFER)
948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000949 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000950 }
951
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953
954 if (context)
955 {
956 context->bindRenderbuffer(renderbuffer);
957 }
958 }
959 catch(std::bad_alloc&)
960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000962 }
963}
964
965void __stdcall glBindTexture(GLenum target, GLuint texture)
966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000967 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000968
969 try
970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000972
973 if (context)
974 {
975 gl::Texture *textureObject = context->getTexture(texture);
976
977 if (textureObject && textureObject->getTarget() != target && texture != 0)
978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000979 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980 }
981
982 switch (target)
983 {
984 case GL_TEXTURE_2D:
985 context->bindTexture2D(texture);
986 return;
987 case GL_TEXTURE_CUBE_MAP:
988 context->bindTextureCubeMap(texture);
989 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000990 case GL_TEXTURE_3D:
991 if (context->getClientVersion() < 3)
992 {
993 return gl::error(GL_INVALID_ENUM);
994 }
995 context->bindTexture3D(texture);
996 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000997 case GL_TEXTURE_2D_ARRAY:
998 if (context->getClientVersion() < 3)
999 {
1000 return gl::error(GL_INVALID_ENUM);
1001 }
1002 context->bindTexture2DArray(texture);
1003 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001004 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001005 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001006 }
1007 }
1008 }
1009 catch(std::bad_alloc&)
1010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001012 }
1013}
1014
1015void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001017 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001018 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001019
1020 try
1021 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001022 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001023
1024 if (context)
1025 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001026 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001027 }
1028 }
1029 catch(std::bad_alloc&)
1030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001031 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001032 }
1033}
1034
1035void __stdcall glBlendEquation(GLenum mode)
1036{
1037 glBlendEquationSeparate(mode, mode);
1038}
1039
1040void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
1041{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001042 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001043
1044 try
1045 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001046 gl::Context *context = gl::getNonLostContext();
1047
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001048 switch (modeRGB)
1049 {
1050 case GL_FUNC_ADD:
1051 case GL_FUNC_SUBTRACT:
1052 case GL_FUNC_REVERSE_SUBTRACT:
1053 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001054
1055 case GL_MIN:
1056 case GL_MAX:
1057 if (context && context->getClientVersion() < 3)
1058 {
1059 return gl::error(GL_INVALID_ENUM);
1060 }
1061 break;
1062
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001063 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001064 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001065 }
1066
1067 switch (modeAlpha)
1068 {
1069 case GL_FUNC_ADD:
1070 case GL_FUNC_SUBTRACT:
1071 case GL_FUNC_REVERSE_SUBTRACT:
1072 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001073
1074 case GL_MIN:
1075 case GL_MAX:
1076 if (context && context->getClientVersion() < 3)
1077 {
1078 return gl::error(GL_INVALID_ENUM);
1079 }
1080 break;
1081
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001082 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001083 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001084 }
1085
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001086 if (context)
1087 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001088 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089 }
1090 }
1091 catch(std::bad_alloc&)
1092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001093 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001094 }
1095}
1096
1097void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1098{
1099 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1100}
1101
1102void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001104 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 +00001105 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001106
1107 try
1108 {
1109 switch (srcRGB)
1110 {
1111 case GL_ZERO:
1112 case GL_ONE:
1113 case GL_SRC_COLOR:
1114 case GL_ONE_MINUS_SRC_COLOR:
1115 case GL_DST_COLOR:
1116 case GL_ONE_MINUS_DST_COLOR:
1117 case GL_SRC_ALPHA:
1118 case GL_ONE_MINUS_SRC_ALPHA:
1119 case GL_DST_ALPHA:
1120 case GL_ONE_MINUS_DST_ALPHA:
1121 case GL_CONSTANT_COLOR:
1122 case GL_ONE_MINUS_CONSTANT_COLOR:
1123 case GL_CONSTANT_ALPHA:
1124 case GL_ONE_MINUS_CONSTANT_ALPHA:
1125 case GL_SRC_ALPHA_SATURATE:
1126 break;
1127 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001128 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001129 }
1130
1131 switch (dstRGB)
1132 {
1133 case GL_ZERO:
1134 case GL_ONE:
1135 case GL_SRC_COLOR:
1136 case GL_ONE_MINUS_SRC_COLOR:
1137 case GL_DST_COLOR:
1138 case GL_ONE_MINUS_DST_COLOR:
1139 case GL_SRC_ALPHA:
1140 case GL_ONE_MINUS_SRC_ALPHA:
1141 case GL_DST_ALPHA:
1142 case GL_ONE_MINUS_DST_ALPHA:
1143 case GL_CONSTANT_COLOR:
1144 case GL_ONE_MINUS_CONSTANT_COLOR:
1145 case GL_CONSTANT_ALPHA:
1146 case GL_ONE_MINUS_CONSTANT_ALPHA:
1147 break;
1148 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001149 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001150 }
1151
1152 switch (srcAlpha)
1153 {
1154 case GL_ZERO:
1155 case GL_ONE:
1156 case GL_SRC_COLOR:
1157 case GL_ONE_MINUS_SRC_COLOR:
1158 case GL_DST_COLOR:
1159 case GL_ONE_MINUS_DST_COLOR:
1160 case GL_SRC_ALPHA:
1161 case GL_ONE_MINUS_SRC_ALPHA:
1162 case GL_DST_ALPHA:
1163 case GL_ONE_MINUS_DST_ALPHA:
1164 case GL_CONSTANT_COLOR:
1165 case GL_ONE_MINUS_CONSTANT_COLOR:
1166 case GL_CONSTANT_ALPHA:
1167 case GL_ONE_MINUS_CONSTANT_ALPHA:
1168 case GL_SRC_ALPHA_SATURATE:
1169 break;
1170 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001171 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001172 }
1173
1174 switch (dstAlpha)
1175 {
1176 case GL_ZERO:
1177 case GL_ONE:
1178 case GL_SRC_COLOR:
1179 case GL_ONE_MINUS_SRC_COLOR:
1180 case GL_DST_COLOR:
1181 case GL_ONE_MINUS_DST_COLOR:
1182 case GL_SRC_ALPHA:
1183 case GL_ONE_MINUS_SRC_ALPHA:
1184 case GL_DST_ALPHA:
1185 case GL_ONE_MINUS_DST_ALPHA:
1186 case GL_CONSTANT_COLOR:
1187 case GL_ONE_MINUS_CONSTANT_COLOR:
1188 case GL_CONSTANT_ALPHA:
1189 case GL_ONE_MINUS_CONSTANT_ALPHA:
1190 break;
1191 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001192 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001193 }
1194
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001195 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1196 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1197
1198 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1199 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1200
1201 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001202 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001203 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 +00001204 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001205 }
1206
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001208
1209 if (context)
1210 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001211 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001212 }
1213 }
1214 catch(std::bad_alloc&)
1215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001216 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001217 }
1218}
1219
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001220void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001221{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001222 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 +00001223 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001224
1225 try
1226 {
1227 if (size < 0)
1228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001229 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001230 }
1231
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001232 gl::Context *context = gl::getNonLostContext();
1233
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001234 switch (usage)
1235 {
1236 case GL_STREAM_DRAW:
1237 case GL_STATIC_DRAW:
1238 case GL_DYNAMIC_DRAW:
1239 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001240
1241 case GL_STREAM_READ:
1242 case GL_STREAM_COPY:
1243 case GL_STATIC_READ:
1244 case GL_STATIC_COPY:
1245 case GL_DYNAMIC_READ:
1246 case GL_DYNAMIC_COPY:
1247 if (context && context->getClientVersion() < 3)
1248 {
1249 return gl::error(GL_INVALID_ENUM);
1250 }
1251 break;
1252
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001254 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001255 }
1256
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001257 if (context)
1258 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001259 // Check ES3 specific targets
1260 switch (target)
1261 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001262 case GL_COPY_READ_BUFFER:
1263 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001264 case GL_PIXEL_PACK_BUFFER:
1265 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001266 case GL_UNIFORM_BUFFER:
1267 case GL_TRANSFORM_FEEDBACK_BUFFER:
1268 if (context->getClientVersion() < 3)
1269 {
1270 return gl::error(GL_INVALID_ENUM);
1271 }
1272 }
1273
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001275
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 switch (target)
1277 {
1278 case GL_ARRAY_BUFFER:
1279 buffer = context->getArrayBuffer();
1280 break;
1281 case GL_ELEMENT_ARRAY_BUFFER:
1282 buffer = context->getElementArrayBuffer();
1283 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001284 case GL_COPY_READ_BUFFER:
1285 buffer = context->getCopyReadBuffer();
1286 break;
1287 case GL_COPY_WRITE_BUFFER:
1288 buffer = context->getCopyWriteBuffer();
1289 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001290 case GL_PIXEL_PACK_BUFFER:
1291 buffer = context->getPixelPackBuffer();
1292 break;
1293 case GL_PIXEL_UNPACK_BUFFER:
1294 buffer = context->getPixelUnpackBuffer();
1295 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001296 case GL_TRANSFORM_FEEDBACK_BUFFER:
1297 buffer = context->getGenericTransformFeedbackBuffer();
1298 break;
1299 case GL_UNIFORM_BUFFER:
1300 buffer = context->getGenericUniformBuffer();
1301 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001302 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001304 }
1305
1306 if (!buffer)
1307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001308 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001309 }
1310
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001311 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001312 }
1313 }
1314 catch(std::bad_alloc&)
1315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001317 }
1318}
1319
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001320void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001321{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001322 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 +00001323 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001324
1325 try
1326 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001327 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001330 }
1331
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001332 if (data == NULL)
1333 {
1334 return;
1335 }
1336
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001338
1339 if (context)
1340 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001341 // Check ES3 specific targets
1342 switch (target)
1343 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001344 case GL_COPY_READ_BUFFER:
1345 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001346 case GL_PIXEL_PACK_BUFFER:
1347 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001348 case GL_UNIFORM_BUFFER:
1349 case GL_TRANSFORM_FEEDBACK_BUFFER:
1350 if (context->getClientVersion() < 3)
1351 {
1352 return gl::error(GL_INVALID_ENUM);
1353 }
1354 }
1355
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001356 gl::Buffer *buffer;
1357
1358 switch (target)
1359 {
1360 case GL_ARRAY_BUFFER:
1361 buffer = context->getArrayBuffer();
1362 break;
1363 case GL_ELEMENT_ARRAY_BUFFER:
1364 buffer = context->getElementArrayBuffer();
1365 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001366 case GL_COPY_READ_BUFFER:
1367 buffer = context->getCopyReadBuffer();
1368 break;
1369 case GL_COPY_WRITE_BUFFER:
1370 buffer = context->getCopyWriteBuffer();
1371 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001372 case GL_PIXEL_PACK_BUFFER:
1373 buffer = context->getPixelPackBuffer();
1374 break;
1375 case GL_PIXEL_UNPACK_BUFFER:
1376 buffer = context->getPixelUnpackBuffer();
1377 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001378 case GL_TRANSFORM_FEEDBACK_BUFFER:
1379 buffer = context->getGenericTransformFeedbackBuffer();
1380 break;
1381 case GL_UNIFORM_BUFFER:
1382 buffer = context->getGenericUniformBuffer();
1383 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001384 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001385 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001386 }
1387
1388 if (!buffer)
1389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001391 }
1392
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001393 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001395 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001396 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001397
1398 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001399 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001400 }
1401 catch(std::bad_alloc&)
1402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001403 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001404 }
1405}
1406
1407GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1408{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001409 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001410
1411 try
1412 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001413 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001415 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001416 }
1417
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001419
1420 if (context)
1421 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001422 gl::Framebuffer *framebuffer = NULL;
1423 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1424 {
1425 framebuffer = context->getReadFramebuffer();
1426 }
1427 else
1428 {
1429 framebuffer = context->getDrawFramebuffer();
1430 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431
1432 return framebuffer->completeness();
1433 }
1434 }
1435 catch(std::bad_alloc&)
1436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001437 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001438 }
1439
1440 return 0;
1441}
1442
1443void __stdcall glClear(GLbitfield mask)
1444{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001445 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446
1447 try
1448 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001449 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001450
1451 if (context)
1452 {
1453 context->clear(mask);
1454 }
1455 }
1456 catch(std::bad_alloc&)
1457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001458 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459 }
1460}
1461
1462void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1463{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001464 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001465 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466
1467 try
1468 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001470
1471 if (context)
1472 {
1473 context->setClearColor(red, green, blue, alpha);
1474 }
1475 }
1476 catch(std::bad_alloc&)
1477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001478 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479 }
1480}
1481
1482void __stdcall glClearDepthf(GLclampf depth)
1483{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001484 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001485
1486 try
1487 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001489
1490 if (context)
1491 {
1492 context->setClearDepth(depth);
1493 }
1494 }
1495 catch(std::bad_alloc&)
1496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001497 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001498 }
1499}
1500
1501void __stdcall glClearStencil(GLint s)
1502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001503 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001504
1505 try
1506 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001508
1509 if (context)
1510 {
1511 context->setClearStencil(s);
1512 }
1513 }
1514 catch(std::bad_alloc&)
1515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 }
1518}
1519
1520void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1521{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001522 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001523 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001524
1525 try
1526 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001527 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001528
1529 if (context)
1530 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001531 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001532 }
1533 }
1534 catch(std::bad_alloc&)
1535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001536 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001537 }
1538}
1539
1540void __stdcall glCompileShader(GLuint shader)
1541{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001542 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001543
1544 try
1545 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001546 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001547
1548 if (context)
1549 {
1550 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001551
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001552 if (!shaderObject)
1553 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001554 if (context->getProgram(shader))
1555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001557 }
1558 else
1559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001561 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001562 }
1563
1564 shaderObject->compile();
1565 }
1566 }
1567 catch(std::bad_alloc&)
1568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001570 }
1571}
1572
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001573void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1574 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001576 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001577 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001578 target, level, internalformat, width, height, border, imageSize, data);
1579
1580 try
1581 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001582 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001584 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001585 }
1586
daniel@transgaming.com01868132010-08-24 19:21:17 +00001587 switch (internalformat)
1588 {
1589 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1590 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001591 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1592 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001593 break;
1594 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001596 }
1597
1598 if (border != 0)
1599 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001600 return gl::error(GL_INVALID_OPERATION);
1601 }
1602
1603 if (width != 1 && width != 2 && width % 4 != 0)
1604 {
1605 return gl::error(GL_INVALID_OPERATION);
1606 }
1607
1608 if (height != 1 && height != 2 && height % 4 != 0)
1609 {
1610 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001611 }
1612
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001613 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001614
1615 if (context)
1616 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001617 if (level > context->getMaximumTextureLevel())
1618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001619 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001620 }
1621
1622 switch (target)
1623 {
1624 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001625 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1626 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001628 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001629 }
1630 break;
1631 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1632 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1633 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1634 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1635 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1636 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1637 if (width != height)
1638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001640 }
1641
1642 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1643 height > (context->getMaximumCubeTextureDimension() >> level))
1644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001645 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001646 }
1647 break;
1648 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001650 }
1651
gman@chromium.org50c526d2011-08-10 05:19:44 +00001652 switch (internalformat) {
1653 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1654 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1655 if (!context->supportsDXT1Textures())
1656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001657 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 +00001658 }
1659 break;
1660 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1661 if (!context->supportsDXT3Textures())
1662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001663 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 +00001664 }
1665 break;
1666 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1667 if (!context->supportsDXT5Textures())
1668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001669 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 +00001670 }
1671 break;
1672 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001673 }
1674
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001675 if (imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001678 }
1679
1680 if (target == GL_TEXTURE_2D)
1681 {
1682 gl::Texture2D *texture = context->getTexture2D();
1683
1684 if (!texture)
1685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001687 }
1688
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001689 if (texture->isImmutable())
1690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001691 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001692 }
1693
daniel@transgaming.com01868132010-08-24 19:21:17 +00001694 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1695 }
1696 else
1697 {
1698 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1699
1700 if (!texture)
1701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001702 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001703 }
1704
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001705 if (texture->isImmutable())
1706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001707 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001708 }
1709
daniel@transgaming.com01868132010-08-24 19:21:17 +00001710 switch (target)
1711 {
1712 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1713 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1714 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1715 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1716 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1717 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1718 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1719 break;
1720 default: UNREACHABLE();
1721 }
1722 }
1723 }
1724
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001725 }
1726 catch(std::bad_alloc&)
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001729 }
1730}
1731
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001732void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1733 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001734{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001735 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001736 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001737 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001738 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1739
1740 try
1741 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001742 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001744 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001745 }
1746
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001747 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001750 }
1751
daniel@transgaming.com01868132010-08-24 19:21:17 +00001752 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001753 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001754 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1755 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001756 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1757 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001758 break;
1759 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001760 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001761 }
1762
daniel@transgaming.com01868132010-08-24 19:21:17 +00001763 if (width == 0 || height == 0 || data == NULL)
1764 {
1765 return;
1766 }
1767
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001769
1770 if (context)
1771 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001772 if (level > context->getMaximumTextureLevel())
1773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001774 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001775 }
1776
gman@chromium.org50c526d2011-08-10 05:19:44 +00001777 switch (format) {
1778 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1779 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1780 if (!context->supportsDXT1Textures())
1781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001782 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 +00001783 }
1784 break;
1785 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1786 if (!context->supportsDXT3Textures())
1787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001788 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 +00001789 }
1790 break;
1791 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1792 if (!context->supportsDXT5Textures())
1793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001794 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 +00001795 }
1796 break;
1797 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001798 }
1799
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001800 if (imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001802 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001803 }
1804
1805 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001807 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 +00001808 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001809 }
1810
1811 if (target == GL_TEXTURE_2D)
1812 {
1813 gl::Texture2D *texture = context->getTexture2D();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001814 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001815 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001816 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001817 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001818 }
1819 else if (gl::IsCubemapTextureTarget(target))
1820 {
1821 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001822 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001823 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001824 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001825 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001826 }
1827 else
1828 {
1829 UNREACHABLE();
1830 }
1831 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001832 }
1833 catch(std::bad_alloc&)
1834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836 }
1837}
1838
1839void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001841 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001842 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001843 target, level, internalformat, x, y, width, height, border);
1844
1845 try
1846 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001847 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001849 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001850 }
1851
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001852 if (border != 0)
1853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001855 }
1856
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001858
1859 if (context)
1860 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001861 if (level > context->getMaximumTextureLevel())
1862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001863 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001864 }
1865
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001866 switch (target)
1867 {
1868 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001869 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1870 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001872 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001873 }
1874 break;
1875 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1879 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1880 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1881 if (width != height)
1882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001883 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001884 }
1885
1886 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1887 height > (context->getMaximumCubeTextureDimension() >> level))
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001890 }
1891 break;
1892 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001893 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001894 }
1895
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001896 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001897
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001898 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001900 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001901 }
1902
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001903 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001905 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001906 }
1907
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001908 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001909 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001910
1911 // [OpenGL ES 2.0.24] table 3.9
1912 switch (internalformat)
1913 {
1914 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001915 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001916 colorbufferFormat != GL_RGBA4 &&
1917 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001918 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001919 colorbufferFormat != GL_RGBA8_OES)
1920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001921 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001922 }
1923 break;
1924 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001925 case GL_RGB:
1926 if (colorbufferFormat != GL_RGB565 &&
1927 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001928 colorbufferFormat != GL_RGBA4 &&
1929 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001930 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001931 colorbufferFormat != GL_RGBA8_OES)
1932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001933 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001934 }
1935 break;
1936 case GL_LUMINANCE_ALPHA:
1937 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001938 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001939 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001940 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001941 colorbufferFormat != GL_RGBA8_OES)
1942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001944 }
1945 break;
1946 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1947 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001948 if (context->supportsDXT1Textures())
1949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001950 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001951 }
1952 else
1953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001954 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001955 }
1956 break;
1957 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1958 if (context->supportsDXT3Textures())
1959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001961 }
1962 else
1963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001964 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001965 }
1966 break;
1967 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1968 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001970 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001971 }
1972 else
1973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001974 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001975 }
1976 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001977 case GL_DEPTH_COMPONENT:
1978 case GL_DEPTH_COMPONENT16:
1979 case GL_DEPTH_COMPONENT32_OES:
1980 case GL_DEPTH_STENCIL_OES:
1981 case GL_DEPTH24_STENCIL8_OES:
1982 if (context->supportsDepthTextures())
1983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001984 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001985 }
1986 else
1987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001988 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001989 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001992 }
1993
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001994 if (target == GL_TEXTURE_2D)
1995 {
1996 gl::Texture2D *texture = context->getTexture2D();
1997
1998 if (!texture)
1999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002000 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002001 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00002002
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002003 if (texture->isImmutable())
2004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002005 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002006 }
2007
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00002008 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002009 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002010 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002011 {
2012 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2013
2014 if (!texture)
2015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002016 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002017 }
2018
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002019 if (texture->isImmutable())
2020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002021 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002022 }
2023
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00002024 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002025 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002026 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002027 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002028 }
2029 catch(std::bad_alloc&)
2030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002031 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002032 }
2033}
2034
2035void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
2036{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002037 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002038 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 target, level, xoffset, yoffset, x, y, width, height);
2040
2041 try
2042 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00002043 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002045 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002046 }
2047
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002048 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002051 }
2052
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002053 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
2054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002055 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002056 }
2057
2058 if (width == 0 || height == 0)
2059 {
2060 return;
2061 }
2062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002063 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002064
2065 if (context)
2066 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002067 if (level > context->getMaximumTextureLevel())
2068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002069 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002070 }
2071
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002072 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002073
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002074 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
2075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002076 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002077 }
2078
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002079 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002081 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002082 }
2083
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002084 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00002085 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002086 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002087 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002088
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002089 if (target == GL_TEXTURE_2D)
2090 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002091 gl::Texture2D *tex2d = context->getTexture2D();
2092
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002093 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002094 {
2095 return; // error already registered by validateSubImageParams
2096 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002097 textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002098 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002099 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002100 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002101 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002102 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2103
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002104 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002105 {
2106 return; // error already registered by validateSubImageParams
2107 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002108 textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002109 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002110 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002111 else UNREACHABLE();
2112
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002113 // [OpenGL ES 2.0.24] table 3.9
2114 switch (textureFormat)
2115 {
2116 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002117 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002118 colorbufferFormat != GL_RGBA4 &&
2119 colorbufferFormat != GL_RGB5_A1 &&
2120 colorbufferFormat != GL_RGBA8_OES)
2121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002122 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002123 }
2124 break;
2125 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002126 case GL_RGB:
2127 if (colorbufferFormat != GL_RGB565 &&
2128 colorbufferFormat != GL_RGB8_OES &&
2129 colorbufferFormat != GL_RGBA4 &&
2130 colorbufferFormat != GL_RGB5_A1 &&
2131 colorbufferFormat != GL_RGBA8_OES)
2132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002133 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002134 }
2135 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002136 case GL_LUMINANCE_ALPHA:
2137 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002138 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002139 colorbufferFormat != GL_RGB5_A1 &&
2140 colorbufferFormat != GL_RGBA8_OES)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002143 }
2144 break;
2145 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2146 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002147 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2148 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002150 case GL_DEPTH_COMPONENT:
2151 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002153 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002154 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002155 }
2156
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002157 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002158 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161 catch(std::bad_alloc&)
2162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002163 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002164 }
2165}
2166
2167GLuint __stdcall glCreateProgram(void)
2168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002169 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170
2171 try
2172 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002173 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002174
2175 if (context)
2176 {
2177 return context->createProgram();
2178 }
2179 }
2180 catch(std::bad_alloc&)
2181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002182 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002183 }
2184
2185 return 0;
2186}
2187
2188GLuint __stdcall glCreateShader(GLenum type)
2189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002190 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002191
2192 try
2193 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002194 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195
2196 if (context)
2197 {
2198 switch (type)
2199 {
2200 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002201 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002202 return context->createShader(type);
2203 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002205 }
2206 }
2207 }
2208 catch(std::bad_alloc&)
2209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002210 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002211 }
2212
2213 return 0;
2214}
2215
2216void __stdcall glCullFace(GLenum mode)
2217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002218 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002219
2220 try
2221 {
2222 switch (mode)
2223 {
2224 case GL_FRONT:
2225 case GL_BACK:
2226 case GL_FRONT_AND_BACK:
2227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229
2230 if (context)
2231 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002232 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002233 }
2234 }
2235 break;
2236 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 }
2239 }
2240 catch(std::bad_alloc&)
2241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002242 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243 }
2244}
2245
2246void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2247{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002248 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249
2250 try
2251 {
2252 if (n < 0)
2253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002254 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255 }
2256
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258
2259 if (context)
2260 {
2261 for (int i = 0; i < n; i++)
2262 {
2263 context->deleteBuffer(buffers[i]);
2264 }
2265 }
2266 }
2267 catch(std::bad_alloc&)
2268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270 }
2271}
2272
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002273void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002275 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002276
2277 try
2278 {
2279 if (n < 0)
2280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002281 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002282 }
2283
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002284 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002285
2286 if (context)
2287 {
2288 for (int i = 0; i < n; i++)
2289 {
2290 context->deleteFence(fences[i]);
2291 }
2292 }
2293 }
2294 catch(std::bad_alloc&)
2295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002296 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002297 }
2298}
2299
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002300void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002302 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002303
2304 try
2305 {
2306 if (n < 0)
2307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002308 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002309 }
2310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312
2313 if (context)
2314 {
2315 for (int i = 0; i < n; i++)
2316 {
2317 if (framebuffers[i] != 0)
2318 {
2319 context->deleteFramebuffer(framebuffers[i]);
2320 }
2321 }
2322 }
2323 }
2324 catch(std::bad_alloc&)
2325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002326 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327 }
2328}
2329
2330void __stdcall glDeleteProgram(GLuint program)
2331{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002332 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333
2334 try
2335 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002336 if (program == 0)
2337 {
2338 return;
2339 }
2340
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002341 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002342
2343 if (context)
2344 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002345 if (!context->getProgram(program))
2346 {
2347 if(context->getShader(program))
2348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002349 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002350 }
2351 else
2352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002353 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002354 }
2355 }
2356
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 context->deleteProgram(program);
2358 }
2359 }
2360 catch(std::bad_alloc&)
2361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002362 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363 }
2364}
2365
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002366void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2367{
2368 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2369
2370 try
2371 {
2372 if (n < 0)
2373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002374 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002375 }
2376
2377 gl::Context *context = gl::getNonLostContext();
2378
2379 if (context)
2380 {
2381 for (int i = 0; i < n; i++)
2382 {
2383 context->deleteQuery(ids[i]);
2384 }
2385 }
2386 }
2387 catch(std::bad_alloc&)
2388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002389 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002390 }
2391}
2392
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002393void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2394{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002395 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396
2397 try
2398 {
2399 if (n < 0)
2400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002401 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402 }
2403
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002404 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002405
2406 if (context)
2407 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002408 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409 {
2410 context->deleteRenderbuffer(renderbuffers[i]);
2411 }
2412 }
2413 }
2414 catch(std::bad_alloc&)
2415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002416 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417 }
2418}
2419
2420void __stdcall glDeleteShader(GLuint shader)
2421{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002422 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423
2424 try
2425 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002426 if (shader == 0)
2427 {
2428 return;
2429 }
2430
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002431 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002432
2433 if (context)
2434 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002435 if (!context->getShader(shader))
2436 {
2437 if(context->getProgram(shader))
2438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002439 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002440 }
2441 else
2442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002444 }
2445 }
2446
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447 context->deleteShader(shader);
2448 }
2449 }
2450 catch(std::bad_alloc&)
2451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453 }
2454}
2455
2456void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002458 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459
2460 try
2461 {
2462 if (n < 0)
2463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002465 }
2466
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468
2469 if (context)
2470 {
2471 for (int i = 0; i < n; i++)
2472 {
2473 if (textures[i] != 0)
2474 {
2475 context->deleteTexture(textures[i]);
2476 }
2477 }
2478 }
2479 }
2480 catch(std::bad_alloc&)
2481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002482 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 }
2484}
2485
2486void __stdcall glDepthFunc(GLenum func)
2487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002488 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489
2490 try
2491 {
2492 switch (func)
2493 {
2494 case GL_NEVER:
2495 case GL_ALWAYS:
2496 case GL_LESS:
2497 case GL_LEQUAL:
2498 case GL_EQUAL:
2499 case GL_GREATER:
2500 case GL_GEQUAL:
2501 case GL_NOTEQUAL:
2502 break;
2503 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002504 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 }
2506
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002508
2509 if (context)
2510 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002511 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512 }
2513 }
2514 catch(std::bad_alloc&)
2515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002516 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 }
2518}
2519
2520void __stdcall glDepthMask(GLboolean flag)
2521{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002522 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523
2524 try
2525 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002526 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527
2528 if (context)
2529 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002530 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
2532 }
2533 catch(std::bad_alloc&)
2534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537}
2538
2539void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2540{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002541 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542
2543 try
2544 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002545 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002546
2547 if (context)
2548 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002549 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550 }
2551 }
2552 catch(std::bad_alloc&)
2553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555 }
2556}
2557
2558void __stdcall glDetachShader(GLuint program, GLuint shader)
2559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 try
2563 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002565
2566 if (context)
2567 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002568
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002569 gl::Program *programObject = context->getProgram(program);
2570 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002571
2572 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002573 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002574 gl::Shader *shaderByProgramHandle;
2575 shaderByProgramHandle = context->getShader(program);
2576 if (!shaderByProgramHandle)
2577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002579 }
2580 else
2581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002582 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002583 }
2584 }
2585
2586 if (!shaderObject)
2587 {
2588 gl::Program *programByShaderHandle = context->getProgram(shader);
2589 if (!programByShaderHandle)
2590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002591 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002592 }
2593 else
2594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002595 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002596 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002597 }
2598
2599 if (!programObject->detachShader(shaderObject))
2600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002601 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002603 }
2604 }
2605 catch(std::bad_alloc&)
2606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002607 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002608 }
2609}
2610
2611void __stdcall glDisable(GLenum cap)
2612{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002613 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002614
2615 try
2616 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002618
2619 if (context)
2620 {
2621 switch (cap)
2622 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002623 case GL_CULL_FACE: context->setCullFace(false); break;
2624 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2625 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2626 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2627 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2628 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2629 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2630 case GL_BLEND: context->setBlend(false); break;
2631 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002632 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634 }
2635 }
2636 }
2637 catch(std::bad_alloc&)
2638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002639 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002640 }
2641}
2642
2643void __stdcall glDisableVertexAttribArray(GLuint index)
2644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002645 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002646
2647 try
2648 {
2649 if (index >= gl::MAX_VERTEX_ATTRIBS)
2650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002652 }
2653
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002654 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002655
2656 if (context)
2657 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002658 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002659 }
2660 }
2661 catch(std::bad_alloc&)
2662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002663 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002664 }
2665}
2666
2667void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2668{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002669 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002670
2671 try
2672 {
2673 if (count < 0 || first < 0)
2674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002675 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002676 }
2677
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002678 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002679
2680 if (context)
2681 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002682 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002683 }
2684 }
2685 catch(std::bad_alloc&)
2686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002688 }
2689}
2690
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002691void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2692{
2693 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2694
2695 try
2696 {
2697 if (count < 0 || first < 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)
2707 {
2708 context->drawArrays(mode, first, count, primcount);
2709 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002710 }
2711 }
2712 catch(std::bad_alloc&)
2713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002714 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002715 }
2716}
2717
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002718void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002719{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002720 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 +00002721 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002722
2723 try
2724 {
2725 if (count < 0)
2726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728 }
2729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731
2732 if (context)
2733 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002734 switch (type)
2735 {
2736 case GL_UNSIGNED_BYTE:
2737 case GL_UNSIGNED_SHORT:
2738 break;
2739 case GL_UNSIGNED_INT:
2740 if (!context->supports32bitIndices())
2741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002743 }
2744 break;
2745 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002746 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002747 }
2748
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002749 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002750 }
2751 }
2752 catch(std::bad_alloc&)
2753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002754 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002755 }
2756}
2757
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002758void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2759{
2760 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2761 mode, count, type, indices, primcount);
2762
2763 try
2764 {
2765 if (count < 0 || primcount < 0)
2766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002767 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002768 }
2769
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002770 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002771 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002772 gl::Context *context = gl::getNonLostContext();
2773
2774 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002775 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002776 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002777 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002778 case GL_UNSIGNED_BYTE:
2779 case GL_UNSIGNED_SHORT:
2780 break;
2781 case GL_UNSIGNED_INT:
2782 if (!context->supports32bitIndices())
2783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002784 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002785 }
2786 break;
2787 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002789 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002790
2791 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002792 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002793 }
2794 }
2795 catch(std::bad_alloc&)
2796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002797 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002798 }
2799}
2800
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002801void __stdcall glEnable(GLenum cap)
2802{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002803 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002804
2805 try
2806 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002807 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002808
2809 if (context)
2810 {
2811 switch (cap)
2812 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002813 case GL_CULL_FACE: context->setCullFace(true); break;
2814 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2815 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2816 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2817 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2818 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2819 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2820 case GL_BLEND: context->setBlend(true); break;
2821 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002823 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824 }
2825 }
2826 }
2827 catch(std::bad_alloc&)
2828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002830 }
2831}
2832
2833void __stdcall glEnableVertexAttribArray(GLuint index)
2834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002835 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002836
2837 try
2838 {
2839 if (index >= gl::MAX_VERTEX_ATTRIBS)
2840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002841 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002842 }
2843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002845
2846 if (context)
2847 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002848 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002849 }
2850 }
2851 catch(std::bad_alloc&)
2852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002854 }
2855}
2856
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002857void __stdcall glEndQueryEXT(GLenum target)
2858{
2859 EVENT("GLenum target = 0x%X)", target);
2860
2861 try
2862 {
2863 switch (target)
2864 {
2865 case GL_ANY_SAMPLES_PASSED_EXT:
2866 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2867 break;
2868 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002869 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002870 }
2871
2872 gl::Context *context = gl::getNonLostContext();
2873
2874 if (context)
2875 {
2876 context->endQuery(target);
2877 }
2878 }
2879 catch(std::bad_alloc&)
2880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002881 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002882 }
2883}
2884
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002885void __stdcall glFinishFenceNV(GLuint fence)
2886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002887 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002888
2889 try
2890 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002891 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002892
2893 if (context)
2894 {
2895 gl::Fence* fenceObject = context->getFence(fence);
2896
2897 if (fenceObject == NULL)
2898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002899 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002900 }
2901
2902 fenceObject->finishFence();
2903 }
2904 }
2905 catch(std::bad_alloc&)
2906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002907 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002908 }
2909}
2910
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002911void __stdcall glFinish(void)
2912{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002913 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002914
2915 try
2916 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002917 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918
2919 if (context)
2920 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002921 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002922 }
2923 }
2924 catch(std::bad_alloc&)
2925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002926 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927 }
2928}
2929
2930void __stdcall glFlush(void)
2931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002932 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002933
2934 try
2935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937
2938 if (context)
2939 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002940 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002941 }
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 glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002951 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002952 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
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.com2fa45512011-10-04 18:43:18 +00002957 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002959 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002960 }
2961
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002962 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963
2964 if (context)
2965 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002966 gl::Framebuffer *framebuffer = NULL;
2967 GLuint framebufferHandle = 0;
2968 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2969 {
2970 framebuffer = context->getReadFramebuffer();
2971 framebufferHandle = context->getReadFramebufferHandle();
2972 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002973 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002974 {
2975 framebuffer = context->getDrawFramebuffer();
2976 framebufferHandle = context->getDrawFramebufferHandle();
2977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002978
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002979 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002981 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002982 }
2983
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002984 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002986 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2987
2988 if (colorAttachment >= context->getMaximumRenderTargets())
2989 {
2990 return gl::error(GL_INVALID_VALUE);
2991 }
2992
2993 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2994 }
2995 else
2996 {
2997 switch (attachment)
2998 {
2999 case GL_DEPTH_ATTACHMENT:
3000 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
3001 break;
3002 case GL_STENCIL_ATTACHMENT:
3003 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
3004 break;
3005 default:
3006 return gl::error(GL_INVALID_ENUM);
3007 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 }
3009 }
3010 }
3011 catch(std::bad_alloc&)
3012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003013 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003014 }
3015}
3016
3017void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
3018{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003019 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003020 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003021
3022 try
3023 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003024 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003026 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027 }
3028
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030
3031 if (context)
3032 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003033 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
3034 {
3035 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3036
3037 if (colorAttachment >= context->getMaximumRenderTargets())
3038 {
3039 return gl::error(GL_INVALID_VALUE);
3040 }
3041 }
3042 else
3043 {
3044 switch (attachment)
3045 {
3046 case GL_DEPTH_ATTACHMENT:
3047 case GL_STENCIL_ATTACHMENT:
3048 break;
3049 default:
3050 return gl::error(GL_INVALID_ENUM);
3051 }
3052 }
3053
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003054 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003055 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003056 textarget = GL_NONE;
3057 }
3058 else
3059 {
3060 gl::Texture *tex = context->getTexture(texture);
3061
3062 if (tex == NULL)
3063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003064 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003065 }
3066
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 switch (textarget)
3068 {
3069 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003070 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003071 if (tex->getTarget() != GL_TEXTURE_2D)
3072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003073 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003074 }
3075 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003076 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003079 }
3080 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003082
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003083 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003084 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003085 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003087 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003089 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003090 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003092 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003093 }
3094 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003095 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003097 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003098 }
3099 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003100 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003101
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003103 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104 }
3105
3106 if (level != 0)
3107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003108 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003109 }
3110 }
3111
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003112 gl::Framebuffer *framebuffer = NULL;
3113 GLuint framebufferHandle = 0;
3114 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3115 {
3116 framebuffer = context->getReadFramebuffer();
3117 framebufferHandle = context->getReadFramebufferHandle();
3118 }
3119 else
3120 {
3121 framebuffer = context->getDrawFramebuffer();
3122 framebufferHandle = context->getDrawFramebufferHandle();
3123 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003124
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003125 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003127 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003128 }
3129
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003130 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003131 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003132 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3133
3134 if (colorAttachment >= context->getMaximumRenderTargets())
3135 {
3136 return gl::error(GL_INVALID_VALUE);
3137 }
3138
3139 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3140 }
3141 else
3142 {
3143 switch (attachment)
3144 {
3145 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3146 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3147 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003148 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149 }
3150 }
3151 catch(std::bad_alloc&)
3152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003154 }
3155}
3156
3157void __stdcall glFrontFace(GLenum mode)
3158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003159 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003160
3161 try
3162 {
3163 switch (mode)
3164 {
3165 case GL_CW:
3166 case GL_CCW:
3167 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003168 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169
3170 if (context)
3171 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003172 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173 }
3174 }
3175 break;
3176 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003177 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003178 }
3179 }
3180 catch(std::bad_alloc&)
3181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003183 }
3184}
3185
3186void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003188 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189
3190 try
3191 {
3192 if (n < 0)
3193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003194 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003195 }
3196
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003198
3199 if (context)
3200 {
3201 for (int i = 0; i < n; i++)
3202 {
3203 buffers[i] = context->createBuffer();
3204 }
3205 }
3206 }
3207 catch(std::bad_alloc&)
3208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003210 }
3211}
3212
3213void __stdcall glGenerateMipmap(GLenum target)
3214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003215 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003216
3217 try
3218 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003219 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003220
3221 if (context)
3222 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003223 switch (target)
3224 {
3225 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003226 {
3227 gl::Texture2D *tex2d = context->getTexture2D();
3228
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003229 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003231 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003232 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003233 if (tex2d->isDepth(0))
3234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003235 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003236 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003237
3238 tex2d->generateMipmaps();
3239 break;
3240 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003241
3242 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003243 {
3244 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3245
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003246 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003248 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003249 }
3250
3251 texcube->generateMipmaps();
3252 break;
3253 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003254
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003255 case GL_TEXTURE_3D:
3256 {
3257 if (context->getClientVersion() < 3)
3258 {
3259 return gl::error(GL_INVALID_ENUM);
3260 }
3261
3262 gl::Texture3D *tex3D = context->getTexture3D();
3263 if (tex3D->isCompressed(0))
3264 {
3265 return gl::error(GL_INVALID_OPERATION);
3266 }
3267
3268 tex3D->generateMipmaps();
3269 break;
3270 }
3271
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003272 case GL_TEXTURE_2D_ARRAY:
3273 {
3274 if (context->getClientVersion() < 3)
3275 {
3276 return gl::error(GL_INVALID_ENUM);
3277 }
3278
3279 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3280 if (tex2darr->isCompressed(0))
3281 {
3282 return gl::error(GL_INVALID_OPERATION);
3283 }
3284
3285 tex2darr->generateMipmaps();
3286 break;
3287 }
3288
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003289 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003290 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003291 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003292 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003293 }
3294 catch(std::bad_alloc&)
3295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003296 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 }
3298}
3299
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003300void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003302 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003303
3304 try
3305 {
3306 if (n < 0)
3307 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003308 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003309 }
3310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003311 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003312
3313 if (context)
3314 {
3315 for (int i = 0; i < n; i++)
3316 {
3317 fences[i] = context->createFence();
3318 }
3319 }
3320 }
3321 catch(std::bad_alloc&)
3322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003323 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003324 }
3325}
3326
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003327void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3328{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003329 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003330
3331 try
3332 {
3333 if (n < 0)
3334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003335 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336 }
3337
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003338 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003339
3340 if (context)
3341 {
3342 for (int i = 0; i < n; i++)
3343 {
3344 framebuffers[i] = context->createFramebuffer();
3345 }
3346 }
3347 }
3348 catch(std::bad_alloc&)
3349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
3352}
3353
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003354void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3355{
3356 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3357
3358 try
3359 {
3360 if (n < 0)
3361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003362 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003363 }
3364
3365 gl::Context *context = gl::getNonLostContext();
3366
3367 if (context)
3368 {
3369 for (int i = 0; i < n; i++)
3370 {
3371 ids[i] = context->createQuery();
3372 }
3373 }
3374 }
3375 catch(std::bad_alloc&)
3376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003378 }
3379}
3380
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003381void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003383 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003384
3385 try
3386 {
3387 if (n < 0)
3388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003389 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003390 }
3391
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003392 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003393
3394 if (context)
3395 {
3396 for (int i = 0; i < n; i++)
3397 {
3398 renderbuffers[i] = context->createRenderbuffer();
3399 }
3400 }
3401 }
3402 catch(std::bad_alloc&)
3403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003404 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405 }
3406}
3407
3408void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003410 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411
3412 try
3413 {
3414 if (n < 0)
3415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003416 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003417 }
3418
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003419 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420
3421 if (context)
3422 {
3423 for (int i = 0; i < n; i++)
3424 {
3425 textures[i] = context->createTexture();
3426 }
3427 }
3428 }
3429 catch(std::bad_alloc&)
3430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432 }
3433}
3434
daniel@transgaming.com85423182010-04-22 13:35:27 +00003435void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003437 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003438 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003439 program, index, bufsize, length, size, type, name);
3440
3441 try
3442 {
3443 if (bufsize < 0)
3444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003445 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003446 }
3447
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003449
3450 if (context)
3451 {
3452 gl::Program *programObject = context->getProgram(program);
3453
3454 if (!programObject)
3455 {
3456 if (context->getShader(program))
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003459 }
3460 else
3461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003462 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003463 }
3464 }
3465
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003466 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003469 }
3470
3471 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003473 }
3474 catch(std::bad_alloc&)
3475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003477 }
3478}
3479
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003480void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003481{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003482 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003483 "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 +00003484 program, index, bufsize, length, size, type, name);
3485
3486 try
3487 {
3488 if (bufsize < 0)
3489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003490 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003491 }
3492
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003493 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003494
3495 if (context)
3496 {
3497 gl::Program *programObject = context->getProgram(program);
3498
3499 if (!programObject)
3500 {
3501 if (context->getShader(program))
3502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003503 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003504 }
3505 else
3506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003508 }
3509 }
3510
3511 if (index >= (GLuint)programObject->getActiveUniformCount())
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003514 }
3515
3516 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003518 }
3519 catch(std::bad_alloc&)
3520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003521 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003522 }
3523}
3524
3525void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003527 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 +00003528 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003529
3530 try
3531 {
3532 if (maxcount < 0)
3533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003534 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 }
3536
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003538
3539 if (context)
3540 {
3541 gl::Program *programObject = context->getProgram(program);
3542
3543 if (!programObject)
3544 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003545 if (context->getShader(program))
3546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003547 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003548 }
3549 else
3550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003552 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003553 }
3554
3555 return programObject->getAttachedShaders(maxcount, count, shaders);
3556 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003557 }
3558 catch(std::bad_alloc&)
3559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003560 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003561 }
3562}
3563
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003564int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003565{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003566 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003567
3568 try
3569 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003570 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003571
3572 if (context)
3573 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003574
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003575 gl::Program *programObject = context->getProgram(program);
3576
3577 if (!programObject)
3578 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003579 if (context->getShader(program))
3580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003581 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003582 }
3583 else
3584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003586 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003587 }
3588
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003589 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003590 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003592 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003593 }
3594
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003595 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003596 }
3597 }
3598 catch(std::bad_alloc&)
3599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003600 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003601 }
3602
3603 return -1;
3604}
3605
3606void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003608 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003609
3610 try
3611 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003613
3614 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003615 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003616 if (!(context->getBooleanv(pname, params)))
3617 {
3618 GLenum nativeType;
3619 unsigned int numParams = 0;
3620 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003622
3623 if (numParams == 0)
3624 return; // it is known that the pname is valid, but there are no parameters to return
3625
3626 if (nativeType == GL_FLOAT)
3627 {
3628 GLfloat *floatParams = NULL;
3629 floatParams = new GLfloat[numParams];
3630
3631 context->getFloatv(pname, floatParams);
3632
3633 for (unsigned int i = 0; i < numParams; ++i)
3634 {
3635 if (floatParams[i] == 0.0f)
3636 params[i] = GL_FALSE;
3637 else
3638 params[i] = GL_TRUE;
3639 }
3640
3641 delete [] floatParams;
3642 }
3643 else if (nativeType == GL_INT)
3644 {
3645 GLint *intParams = NULL;
3646 intParams = new GLint[numParams];
3647
3648 context->getIntegerv(pname, intParams);
3649
3650 for (unsigned int i = 0; i < numParams; ++i)
3651 {
3652 if (intParams[i] == 0)
3653 params[i] = GL_FALSE;
3654 else
3655 params[i] = GL_TRUE;
3656 }
3657
3658 delete [] intParams;
3659 }
3660 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003661 }
3662 }
3663 catch(std::bad_alloc&)
3664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003665 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003666 }
3667}
3668
3669void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003671 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 +00003672
3673 try
3674 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003675 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003676
3677 if (context)
3678 {
3679 gl::Buffer *buffer;
3680
3681 switch (target)
3682 {
3683 case GL_ARRAY_BUFFER:
3684 buffer = context->getArrayBuffer();
3685 break;
3686 case GL_ELEMENT_ARRAY_BUFFER:
3687 buffer = context->getElementArrayBuffer();
3688 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003689 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003690 }
3691
3692 if (!buffer)
3693 {
3694 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003695 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003696 }
3697
3698 switch (pname)
3699 {
3700 case GL_BUFFER_USAGE:
3701 *params = buffer->usage();
3702 break;
3703 case GL_BUFFER_SIZE:
3704 *params = buffer->size();
3705 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003706 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003707 }
3708 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003709 }
3710 catch(std::bad_alloc&)
3711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003713 }
3714}
3715
3716GLenum __stdcall glGetError(void)
3717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003718 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003719
3720 gl::Context *context = gl::getContext();
3721
3722 if (context)
3723 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003724 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725 }
3726
3727 return GL_NO_ERROR;
3728}
3729
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003730void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3731{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003732 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003733
3734 try
3735 {
3736
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003737 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003738
3739 if (context)
3740 {
3741 gl::Fence *fenceObject = context->getFence(fence);
3742
3743 if (fenceObject == NULL)
3744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003745 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003746 }
3747
3748 fenceObject->getFenceiv(pname, params);
3749 }
3750 }
3751 catch(std::bad_alloc&)
3752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003753 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003754 }
3755}
3756
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003757void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3758{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003759 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760
3761 try
3762 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003764
3765 if (context)
3766 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003767 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003768 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003769 GLenum nativeType;
3770 unsigned int numParams = 0;
3771 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003773
3774 if (numParams == 0)
3775 return; // it is known that the pname is valid, but that there are no parameters to return.
3776
3777 if (nativeType == GL_BOOL)
3778 {
3779 GLboolean *boolParams = NULL;
3780 boolParams = new GLboolean[numParams];
3781
3782 context->getBooleanv(pname, boolParams);
3783
3784 for (unsigned int i = 0; i < numParams; ++i)
3785 {
3786 if (boolParams[i] == GL_FALSE)
3787 params[i] = 0.0f;
3788 else
3789 params[i] = 1.0f;
3790 }
3791
3792 delete [] boolParams;
3793 }
3794 else if (nativeType == GL_INT)
3795 {
3796 GLint *intParams = NULL;
3797 intParams = new GLint[numParams];
3798
3799 context->getIntegerv(pname, intParams);
3800
3801 for (unsigned int i = 0; i < numParams; ++i)
3802 {
3803 params[i] = (GLfloat)intParams[i];
3804 }
3805
3806 delete [] intParams;
3807 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003808 }
3809 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003810 }
3811 catch(std::bad_alloc&)
3812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003814 }
3815}
3816
3817void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003819 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 +00003820 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003821
3822 try
3823 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003825
3826 if (context)
3827 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003828 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003830 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003831 }
3832
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003833 gl::Framebuffer *framebuffer = NULL;
3834 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3835 {
3836 if(context->getReadFramebufferHandle() == 0)
3837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003838 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003839 }
3840
3841 framebuffer = context->getReadFramebuffer();
3842 }
3843 else
3844 {
3845 if (context->getDrawFramebufferHandle() == 0)
3846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003847 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003848 }
3849
3850 framebuffer = context->getDrawFramebuffer();
3851 }
3852
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003853 GLenum attachmentType;
3854 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003855
3856 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003857 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003858 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3859
3860 if (colorAttachment >= context->getMaximumRenderTargets())
3861 {
3862 return gl::error(GL_INVALID_ENUM);
3863 }
3864
3865 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3866 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3867 }
3868 else
3869 {
3870 switch (attachment)
3871 {
3872 case GL_DEPTH_ATTACHMENT:
3873 attachmentType = framebuffer->getDepthbufferType();
3874 attachmentHandle = framebuffer->getDepthbufferHandle();
3875 break;
3876 case GL_STENCIL_ATTACHMENT:
3877 attachmentType = framebuffer->getStencilbufferType();
3878 attachmentHandle = framebuffer->getStencilbufferHandle();
3879 break;
3880 default: return gl::error(GL_INVALID_ENUM);
3881 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003882 }
3883
3884 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003885 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003886 {
3887 attachmentObjectType = attachmentType;
3888 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003889 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003890 {
3891 attachmentObjectType = GL_TEXTURE;
3892 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003893 else
3894 {
3895 UNREACHABLE();
3896 return;
3897 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003898
3899 switch (pname)
3900 {
3901 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3902 *params = attachmentObjectType;
3903 break;
3904 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3905 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3906 {
3907 *params = attachmentHandle;
3908 }
3909 else
3910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003911 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003912 }
3913 break;
3914 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3915 if (attachmentObjectType == GL_TEXTURE)
3916 {
3917 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3918 }
3919 else
3920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003921 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003922 }
3923 break;
3924 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3925 if (attachmentObjectType == GL_TEXTURE)
3926 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003927 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003928 {
3929 *params = attachmentType;
3930 }
3931 else
3932 {
3933 *params = 0;
3934 }
3935 }
3936 else
3937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003938 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003939 }
3940 break;
3941 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003942 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003943 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003944 }
3945 }
3946 catch(std::bad_alloc&)
3947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003949 }
3950}
3951
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003952GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3953{
3954 EVENT("()");
3955
3956 try
3957 {
3958 gl::Context *context = gl::getContext();
3959
3960 if (context)
3961 {
3962 return context->getResetStatus();
3963 }
3964
3965 return GL_NO_ERROR;
3966 }
3967 catch(std::bad_alloc&)
3968 {
3969 return GL_OUT_OF_MEMORY;
3970 }
3971}
3972
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3974{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003975 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003976
3977 try
3978 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003979 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003980
3981 if (context)
3982 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003983 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003985 GLenum nativeType;
3986 unsigned int numParams = 0;
3987 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003988 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003989
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003990 if (numParams == 0)
3991 return; // it is known that pname is valid, but there are no parameters to return
3992
3993 if (nativeType == GL_BOOL)
3994 {
3995 GLboolean *boolParams = NULL;
3996 boolParams = new GLboolean[numParams];
3997
3998 context->getBooleanv(pname, boolParams);
3999
4000 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004002 if (boolParams[i] == GL_FALSE)
4003 params[i] = 0;
4004 else
4005 params[i] = 1;
4006 }
4007
4008 delete [] boolParams;
4009 }
4010 else if (nativeType == GL_FLOAT)
4011 {
4012 GLfloat *floatParams = NULL;
4013 floatParams = new GLfloat[numParams];
4014
4015 context->getFloatv(pname, floatParams);
4016
4017 for (unsigned int i = 0; i < numParams; ++i)
4018 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00004019 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 +00004020 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004021 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004023 else
4024 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 +00004025 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004026
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004027 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029 }
4030 }
4031 }
4032 catch(std::bad_alloc&)
4033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004034 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035 }
4036}
4037
4038void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
4039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004040 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004041
4042 try
4043 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004044 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045
4046 if (context)
4047 {
4048 gl::Program *programObject = context->getProgram(program);
4049
4050 if (!programObject)
4051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004052 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004053 }
4054
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004055 if (context->getClientVersion() < 3)
4056 {
4057 switch (pname)
4058 {
4059 case GL_ACTIVE_UNIFORM_BLOCKS:
4060 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4061 return gl::error(GL_INVALID_ENUM);
4062 }
4063 }
4064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004065 switch (pname)
4066 {
4067 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004068 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004069 return;
4070 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004071 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004072 return;
4073 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004074 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075 return;
4076 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004077 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004078 return;
4079 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004080 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004081 return;
4082 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004083 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004084 return;
4085 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004086 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004087 return;
4088 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004089 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004090 return;
4091 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004092 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004094 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004095 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004096 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004097 case GL_ACTIVE_UNIFORM_BLOCKS:
4098 *params = programObject->getActiveUniformBlockCount();
4099 return;
4100 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4101 *params = programObject->getActiveUniformBlockMaxLength();
4102 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004104 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105 }
4106 }
4107 }
4108 catch(std::bad_alloc&)
4109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004110 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111 }
4112}
4113
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004114void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004116 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 +00004117 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004118
4119 try
4120 {
4121 if (bufsize < 0)
4122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004123 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 }
4125
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004126 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004127
4128 if (context)
4129 {
4130 gl::Program *programObject = context->getProgram(program);
4131
4132 if (!programObject)
4133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004134 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004135 }
4136
4137 programObject->getInfoLog(bufsize, length, infolog);
4138 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004139 }
4140 catch(std::bad_alloc&)
4141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004142 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004143 }
4144}
4145
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004146void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4147{
4148 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4149
4150 try
4151 {
4152 switch (pname)
4153 {
4154 case GL_CURRENT_QUERY_EXT:
4155 break;
4156 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004157 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004158 }
4159
4160 gl::Context *context = gl::getNonLostContext();
4161
4162 if (context)
4163 {
4164 params[0] = context->getActiveQuery(target);
4165 }
4166 }
4167 catch(std::bad_alloc&)
4168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004170 }
4171}
4172
4173void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4174{
4175 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4176
4177 try
4178 {
4179 switch (pname)
4180 {
4181 case GL_QUERY_RESULT_EXT:
4182 case GL_QUERY_RESULT_AVAILABLE_EXT:
4183 break;
4184 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004185 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004186 }
4187 gl::Context *context = gl::getNonLostContext();
4188
4189 if (context)
4190 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004191 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4192
4193 if (!queryObject)
4194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004195 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004196 }
4197
4198 if (context->getActiveQuery(queryObject->getType()) == id)
4199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004200 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004201 }
4202
4203 switch(pname)
4204 {
4205 case GL_QUERY_RESULT_EXT:
4206 params[0] = queryObject->getResult();
4207 break;
4208 case GL_QUERY_RESULT_AVAILABLE_EXT:
4209 params[0] = queryObject->isResultAvailable();
4210 break;
4211 default:
4212 ASSERT(false);
4213 }
4214 }
4215 }
4216 catch(std::bad_alloc&)
4217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004218 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004219 }
4220}
4221
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4223{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004224 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 +00004225
4226 try
4227 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004229
4230 if (context)
4231 {
4232 if (target != GL_RENDERBUFFER)
4233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004235 }
4236
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004237 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004239 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004240 }
4241
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004242 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004243
4244 switch (pname)
4245 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004246 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4247 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4248 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4249 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4250 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4251 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4252 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4253 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4254 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004255 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004256 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004257 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004258 *params = renderbuffer->getSamples();
4259 }
4260 else
4261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004262 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004263 }
4264 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004265 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004266 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004267 }
4268 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269 }
4270 catch(std::bad_alloc&)
4271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004272 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 }
4274}
4275
4276void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4277{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004278 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004279
4280 try
4281 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004282 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004283
4284 if (context)
4285 {
4286 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004287
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288 if (!shaderObject)
4289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291 }
4292
4293 switch (pname)
4294 {
4295 case GL_SHADER_TYPE:
4296 *params = shaderObject->getType();
4297 return;
4298 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004299 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300 return;
4301 case GL_COMPILE_STATUS:
4302 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4303 return;
4304 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004305 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004306 return;
4307 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004308 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004309 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004310 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4311 *params = shaderObject->getTranslatedSourceLength();
4312 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004313 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004314 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004315 }
4316 }
4317 }
4318 catch(std::bad_alloc&)
4319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004320 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322}
4323
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004324void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004326 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 +00004327 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004328
4329 try
4330 {
4331 if (bufsize < 0)
4332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004333 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 }
4335
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004336 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004337
4338 if (context)
4339 {
4340 gl::Shader *shaderObject = context->getShader(shader);
4341
4342 if (!shaderObject)
4343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004344 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004345 }
4346
4347 shaderObject->getInfoLog(bufsize, length, infolog);
4348 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349 }
4350 catch(std::bad_alloc&)
4351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353 }
4354}
4355
4356void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004358 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 +00004359 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360
4361 try
4362 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004363 switch (shadertype)
4364 {
4365 case GL_VERTEX_SHADER:
4366 case GL_FRAGMENT_SHADER:
4367 break;
4368 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004369 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004370 }
4371
4372 switch (precisiontype)
4373 {
4374 case GL_LOW_FLOAT:
4375 case GL_MEDIUM_FLOAT:
4376 case GL_HIGH_FLOAT:
4377 // Assume IEEE 754 precision
4378 range[0] = 127;
4379 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004380 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004381 break;
4382 case GL_LOW_INT:
4383 case GL_MEDIUM_INT:
4384 case GL_HIGH_INT:
4385 // Some (most) hardware only supports single-precision floating-point numbers,
4386 // which can accurately represent integers up to +/-16777216
4387 range[0] = 24;
4388 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004389 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004390 break;
4391 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004394 }
4395 catch(std::bad_alloc&)
4396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004398 }
4399}
4400
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004401void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004403 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 +00004404 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004405
4406 try
4407 {
4408 if (bufsize < 0)
4409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411 }
4412
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004413 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004414
4415 if (context)
4416 {
4417 gl::Shader *shaderObject = context->getShader(shader);
4418
4419 if (!shaderObject)
4420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004421 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004422 }
4423
4424 shaderObject->getSource(bufsize, length, source);
4425 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426 }
4427 catch(std::bad_alloc&)
4428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430 }
4431}
4432
zmo@google.coma574f782011-10-03 21:45:23 +00004433void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4434{
4435 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4436 shader, bufsize, length, source);
4437
4438 try
4439 {
4440 if (bufsize < 0)
4441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004442 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004443 }
4444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004445 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004446
4447 if (context)
4448 {
4449 gl::Shader *shaderObject = context->getShader(shader);
4450
4451 if (!shaderObject)
4452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004453 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004454 }
4455
4456 shaderObject->getTranslatedSource(bufsize, length, source);
4457 }
4458 }
4459 catch(std::bad_alloc&)
4460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004461 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004462 }
4463}
4464
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004465const GLubyte* __stdcall glGetString(GLenum name)
4466{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004467 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468
4469 try
4470 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004471 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004472
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004473 switch (name)
4474 {
4475 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004476 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004477 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004478 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004479 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004480 if (context->getClientVersion() == 2)
4481 {
4482 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4483 }
4484 else
4485 {
4486 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4487 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004488 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004489 if (context->getClientVersion() == 2)
4490 {
4491 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4492 }
4493 else
4494 {
4495 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4496 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004498 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004499 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004500 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501 }
4502 }
4503 catch(std::bad_alloc&)
4504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004505 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004506 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507}
4508
4509void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4510{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004511 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 +00004512
4513 try
4514 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004515 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004516
4517 if (context)
4518 {
4519 gl::Texture *texture;
4520
4521 switch (target)
4522 {
4523 case GL_TEXTURE_2D:
4524 texture = context->getTexture2D();
4525 break;
4526 case GL_TEXTURE_CUBE_MAP:
4527 texture = context->getTextureCubeMap();
4528 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004529 case GL_TEXTURE_3D:
4530 if (context->getClientVersion() < 3)
4531 {
4532 return gl::error(GL_INVALID_ENUM);
4533 }
4534 texture = context->getTexture3D();
4535 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004536 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004538 }
4539
4540 switch (pname)
4541 {
4542 case GL_TEXTURE_MAG_FILTER:
4543 *params = (GLfloat)texture->getMagFilter();
4544 break;
4545 case GL_TEXTURE_MIN_FILTER:
4546 *params = (GLfloat)texture->getMinFilter();
4547 break;
4548 case GL_TEXTURE_WRAP_S:
4549 *params = (GLfloat)texture->getWrapS();
4550 break;
4551 case GL_TEXTURE_WRAP_T:
4552 *params = (GLfloat)texture->getWrapT();
4553 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004554 case GL_TEXTURE_WRAP_R:
4555 if (context->getClientVersion() < 3)
4556 {
4557 return gl::error(GL_INVALID_ENUM);
4558 }
4559 *params = (GLfloat)texture->getWrapR();
4560 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004561 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4562 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4563 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004564 case GL_TEXTURE_USAGE_ANGLE:
4565 *params = (GLfloat)texture->getUsage();
4566 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004567 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4568 if (!context->supportsTextureFilterAnisotropy())
4569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004570 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004571 }
4572 *params = (GLfloat)texture->getMaxAnisotropy();
4573 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004574 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004575 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004576 }
4577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 }
4579 catch(std::bad_alloc&)
4580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004581 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582 }
4583}
4584
4585void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004587 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 +00004588
4589 try
4590 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004592
4593 if (context)
4594 {
4595 gl::Texture *texture;
4596
4597 switch (target)
4598 {
4599 case GL_TEXTURE_2D:
4600 texture = context->getTexture2D();
4601 break;
4602 case GL_TEXTURE_CUBE_MAP:
4603 texture = context->getTextureCubeMap();
4604 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004605 case GL_TEXTURE_3D:
4606 if (context->getClientVersion() < 3)
4607 {
4608 return gl::error(GL_INVALID_ENUM);
4609 }
4610 texture = context->getTexture3D();
4611 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004612 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004613 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004614 }
4615
4616 switch (pname)
4617 {
4618 case GL_TEXTURE_MAG_FILTER:
4619 *params = texture->getMagFilter();
4620 break;
4621 case GL_TEXTURE_MIN_FILTER:
4622 *params = texture->getMinFilter();
4623 break;
4624 case GL_TEXTURE_WRAP_S:
4625 *params = texture->getWrapS();
4626 break;
4627 case GL_TEXTURE_WRAP_T:
4628 *params = texture->getWrapT();
4629 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004630 case GL_TEXTURE_WRAP_R:
4631 if (context->getClientVersion() < 3)
4632 {
4633 return gl::error(GL_INVALID_ENUM);
4634 }
4635 *params = texture->getWrapR();
4636 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004637 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4638 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4639 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004640 case GL_TEXTURE_USAGE_ANGLE:
4641 *params = texture->getUsage();
4642 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004643 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4644 if (!context->supportsTextureFilterAnisotropy())
4645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004646 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004647 }
4648 *params = (GLint)texture->getMaxAnisotropy();
4649 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004650 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004651 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004652 }
4653 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004654 }
4655 catch(std::bad_alloc&)
4656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004658 }
4659}
4660
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004661void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4662{
4663 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4664 program, location, bufSize, params);
4665
4666 try
4667 {
4668 if (bufSize < 0)
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004671 }
4672
4673 gl::Context *context = gl::getNonLostContext();
4674
4675 if (context)
4676 {
4677 if (program == 0)
4678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004680 }
4681
4682 gl::Program *programObject = context->getProgram(program);
4683
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004684 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004686 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004687 }
4688
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004689 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4690 if (!programBinary)
4691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004692 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004693 }
4694
4695 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004697 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004698 }
4699 }
4700 }
4701 catch(std::bad_alloc&)
4702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004704 }
4705}
4706
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004707void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004709 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004710
4711 try
4712 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004713 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004714
4715 if (context)
4716 {
4717 if (program == 0)
4718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004720 }
4721
4722 gl::Program *programObject = context->getProgram(program);
4723
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004724 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004726 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004727 }
4728
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004729 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4730 if (!programBinary)
4731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004732 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004733 }
4734
4735 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004737 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004738 }
4739 }
4740 }
4741 catch(std::bad_alloc&)
4742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004744 }
4745}
4746
4747void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4748{
4749 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4750 program, location, bufSize, params);
4751
4752 try
4753 {
4754 if (bufSize < 0)
4755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004756 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004757 }
4758
4759 gl::Context *context = gl::getNonLostContext();
4760
4761 if (context)
4762 {
4763 if (program == 0)
4764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004766 }
4767
4768 gl::Program *programObject = context->getProgram(program);
4769
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004770 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004773 }
4774
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004775 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4776 if (!programBinary)
4777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004778 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004779 }
4780
4781 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004783 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004784 }
4785 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787 catch(std::bad_alloc&)
4788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004789 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 }
4791}
4792
4793void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004795 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796
4797 try
4798 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004800
4801 if (context)
4802 {
4803 if (program == 0)
4804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004806 }
4807
4808 gl::Program *programObject = context->getProgram(program);
4809
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004810 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004812 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004813 }
4814
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004815 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4816 if (!programBinary)
4817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004818 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004819 }
4820
4821 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004823 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004824 }
4825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004826 }
4827 catch(std::bad_alloc&)
4828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 }
4831}
4832
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004833int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004835 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836
4837 try
4838 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004839 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004840
4841 if (strstr(name, "gl_") == name)
4842 {
4843 return -1;
4844 }
4845
4846 if (context)
4847 {
4848 gl::Program *programObject = context->getProgram(program);
4849
4850 if (!programObject)
4851 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004852 if (context->getShader(program))
4853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004854 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004855 }
4856 else
4857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004858 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004859 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 }
4861
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004862 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004863 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004865 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004866 }
4867
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004868 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870 }
4871 catch(std::bad_alloc&)
4872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004873 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004874 }
4875
4876 return -1;
4877}
4878
4879void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004881 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004882
4883 try
4884 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886
daniel@transgaming.come0078962010-04-15 20:45:08 +00004887 if (context)
4888 {
4889 if (index >= gl::MAX_VERTEX_ATTRIBS)
4890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004891 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004892 }
4893
daniel@transgaming.com83921382011-01-08 05:46:00 +00004894 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004895
daniel@transgaming.come0078962010-04-15 20:45:08 +00004896 switch (pname)
4897 {
4898 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004899 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004900 break;
4901 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004902 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004903 break;
4904 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004905 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004906 break;
4907 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004908 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004909 break;
4910 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004911 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004912 break;
4913 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004914 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004915 break;
4916 case GL_CURRENT_VERTEX_ATTRIB:
4917 for (int i = 0; i < 4; ++i)
4918 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004919 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004920 }
4921 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004922 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4923 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4924 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004925 *params = (GLfloat)attribState.mDivisor;
4926 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004927 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004928 }
4929 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004930 }
4931 catch(std::bad_alloc&)
4932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004933 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934 }
4935}
4936
4937void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4938{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004939 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940
4941 try
4942 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004943 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944
daniel@transgaming.come0078962010-04-15 20:45:08 +00004945 if (context)
4946 {
4947 if (index >= gl::MAX_VERTEX_ATTRIBS)
4948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004950 }
4951
daniel@transgaming.com83921382011-01-08 05:46:00 +00004952 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004953
daniel@transgaming.come0078962010-04-15 20:45:08 +00004954 switch (pname)
4955 {
4956 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004957 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004958 break;
4959 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004960 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004961 break;
4962 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004963 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004964 break;
4965 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004966 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004967 break;
4968 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004969 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004970 break;
4971 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004972 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004973 break;
4974 case GL_CURRENT_VERTEX_ATTRIB:
4975 for (int i = 0; i < 4; ++i)
4976 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004977 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004978 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4979 }
4980 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004981 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4982 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4983 // the same constant.
4984 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004985 *params = (GLint)attribState.mDivisor;
4986 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004987 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004988 }
4989 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004990 }
4991 catch(std::bad_alloc&)
4992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004993 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004994 }
4995}
4996
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004997void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004999 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005000
5001 try
5002 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005003 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005004
daniel@transgaming.come0078962010-04-15 20:45:08 +00005005 if (context)
5006 {
5007 if (index >= gl::MAX_VERTEX_ATTRIBS)
5008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005009 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005010 }
5011
5012 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
5013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005014 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005015 }
5016
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005017 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00005018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005019 }
5020 catch(std::bad_alloc&)
5021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005022 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005023 }
5024}
5025
5026void __stdcall glHint(GLenum target, GLenum mode)
5027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005028 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005029
5030 try
5031 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005032 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005033 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005034 case GL_FASTEST:
5035 case GL_NICEST:
5036 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005037 break;
5038 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005039 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005040 }
5041
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005042 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005043 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005044 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005045 case GL_GENERATE_MIPMAP_HINT:
5046 if (context) context->setGenerateMipmapHint(mode);
5047 break;
5048 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
5049 if (context) context->setFragmentShaderDerivativeHint(mode);
5050 break;
5051 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005052 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005053 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005054 }
5055 catch(std::bad_alloc&)
5056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005058 }
5059}
5060
5061GLboolean __stdcall glIsBuffer(GLuint buffer)
5062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005063 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064
5065 try
5066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068
5069 if (context && buffer)
5070 {
5071 gl::Buffer *bufferObject = context->getBuffer(buffer);
5072
5073 if (bufferObject)
5074 {
5075 return GL_TRUE;
5076 }
5077 }
5078 }
5079 catch(std::bad_alloc&)
5080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005081 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005082 }
5083
5084 return GL_FALSE;
5085}
5086
5087GLboolean __stdcall glIsEnabled(GLenum cap)
5088{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005089 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005090
5091 try
5092 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094
5095 if (context)
5096 {
5097 switch (cap)
5098 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005099 case GL_CULL_FACE: return context->isCullFaceEnabled();
5100 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5101 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5102 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5103 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5104 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5105 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5106 case GL_BLEND: return context->isBlendEnabled();
5107 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005108 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005109 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005110 }
5111 }
5112 }
5113 catch(std::bad_alloc&)
5114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005115 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005116 }
5117
5118 return false;
5119}
5120
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005121GLboolean __stdcall glIsFenceNV(GLuint fence)
5122{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005123 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005124
5125 try
5126 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005127 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005128
5129 if (context)
5130 {
5131 gl::Fence *fenceObject = context->getFence(fence);
5132
5133 if (fenceObject == NULL)
5134 {
5135 return GL_FALSE;
5136 }
5137
5138 return fenceObject->isFence();
5139 }
5140 }
5141 catch(std::bad_alloc&)
5142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005143 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005144 }
5145
5146 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005147}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005148
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005149GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005151 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005152
5153 try
5154 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005155 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156
5157 if (context && framebuffer)
5158 {
5159 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5160
5161 if (framebufferObject)
5162 {
5163 return GL_TRUE;
5164 }
5165 }
5166 }
5167 catch(std::bad_alloc&)
5168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005169 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170 }
5171
5172 return GL_FALSE;
5173}
5174
5175GLboolean __stdcall glIsProgram(GLuint program)
5176{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005177 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005178
5179 try
5180 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005182
5183 if (context && program)
5184 {
5185 gl::Program *programObject = context->getProgram(program);
5186
5187 if (programObject)
5188 {
5189 return GL_TRUE;
5190 }
5191 }
5192 }
5193 catch(std::bad_alloc&)
5194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005195 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005196 }
5197
5198 return GL_FALSE;
5199}
5200
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005201GLboolean __stdcall glIsQueryEXT(GLuint id)
5202{
5203 EVENT("(GLuint id = %d)", id);
5204
5205 try
5206 {
5207 if (id == 0)
5208 {
5209 return GL_FALSE;
5210 }
5211
5212 gl::Context *context = gl::getNonLostContext();
5213
5214 if (context)
5215 {
5216 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5217
5218 if (queryObject)
5219 {
5220 return GL_TRUE;
5221 }
5222 }
5223 }
5224 catch(std::bad_alloc&)
5225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005226 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005227 }
5228
5229 return GL_FALSE;
5230}
5231
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005232GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005234 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235
5236 try
5237 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005238 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005239
5240 if (context && renderbuffer)
5241 {
5242 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5243
5244 if (renderbufferObject)
5245 {
5246 return GL_TRUE;
5247 }
5248 }
5249 }
5250 catch(std::bad_alloc&)
5251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005252 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 }
5254
5255 return GL_FALSE;
5256}
5257
5258GLboolean __stdcall glIsShader(GLuint shader)
5259{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005260 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005261
5262 try
5263 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005264 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265
5266 if (context && shader)
5267 {
5268 gl::Shader *shaderObject = context->getShader(shader);
5269
5270 if (shaderObject)
5271 {
5272 return GL_TRUE;
5273 }
5274 }
5275 }
5276 catch(std::bad_alloc&)
5277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005278 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005279 }
5280
5281 return GL_FALSE;
5282}
5283
5284GLboolean __stdcall glIsTexture(GLuint texture)
5285{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005286 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287
5288 try
5289 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291
5292 if (context && texture)
5293 {
5294 gl::Texture *textureObject = context->getTexture(texture);
5295
5296 if (textureObject)
5297 {
5298 return GL_TRUE;
5299 }
5300 }
5301 }
5302 catch(std::bad_alloc&)
5303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005304 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005305 }
5306
5307 return GL_FALSE;
5308}
5309
5310void __stdcall glLineWidth(GLfloat width)
5311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005312 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313
5314 try
5315 {
5316 if (width <= 0.0f)
5317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319 }
5320
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005322
5323 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005325 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 }
5327 }
5328 catch(std::bad_alloc&)
5329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005331 }
5332}
5333
5334void __stdcall glLinkProgram(GLuint program)
5335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005336 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005337
5338 try
5339 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005340 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341
5342 if (context)
5343 {
5344 gl::Program *programObject = context->getProgram(program);
5345
5346 if (!programObject)
5347 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005348 if (context->getShader(program))
5349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005350 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005351 }
5352 else
5353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005354 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005355 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005356 }
5357
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005358 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005359 }
5360 }
5361 catch(std::bad_alloc&)
5362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005364 }
5365}
5366
5367void __stdcall glPixelStorei(GLenum pname, GLint param)
5368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005369 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005370
5371 try
5372 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005374
5375 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005376 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005377 switch (pname)
5378 {
5379 case GL_UNPACK_ALIGNMENT:
5380 if (param != 1 && param != 2 && param != 4 && param != 8)
5381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005383 }
5384
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005385 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005386 break;
5387
5388 case GL_PACK_ALIGNMENT:
5389 if (param != 1 && param != 2 && param != 4 && param != 8)
5390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005391 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005392 }
5393
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005394 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005395 break;
5396
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005397 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5398 context->setPackReverseRowOrder(param != 0);
5399 break;
5400
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005401 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005402 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005403 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005404 }
5405 }
5406 catch(std::bad_alloc&)
5407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005409 }
5410}
5411
5412void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005414 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005415
5416 try
5417 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005419
5420 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005421 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005422 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005423 }
5424 }
5425 catch(std::bad_alloc&)
5426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005428 }
5429}
5430
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005431void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5432 GLenum format, GLenum type, GLsizei bufSize,
5433 GLvoid *data)
5434{
5435 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5436 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5437 x, y, width, height, format, type, bufSize, data);
5438
5439 try
5440 {
5441 if (width < 0 || height < 0 || bufSize < 0)
5442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005444 }
5445
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005446 gl::Context *context = gl::getNonLostContext();
5447
5448 if (context)
5449 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005450 GLenum currentFormat, currentType;
5451
5452 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5453 // and attempting to read back if that's the case is an error. The error will be registered
5454 // by getCurrentReadFormat.
5455 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5456 return;
5457
5458 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005461 }
5462
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005463 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5464 }
5465 }
5466 catch(std::bad_alloc&)
5467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005469 }
5470}
5471
5472void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5473 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005475 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005476 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005477 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478
5479 try
5480 {
5481 if (width < 0 || height < 0)
5482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 }
5485
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005486 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487
5488 if (context)
5489 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005490 GLenum currentFormat, currentType;
5491
5492 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5493 // and attempting to read back if that's the case is an error. The error will be registered
5494 // by getCurrentReadFormat.
5495 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5496 return;
5497
5498 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005501 }
5502
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005503 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 }
5505 }
5506 catch(std::bad_alloc&)
5507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005508 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509 }
5510}
5511
5512void __stdcall glReleaseShaderCompiler(void)
5513{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005514 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005515
5516 try
5517 {
5518 gl::Shader::releaseCompiler();
5519 }
5520 catch(std::bad_alloc&)
5521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005522 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005523 }
5524}
5525
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005526void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005527{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005528 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 +00005529 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530
5531 try
5532 {
5533 switch (target)
5534 {
5535 case GL_RENDERBUFFER:
5536 break;
5537 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 }
5540
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005541 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 }
5545
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005546 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547
5548 if (context)
5549 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005550 if (!gl::IsValidInternalFormat(internalformat, context))
5551 {
5552 return gl::error(GL_INVALID_ENUM);
5553 }
5554
5555 if (!gl::IsColorRenderingSupported(internalformat, context) &&
5556 !gl::IsDepthRenderingSupported(internalformat, context) &&
5557 !gl::IsStencilRenderingSupported(internalformat, context))
5558 {
5559 return gl::error(GL_INVALID_ENUM);
5560 }
5561
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005562 if (width > context->getMaximumRenderbufferDimension() ||
5563 height > context->getMaximumRenderbufferDimension() ||
5564 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005567 }
5568
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005569 GLuint handle = context->getRenderbufferHandle();
5570 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573 }
5574
5575 switch (internalformat)
5576 {
5577 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578 case GL_RGBA4:
5579 case GL_RGB5_A1:
5580 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005581 case GL_RGB8_OES:
5582 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005584 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005585 break;
5586 case GL_SRGB8_ALPHA8:
5587 case GL_RGB10_A2:
5588 case GL_RG8:
5589 case GL_R8:
5590 if (context->getClientVersion() < 3)
5591 {
5592 return gl::error(GL_INVALID_ENUM);
5593 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005594 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005595 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005598
5599 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005600 }
5601 }
5602 catch(std::bad_alloc&)
5603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005605 }
5606}
5607
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005608void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5609{
5610 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5611}
5612
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5614{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005615 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616
5617 try
5618 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005619 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005620
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 if (context)
5622 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005623 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005624 }
5625 }
5626 catch(std::bad_alloc&)
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630}
5631
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005632void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5633{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005634 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005635
5636 try
5637 {
5638 if (condition != GL_ALL_COMPLETED_NV)
5639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005640 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005641 }
5642
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005643 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005644
5645 if (context)
5646 {
5647 gl::Fence *fenceObject = context->getFence(fence);
5648
5649 if (fenceObject == NULL)
5650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005652 }
5653
5654 fenceObject->setFence(condition);
5655 }
5656 }
5657 catch(std::bad_alloc&)
5658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005659 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005660 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005661}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005662
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005663void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5664{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005665 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 +00005666
5667 try
5668 {
5669 if (width < 0 || height < 0)
5670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005671 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005672 }
5673
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005674 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005675
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005676 if (context)
5677 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005678 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 }
5680 }
5681 catch(std::bad_alloc&)
5682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005683 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684 }
5685}
5686
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005687void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005689 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005690 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005691 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692
5693 try
5694 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005695 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005696 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005697 }
5698 catch(std::bad_alloc&)
5699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005700 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 }
5702}
5703
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005704void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005705{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005706 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 +00005707 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708
5709 try
5710 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005711 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005713 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005714 }
5715
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005716 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717
5718 if (context)
5719 {
5720 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005721
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 if (!shaderObject)
5723 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005724 if (context->getProgram(shader))
5725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005726 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005727 }
5728 else
5729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005731 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005732 }
5733
5734 shaderObject->setSource(count, string, length);
5735 }
5736 }
5737 catch(std::bad_alloc&)
5738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005740 }
5741}
5742
5743void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5744{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005745 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005746}
5747
5748void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5749{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005750 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 +00005751
5752 try
5753 {
5754 switch (face)
5755 {
5756 case GL_FRONT:
5757 case GL_BACK:
5758 case GL_FRONT_AND_BACK:
5759 break;
5760 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005762 }
5763
5764 switch (func)
5765 {
5766 case GL_NEVER:
5767 case GL_ALWAYS:
5768 case GL_LESS:
5769 case GL_LEQUAL:
5770 case GL_EQUAL:
5771 case GL_GEQUAL:
5772 case GL_GREATER:
5773 case GL_NOTEQUAL:
5774 break;
5775 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005777 }
5778
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005779 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005780
5781 if (context)
5782 {
5783 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5784 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005785 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 }
5787
5788 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5789 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005790 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005791 }
5792 }
5793 }
5794 catch(std::bad_alloc&)
5795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005797 }
5798}
5799
5800void __stdcall glStencilMask(GLuint mask)
5801{
5802 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5803}
5804
5805void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005807 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005808
5809 try
5810 {
5811 switch (face)
5812 {
5813 case GL_FRONT:
5814 case GL_BACK:
5815 case GL_FRONT_AND_BACK:
5816 break;
5817 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819 }
5820
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005821 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005822
5823 if (context)
5824 {
5825 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5826 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005827 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005828 }
5829
5830 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5831 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005832 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833 }
5834 }
5835 }
5836 catch(std::bad_alloc&)
5837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005839 }
5840}
5841
5842void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5843{
5844 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5845}
5846
5847void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5848{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005849 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 +00005850 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851
5852 try
5853 {
5854 switch (face)
5855 {
5856 case GL_FRONT:
5857 case GL_BACK:
5858 case GL_FRONT_AND_BACK:
5859 break;
5860 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005861 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005862 }
5863
5864 switch (fail)
5865 {
5866 case GL_ZERO:
5867 case GL_KEEP:
5868 case GL_REPLACE:
5869 case GL_INCR:
5870 case GL_DECR:
5871 case GL_INVERT:
5872 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005873 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005874 break;
5875 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005876 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005877 }
5878
5879 switch (zfail)
5880 {
5881 case GL_ZERO:
5882 case GL_KEEP:
5883 case GL_REPLACE:
5884 case GL_INCR:
5885 case GL_DECR:
5886 case GL_INVERT:
5887 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005888 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005889 break;
5890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005892 }
5893
5894 switch (zpass)
5895 {
5896 case GL_ZERO:
5897 case GL_KEEP:
5898 case GL_REPLACE:
5899 case GL_INCR:
5900 case GL_DECR:
5901 case GL_INVERT:
5902 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005903 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005904 break;
5905 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005906 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 }
5908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910
5911 if (context)
5912 {
5913 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5914 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005915 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005916 }
5917
5918 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5919 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005920 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005921 }
5922 }
5923 }
5924 catch(std::bad_alloc&)
5925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005927 }
5928}
5929
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005930GLboolean __stdcall glTestFenceNV(GLuint fence)
5931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005932 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005933
5934 try
5935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005936 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005937
5938 if (context)
5939 {
5940 gl::Fence *fenceObject = context->getFence(fence);
5941
5942 if (fenceObject == NULL)
5943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005944 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005945 }
5946
5947 return fenceObject->testFence();
5948 }
5949 }
5950 catch(std::bad_alloc&)
5951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005952 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005953 }
5954
5955 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005956}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005957
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005958void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5959 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005960{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005961 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 +00005962 "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 +00005963 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964
5965 try
5966 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005967 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005969 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005971
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005972 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005974 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005975 }
5976
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005977 // validate <type> by itself (used as secondary key below)
5978 switch (type)
5979 {
5980 case GL_UNSIGNED_BYTE:
5981 case GL_UNSIGNED_SHORT_5_6_5:
5982 case GL_UNSIGNED_SHORT_4_4_4_4:
5983 case GL_UNSIGNED_SHORT_5_5_5_1:
5984 case GL_UNSIGNED_SHORT:
5985 case GL_UNSIGNED_INT:
5986 case GL_UNSIGNED_INT_24_8_OES:
5987 case GL_HALF_FLOAT_OES:
5988 case GL_FLOAT:
5989 break;
5990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005992 }
5993
5994 // validate <format> + <type> combinations
5995 // - invalid <format> -> sets INVALID_ENUM
5996 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005997 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005998 {
5999 case GL_ALPHA:
6000 case GL_LUMINANCE:
6001 case GL_LUMINANCE_ALPHA:
6002 switch (type)
6003 {
6004 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006005 case GL_FLOAT:
6006 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006007 break;
6008 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011 break;
6012 case GL_RGB:
6013 switch (type)
6014 {
6015 case GL_UNSIGNED_BYTE:
6016 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006017 case GL_FLOAT:
6018 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 break;
6020 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006021 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006022 }
6023 break;
6024 case GL_RGBA:
6025 switch (type)
6026 {
6027 case GL_UNSIGNED_BYTE:
6028 case GL_UNSIGNED_SHORT_4_4_4_4:
6029 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006030 case GL_FLOAT:
6031 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006032 break;
6033 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006034 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 }
6036 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00006037 case GL_BGRA_EXT:
6038 switch (type)
6039 {
6040 case GL_UNSIGNED_BYTE:
6041 break;
6042 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00006044 }
6045 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006046 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
6047 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00006048 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6049 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00006050 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006051 case GL_DEPTH_COMPONENT:
6052 switch (type)
6053 {
6054 case GL_UNSIGNED_SHORT:
6055 case GL_UNSIGNED_INT:
6056 break;
6057 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006058 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006059 }
6060 break;
6061 case GL_DEPTH_STENCIL_OES:
6062 switch (type)
6063 {
6064 case GL_UNSIGNED_INT_24_8_OES:
6065 break;
6066 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006067 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006068 }
6069 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006070 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006071 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006072 }
6073
6074 if (border != 0)
6075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006076 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006077 }
6078
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006079 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080
6081 if (context)
6082 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006083 if (level > context->getMaximumTextureLevel())
6084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006086 }
6087
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006088 switch (target)
6089 {
6090 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006091 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6092 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006095 }
6096 break;
6097 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6098 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6099 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6100 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6101 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6102 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6103 if (width != height)
6104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006105 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006106 }
6107
6108 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6109 height > (context->getMaximumCubeTextureDimension() >> level))
6110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006111 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006112 }
6113 break;
6114 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006115 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006116 }
6117
gman@chromium.org50c526d2011-08-10 05:19:44 +00006118 switch (format) {
6119 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6120 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6121 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006124 }
6125 else
6126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006127 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006128 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006129 break;
6130 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6131 if (context->supportsDXT3Textures())
6132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006133 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006134 }
6135 else
6136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006137 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006138 }
6139 break;
6140 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6141 if (context->supportsDXT5Textures())
6142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006143 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006144 }
6145 else
6146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006147 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006148 }
6149 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006150 case GL_DEPTH_COMPONENT:
6151 case GL_DEPTH_STENCIL_OES:
6152 if (!context->supportsDepthTextures())
6153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006154 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006155 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006156 if (target != GL_TEXTURE_2D)
6157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006158 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006159 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006160 // OES_depth_texture supports loading depth data and multiple levels,
6161 // but ANGLE_depth_texture does not
6162 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006164 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006165 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006166 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006167 default:
6168 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006169 }
6170
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006171 if (type == GL_FLOAT)
6172 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006173 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006175 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006176 }
6177 }
6178 else if (type == GL_HALF_FLOAT_OES)
6179 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006180 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006182 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006183 }
6184 }
6185
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006186 if (target == GL_TEXTURE_2D)
6187 {
6188 gl::Texture2D *texture = context->getTexture2D();
6189
6190 if (!texture)
6191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006193 }
6194
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006195 if (texture->isImmutable())
6196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006197 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006198 }
6199
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006200 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006201 }
6202 else
6203 {
6204 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6205
6206 if (!texture)
6207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006208 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006209 }
6210
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006211 if (texture->isImmutable())
6212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006213 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006214 }
6215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006216 switch (target)
6217 {
6218 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006219 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006220 break;
6221 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006222 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006223 break;
6224 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006225 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006226 break;
6227 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006228 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006229 break;
6230 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006231 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 break;
6233 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006234 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006235 break;
6236 default: UNREACHABLE();
6237 }
6238 }
6239 }
6240 }
6241 catch(std::bad_alloc&)
6242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006244 }
6245}
6246
6247void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6248{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006249 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6250
6251 try
6252 {
6253 gl::Context *context = gl::getNonLostContext();
6254
6255 if (context)
6256 {
6257 gl::Texture *texture;
6258
6259 switch (target)
6260 {
6261 case GL_TEXTURE_2D:
6262 texture = context->getTexture2D();
6263 break;
6264 case GL_TEXTURE_CUBE_MAP:
6265 texture = context->getTextureCubeMap();
6266 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006267 case GL_TEXTURE_3D:
6268 if (context->getClientVersion() < 3)
6269 {
6270 return gl::error(GL_INVALID_ENUM);
6271 }
6272 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006273 case GL_TEXTURE_2D_ARRAY:
6274 if (context->getClientVersion() < 3)
6275 {
6276 return gl::error(GL_INVALID_ENUM);
6277 }
6278 texture = context->getTexture2DArray();
6279 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006280 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006281 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006282 }
6283
6284 switch (pname)
6285 {
6286 case GL_TEXTURE_WRAP_S:
6287 if (!texture->setWrapS((GLenum)param))
6288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006289 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006290 }
6291 break;
6292 case GL_TEXTURE_WRAP_T:
6293 if (!texture->setWrapT((GLenum)param))
6294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006295 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006296 }
6297 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006298 case GL_TEXTURE_WRAP_R:
6299 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6300 {
6301 return gl::error(GL_INVALID_ENUM);
6302 }
6303 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006304 case GL_TEXTURE_MIN_FILTER:
6305 if (!texture->setMinFilter((GLenum)param))
6306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006307 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006308 }
6309 break;
6310 case GL_TEXTURE_MAG_FILTER:
6311 if (!texture->setMagFilter((GLenum)param))
6312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006313 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006314 }
6315 break;
6316 case GL_TEXTURE_USAGE_ANGLE:
6317 if (!texture->setUsage((GLenum)param))
6318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006320 }
6321 break;
6322 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6323 if (!context->supportsTextureFilterAnisotropy())
6324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006326 }
6327 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006330 }
6331 break;
6332 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006333 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006334 }
6335 }
6336 }
6337 catch(std::bad_alloc&)
6338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006339 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006340 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006341}
6342
6343void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6344{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006345 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006346}
6347
6348void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6349{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006350 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006351
6352 try
6353 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006355
6356 if (context)
6357 {
6358 gl::Texture *texture;
6359
6360 switch (target)
6361 {
6362 case GL_TEXTURE_2D:
6363 texture = context->getTexture2D();
6364 break;
6365 case GL_TEXTURE_CUBE_MAP:
6366 texture = context->getTextureCubeMap();
6367 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006368 case GL_TEXTURE_3D:
6369 if (context->getClientVersion() < 3)
6370 {
6371 return gl::error(GL_INVALID_ENUM);
6372 }
6373 texture = context->getTexture3D();
6374 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006375 case GL_TEXTURE_2D_ARRAY:
6376 if (context->getClientVersion() < 3)
6377 {
6378 return gl::error(GL_INVALID_ENUM);
6379 }
6380 texture = context->getTexture2DArray();
6381 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006382 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006384 }
6385
6386 switch (pname)
6387 {
6388 case GL_TEXTURE_WRAP_S:
6389 if (!texture->setWrapS((GLenum)param))
6390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006392 }
6393 break;
6394 case GL_TEXTURE_WRAP_T:
6395 if (!texture->setWrapT((GLenum)param))
6396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006397 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006398 }
6399 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006400 case GL_TEXTURE_WRAP_R:
6401 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6402 {
6403 return gl::error(GL_INVALID_ENUM);
6404 }
6405 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006406 case GL_TEXTURE_MIN_FILTER:
6407 if (!texture->setMinFilter((GLenum)param))
6408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006409 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006410 }
6411 break;
6412 case GL_TEXTURE_MAG_FILTER:
6413 if (!texture->setMagFilter((GLenum)param))
6414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006415 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006416 }
6417 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006418 case GL_TEXTURE_USAGE_ANGLE:
6419 if (!texture->setUsage((GLenum)param))
6420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006421 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006422 }
6423 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006424 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6425 if (!context->supportsTextureFilterAnisotropy())
6426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006427 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006428 }
6429 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006431 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006432 }
6433 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006434 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006435 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006436 }
6437 }
6438 }
6439 catch(std::bad_alloc&)
6440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006441 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006442 }
6443}
6444
6445void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6446{
6447 glTexParameteri(target, pname, *params);
6448}
6449
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006450void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6451{
6452 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6453 target, levels, internalformat, width, height);
6454
6455 try
6456 {
6457 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006459 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006460 }
6461
6462 if (width < 1 || height < 1 || levels < 1)
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006465 }
6466
6467 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006469 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006470 }
6471
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006472 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006474 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006475 }
6476
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006477 gl::Context *context = gl::getNonLostContext();
6478
6479 if (context)
6480 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006481 if (!gl::IsValidInternalFormat(internalformat, context))
6482 {
6483 return gl::error(GL_INVALID_ENUM);
6484 }
6485
6486 GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
6487 GLenum type = gl::GetType(internalformat, context->getClientVersion());
6488
6489 if (format == GL_NONE || type == GL_NONE)
6490 {
6491 return gl::error(GL_INVALID_ENUM);
6492 }
6493
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006494 switch (target)
6495 {
6496 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006497 if (width > context->getMaximum2DTextureDimension() ||
6498 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006500 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006501 }
6502 break;
6503 case GL_TEXTURE_CUBE_MAP:
6504 if (width > context->getMaximumCubeTextureDimension() ||
6505 height > context->getMaximumCubeTextureDimension())
6506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006508 }
6509 break;
6510 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006512 }
6513
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006514 if (levels != 1 && !context->supportsNonPower2Texture())
6515 {
6516 if (!gl::isPow2(width) || !gl::isPow2(height))
6517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006518 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006519 }
6520 }
6521
daniel@transgaming.come1077362011-11-11 04:16:50 +00006522 switch (internalformat)
6523 {
6524 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6525 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6526 if (!context->supportsDXT1Textures())
6527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006528 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006529 }
6530 break;
6531 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6532 if (!context->supportsDXT3Textures())
6533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006534 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006535 }
6536 break;
6537 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6538 if (!context->supportsDXT5Textures())
6539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006541 }
6542 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006543 case GL_RGBA32F_EXT:
6544 case GL_RGB32F_EXT:
6545 case GL_ALPHA32F_EXT:
6546 case GL_LUMINANCE32F_EXT:
6547 case GL_LUMINANCE_ALPHA32F_EXT:
6548 if (!context->supportsFloat32Textures())
6549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006551 }
6552 break;
6553 case GL_RGBA16F_EXT:
6554 case GL_RGB16F_EXT:
6555 case GL_ALPHA16F_EXT:
6556 case GL_LUMINANCE16F_EXT:
6557 case GL_LUMINANCE_ALPHA16F_EXT:
6558 if (!context->supportsFloat16Textures())
6559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006560 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006561 }
6562 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006563 case GL_DEPTH_COMPONENT16:
6564 case GL_DEPTH_COMPONENT32_OES:
6565 case GL_DEPTH24_STENCIL8_OES:
6566 if (!context->supportsDepthTextures())
6567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006568 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006569 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006570 if (target != GL_TEXTURE_2D)
6571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006573 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006574 // ANGLE_depth_texture only supports 1-level textures
6575 if (levels != 1)
6576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006578 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006579 break;
6580 default:
6581 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006582 }
6583
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006584 if (target == GL_TEXTURE_2D)
6585 {
6586 gl::Texture2D *texture = context->getTexture2D();
6587
6588 if (!texture || texture->id() == 0)
6589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006590 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006591 }
6592
6593 if (texture->isImmutable())
6594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006595 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006596 }
6597
6598 texture->storage(levels, internalformat, width, height);
6599 }
6600 else if (target == GL_TEXTURE_CUBE_MAP)
6601 {
6602 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6603
6604 if (!texture || texture->id() == 0)
6605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006606 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006607 }
6608
6609 if (texture->isImmutable())
6610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006611 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006612 }
6613
6614 texture->storage(levels, internalformat, width);
6615 }
6616 else UNREACHABLE();
6617 }
6618 }
6619 catch(std::bad_alloc&)
6620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006621 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006622 }
6623}
6624
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006625void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6626 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006628 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006629 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006630 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006631 target, level, xoffset, yoffset, width, height, format, type, pixels);
6632
6633 try
6634 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006635 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006638 }
6639
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006640 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006641 {
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.com00c75962010-03-11 20:36:15 +00006645 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006647 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006648 }
6649
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006650 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006651 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006652 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006653 }
6654
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006656
6657 if (context)
6658 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006659 if (level > context->getMaximumTextureLevel())
6660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006662 }
6663
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006664 if (type == GL_FLOAT)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006665 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006666 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006668 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006669 }
6670 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006671 else if (type == GL_HALF_FLOAT_OES)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006672 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006673 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006675 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006676 }
6677 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006678
6679 if (format == GL_DEPTH_COMPONENT)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006680 {
6681 if (!context->supportsDepthTextures())
6682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006683 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006684 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006685 if (target != GL_TEXTURE_2D)
6686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006687 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006688 }
6689 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006691 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006692
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006693 if (width == 0 || height == 0 || pixels == NULL)
6694 {
6695 return;
6696 }
6697
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006698 if (target == GL_TEXTURE_2D)
6699 {
6700 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006701 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006702 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006703 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006704 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006705 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006706 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006707 {
6708 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006709 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006710 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006711 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006712 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006713 }
6714 else
6715 {
6716 UNREACHABLE();
6717 }
6718 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006719 }
6720 catch(std::bad_alloc&)
6721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006722 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006723 }
6724}
6725
6726void __stdcall glUniform1f(GLint location, GLfloat x)
6727{
6728 glUniform1fv(location, 1, &x);
6729}
6730
6731void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6732{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006733 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006734
6735 try
6736 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006737 if (count < 0)
6738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006739 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740 }
6741
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006742 if (location == -1)
6743 {
6744 return;
6745 }
6746
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006748
6749 if (context)
6750 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006751 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006752 if (!programBinary)
6753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006754 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006755 }
6756
6757 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006759 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006760 }
6761 }
6762 }
6763 catch(std::bad_alloc&)
6764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006765 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006766 }
6767}
6768
6769void __stdcall glUniform1i(GLint location, GLint x)
6770{
6771 glUniform1iv(location, 1, &x);
6772}
6773
6774void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6775{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006776 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006777
6778 try
6779 {
6780 if (count < 0)
6781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006782 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006783 }
6784
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006785 if (location == -1)
6786 {
6787 return;
6788 }
6789
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006791
6792 if (context)
6793 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006794 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006795 if (!programBinary)
6796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006797 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006798 }
6799
6800 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006802 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006803 }
6804 }
6805 }
6806 catch(std::bad_alloc&)
6807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006808 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 }
6810}
6811
6812void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6813{
6814 GLfloat xy[2] = {x, y};
6815
6816 glUniform2fv(location, 1, (GLfloat*)&xy);
6817}
6818
6819void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006821 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006822
6823 try
6824 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006825 if (count < 0)
6826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006827 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006828 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006829
6830 if (location == -1)
6831 {
6832 return;
6833 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006834
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006836
6837 if (context)
6838 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006839 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006840 if (!programBinary)
6841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006842 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006843 }
6844
6845 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006847 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006848 }
6849 }
6850 }
6851 catch(std::bad_alloc&)
6852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006854 }
6855}
6856
6857void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6858{
6859 GLint xy[4] = {x, y};
6860
6861 glUniform2iv(location, 1, (GLint*)&xy);
6862}
6863
6864void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6865{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006866 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006867
6868 try
6869 {
6870 if (count < 0)
6871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006872 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006873 }
6874
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006875 if (location == -1)
6876 {
6877 return;
6878 }
6879
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006880 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006881
6882 if (context)
6883 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006884 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006885 if (!programBinary)
6886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006887 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006888 }
6889
6890 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006892 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006893 }
6894 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006895 }
6896 catch(std::bad_alloc&)
6897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006899 }
6900}
6901
6902void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6903{
6904 GLfloat xyz[3] = {x, y, z};
6905
6906 glUniform3fv(location, 1, (GLfloat*)&xyz);
6907}
6908
6909void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006911 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006912
6913 try
6914 {
6915 if (count < 0)
6916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006918 }
6919
6920 if (location == -1)
6921 {
6922 return;
6923 }
6924
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006926
6927 if (context)
6928 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006929 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006930 if (!programBinary)
6931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006932 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006933 }
6934
6935 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006937 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006938 }
6939 }
6940 }
6941 catch(std::bad_alloc&)
6942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006944 }
6945}
6946
6947void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6948{
6949 GLint xyz[3] = {x, y, z};
6950
6951 glUniform3iv(location, 1, (GLint*)&xyz);
6952}
6953
6954void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006956 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006957
6958 try
6959 {
6960 if (count < 0)
6961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006962 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006963 }
6964
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006965 if (location == -1)
6966 {
6967 return;
6968 }
6969
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006970 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006971
6972 if (context)
6973 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006974 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006975 if (!programBinary)
6976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006977 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006978 }
6979
6980 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006982 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006983 }
6984 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006985 }
6986 catch(std::bad_alloc&)
6987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006988 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006989 }
6990}
6991
6992void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6993{
6994 GLfloat xyzw[4] = {x, y, z, w};
6995
6996 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6997}
6998
6999void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
7000{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007001 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007002
7003 try
7004 {
7005 if (count < 0)
7006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007007 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007008 }
7009
7010 if (location == -1)
7011 {
7012 return;
7013 }
7014
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007015 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007016
7017 if (context)
7018 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007019 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007020 if (!programBinary)
7021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007022 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007023 }
7024
7025 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007028 }
7029 }
7030 }
7031 catch(std::bad_alloc&)
7032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007033 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007034 }
7035}
7036
7037void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
7038{
7039 GLint xyzw[4] = {x, y, z, w};
7040
7041 glUniform4iv(location, 1, (GLint*)&xyzw);
7042}
7043
7044void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
7045{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007046 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007047
7048 try
7049 {
7050 if (count < 0)
7051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007052 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007053 }
7054
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007055 if (location == -1)
7056 {
7057 return;
7058 }
7059
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007061
7062 if (context)
7063 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007064 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007065 if (!programBinary)
7066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007067 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007068 }
7069
7070 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007072 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007073 }
7074 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007075 }
7076 catch(std::bad_alloc&)
7077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007079 }
7080}
7081
7082void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7083{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007084 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007085 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007086
7087 try
7088 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007089 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007092 }
7093
7094 if (location == -1)
7095 {
7096 return;
7097 }
7098
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007099 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007100
7101 if (context)
7102 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007103 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7104 {
7105 return gl::error(GL_INVALID_VALUE);
7106 }
7107
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007108 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007109 if (!programBinary)
7110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007111 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007112 }
7113
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007114 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007116 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007117 }
7118 }
7119 }
7120 catch(std::bad_alloc&)
7121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007122 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007123 }
7124}
7125
7126void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7127{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007128 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007129 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007130
7131 try
7132 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007133 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007135 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007136 }
7137
7138 if (location == -1)
7139 {
7140 return;
7141 }
7142
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144
7145 if (context)
7146 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007147 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7148 {
7149 return gl::error(GL_INVALID_VALUE);
7150 }
7151
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007152 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007153 if (!programBinary)
7154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007155 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007156 }
7157
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007158 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007160 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007161 }
7162 }
7163 }
7164 catch(std::bad_alloc&)
7165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007166 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007167 }
7168}
7169
7170void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7171{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007172 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007173 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007174
7175 try
7176 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007177 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007179 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007180 }
7181
7182 if (location == -1)
7183 {
7184 return;
7185 }
7186
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007187 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007188
7189 if (context)
7190 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007191 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7192 {
7193 return gl::error(GL_INVALID_VALUE);
7194 }
7195
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007196 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007197 if (!programBinary)
7198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007199 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007200 }
7201
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007202 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007204 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007205 }
7206 }
7207 }
7208 catch(std::bad_alloc&)
7209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007210 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007211 }
7212}
7213
7214void __stdcall glUseProgram(GLuint program)
7215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007216 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007217
7218 try
7219 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007221
7222 if (context)
7223 {
7224 gl::Program *programObject = context->getProgram(program);
7225
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007226 if (!programObject && program != 0)
7227 {
7228 if (context->getShader(program))
7229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007230 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007231 }
7232 else
7233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007234 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007235 }
7236 }
7237
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007238 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007240 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007241 }
7242
7243 context->useProgram(program);
7244 }
7245 }
7246 catch(std::bad_alloc&)
7247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007249 }
7250}
7251
7252void __stdcall glValidateProgram(GLuint program)
7253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007254 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007255
7256 try
7257 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007258 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007259
7260 if (context)
7261 {
7262 gl::Program *programObject = context->getProgram(program);
7263
7264 if (!programObject)
7265 {
7266 if (context->getShader(program))
7267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007268 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007269 }
7270 else
7271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007273 }
7274 }
7275
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007276 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007277 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007278 }
7279 catch(std::bad_alloc&)
7280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007281 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007282 }
7283}
7284
7285void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7286{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007287 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007288
7289 try
7290 {
7291 if (index >= gl::MAX_VERTEX_ATTRIBS)
7292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007294 }
7295
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007296 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007297
7298 if (context)
7299 {
7300 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007301 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007303 }
7304 catch(std::bad_alloc&)
7305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007306 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007307 }
7308}
7309
7310void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7311{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007312 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007313
7314 try
7315 {
7316 if (index >= gl::MAX_VERTEX_ATTRIBS)
7317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007318 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007319 }
7320
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007321 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007322
7323 if (context)
7324 {
7325 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007326 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007327 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007328 }
7329 catch(std::bad_alloc&)
7330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007332 }
7333}
7334
7335void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7336{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007337 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007338
7339 try
7340 {
7341 if (index >= gl::MAX_VERTEX_ATTRIBS)
7342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007343 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007344 }
7345
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007346 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007347
7348 if (context)
7349 {
7350 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007351 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007353 }
7354 catch(std::bad_alloc&)
7355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007356 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007357 }
7358}
7359
7360void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007362 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007363
7364 try
7365 {
7366 if (index >= gl::MAX_VERTEX_ATTRIBS)
7367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007368 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007369 }
7370
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007371 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007372
7373 if (context)
7374 {
7375 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007376 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007377 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007378 }
7379 catch(std::bad_alloc&)
7380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007381 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007382 }
7383}
7384
7385void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7386{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007387 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 +00007388
7389 try
7390 {
7391 if (index >= gl::MAX_VERTEX_ATTRIBS)
7392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007394 }
7395
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007396 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007397
7398 if (context)
7399 {
7400 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007401 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007402 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007403 }
7404 catch(std::bad_alloc&)
7405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007407 }
7408}
7409
7410void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007412 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007413
7414 try
7415 {
7416 if (index >= gl::MAX_VERTEX_ATTRIBS)
7417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007418 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007419 }
7420
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007422
7423 if (context)
7424 {
7425 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007426 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007427 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007428 }
7429 catch(std::bad_alloc&)
7430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007431 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007432 }
7433}
7434
7435void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7436{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007437 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 +00007438
7439 try
7440 {
7441 if (index >= gl::MAX_VERTEX_ATTRIBS)
7442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007444 }
7445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007447
7448 if (context)
7449 {
7450 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007451 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007453 }
7454 catch(std::bad_alloc&)
7455 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007456 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007457 }
7458}
7459
7460void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7461{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007462 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007463
7464 try
7465 {
7466 if (index >= gl::MAX_VERTEX_ATTRIBS)
7467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007469 }
7470
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007471 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007472
7473 if (context)
7474 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007475 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007476 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007477 }
7478 catch(std::bad_alloc&)
7479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007480 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007481 }
7482}
7483
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007484void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7485{
7486 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7487
7488 try
7489 {
7490 if (index >= gl::MAX_VERTEX_ATTRIBS)
7491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007493 }
7494
7495 gl::Context *context = gl::getNonLostContext();
7496
7497 if (context)
7498 {
7499 context->setVertexAttribDivisor(index, divisor);
7500 }
7501 }
7502 catch(std::bad_alloc&)
7503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007504 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007505 }
7506}
7507
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007508void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007509{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007510 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007511 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007512 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007513
7514 try
7515 {
7516 if (index >= gl::MAX_VERTEX_ATTRIBS)
7517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007518 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007519 }
7520
7521 if (size < 1 || size > 4)
7522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007524 }
7525
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007526 gl::Context *context = gl::getNonLostContext();
7527
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007528 switch (type)
7529 {
7530 case GL_BYTE:
7531 case GL_UNSIGNED_BYTE:
7532 case GL_SHORT:
7533 case GL_UNSIGNED_SHORT:
7534 case GL_FIXED:
7535 case GL_FLOAT:
7536 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007537 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007538 case GL_INT:
7539 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007540 case GL_INT_2_10_10_10_REV:
7541 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007542 if (context && context->getClientVersion() < 3)
7543 {
7544 return gl::error(GL_INVALID_ENUM);
7545 }
7546 else
7547 {
7548 break;
7549 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007550 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007551 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007552 }
7553
7554 if (stride < 0)
7555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007556 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007557 }
7558
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007559 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7560 {
7561 return gl::error(GL_INVALID_OPERATION);
7562 }
7563
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007564 if (context)
7565 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007566 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7567 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007568 }
7569 }
7570 catch(std::bad_alloc&)
7571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007572 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007573 }
7574}
7575
7576void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7577{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007578 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 +00007579
7580 try
7581 {
7582 if (width < 0 || height < 0)
7583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007584 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007585 }
7586
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007587 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007588
7589 if (context)
7590 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007591 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007592 }
7593 }
7594 catch(std::bad_alloc&)
7595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007597 }
7598}
7599
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007600// OpenGL ES 3.0 functions
7601
7602void __stdcall glReadBuffer(GLenum mode)
7603{
7604 EVENT("(GLenum mode = 0x%X)", mode);
7605
7606 try
7607 {
7608 gl::Context *context = gl::getNonLostContext();
7609
7610 if (context)
7611 {
7612 if (context->getClientVersion() < 3)
7613 {
7614 return gl::error(GL_INVALID_OPERATION);
7615 }
7616 }
7617
7618 UNIMPLEMENTED();
7619 }
7620 catch(std::bad_alloc&)
7621 {
7622 return gl::error(GL_OUT_OF_MEMORY);
7623 }
7624}
7625
7626void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7627{
7628 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7629 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7630
7631 try
7632 {
7633 gl::Context *context = gl::getNonLostContext();
7634
7635 if (context)
7636 {
7637 if (context->getClientVersion() < 3)
7638 {
7639 return gl::error(GL_INVALID_OPERATION);
7640 }
7641 }
7642
7643 UNIMPLEMENTED();
7644 }
7645 catch(std::bad_alloc&)
7646 {
7647 return gl::error(GL_OUT_OF_MEMORY);
7648 }
7649}
7650
7651void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7652{
7653 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7654 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7655 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7656 target, level, internalformat, width, height, depth, border, format, type, pixels);
7657
7658 try
7659 {
7660 gl::Context *context = gl::getNonLostContext();
7661
7662 if (context)
7663 {
7664 if (context->getClientVersion() < 3)
7665 {
7666 return gl::error(GL_INVALID_OPERATION);
7667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007668
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007669 // validateES3TexImageFormat sets the error code if there is an error
7670 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7671 0, 0, 0, width, height, depth, border, format, type))
7672 {
7673 return;
7674 }
7675
7676 switch(target)
7677 {
7678 case GL_TEXTURE_3D:
7679 {
7680 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007681 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007682 }
7683 break;
7684
7685 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007686 {
7687 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007688 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007689 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007690 break;
7691
7692 default:
7693 return gl::error(GL_INVALID_ENUM);
7694 }
7695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007696 }
7697 catch(std::bad_alloc&)
7698 {
7699 return gl::error(GL_OUT_OF_MEMORY);
7700 }
7701}
7702
7703void __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)
7704{
7705 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7706 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7707 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7708 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7709
7710 try
7711 {
7712 gl::Context *context = gl::getNonLostContext();
7713
7714 if (context)
7715 {
7716 if (context->getClientVersion() < 3)
7717 {
7718 return gl::error(GL_INVALID_OPERATION);
7719 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007720
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007721 if (!pixels)
7722 {
7723 return gl::error(GL_INVALID_VALUE);
7724 }
7725
7726 // validateES3TexImageFormat sets the error code if there is an error
7727 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7728 xoffset, yoffset, zoffset, width, height, depth, 0,
7729 format, type))
7730 {
7731 return;
7732 }
7733
7734 switch(target)
7735 {
7736 case GL_TEXTURE_3D:
7737 {
7738 gl::Texture3D *texture = context->getTexture3D();
7739 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7740 }
7741 break;
7742
7743 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007744 {
7745 gl::Texture2DArray *texture = context->getTexture2DArray();
7746 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7747 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007748 break;
7749
7750 default:
7751 return gl::error(GL_INVALID_ENUM);
7752 }
7753 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007754 }
7755 catch(std::bad_alloc&)
7756 {
7757 return gl::error(GL_OUT_OF_MEMORY);
7758 }
7759}
7760
7761void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7762{
7763 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7764 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7765 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7766
7767 try
7768 {
7769 gl::Context *context = gl::getNonLostContext();
7770
7771 if (context)
7772 {
7773 if (context->getClientVersion() < 3)
7774 {
7775 return gl::error(GL_INVALID_OPERATION);
7776 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007777
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007778 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7779 x, y, width, height))
7780 {
7781 return;
7782 }
7783
7784 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7785 gl::Texture *texture = NULL;
7786 switch (target)
7787 {
7788 case GL_TEXTURE_3D:
7789 texture = context->getTexture3D();
7790 break;
7791
7792 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007793 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007794 break;
7795
7796 default:
7797 return gl::error(GL_INVALID_ENUM);
7798 }
7799
7800 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007802 }
7803 catch(std::bad_alloc&)
7804 {
7805 return gl::error(GL_OUT_OF_MEMORY);
7806 }
7807}
7808
7809void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7810{
7811 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7812 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7813 "const GLvoid* data = 0x%0.8p)",
7814 target, level, internalformat, width, height, depth, border, imageSize, data);
7815
7816 try
7817 {
7818 gl::Context *context = gl::getNonLostContext();
7819
7820 if (context)
7821 {
7822 if (context->getClientVersion() < 3)
7823 {
7824 return gl::error(GL_INVALID_OPERATION);
7825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007826
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007827 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007828 {
7829 return gl::error(GL_INVALID_VALUE);
7830 }
7831
7832 // validateES3TexImageFormat sets the error code if there is an error
7833 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7834 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7835 {
7836 return;
7837 }
7838
7839 switch(target)
7840 {
7841 case GL_TEXTURE_3D:
7842 {
7843 gl::Texture3D *texture = context->getTexture3D();
7844 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7845 }
7846 break;
7847
7848 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007849 {
7850 gl::Texture2DArray *texture = context->getTexture2DArray();
7851 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7852 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007853 break;
7854
7855 default:
7856 return gl::error(GL_INVALID_ENUM);
7857 }
7858 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007859 }
7860 catch(std::bad_alloc&)
7861 {
7862 return gl::error(GL_OUT_OF_MEMORY);
7863 }
7864}
7865
7866void __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)
7867{
7868 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7869 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7870 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7871 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7872
7873 try
7874 {
7875 gl::Context *context = gl::getNonLostContext();
7876
7877 if (context)
7878 {
7879 if (context->getClientVersion() < 3)
7880 {
7881 return gl::error(GL_INVALID_OPERATION);
7882 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007883
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007884 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007885 {
7886 return gl::error(GL_INVALID_VALUE);
7887 }
7888
7889 if (!data)
7890 {
7891 return gl::error(GL_INVALID_VALUE);
7892 }
7893
7894 // validateES3TexImageFormat sets the error code if there is an error
7895 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7896 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7897 {
7898 return;
7899 }
7900
7901 switch(target)
7902 {
7903 case GL_TEXTURE_3D:
7904 {
7905 gl::Texture3D *texture = context->getTexture3D();
7906 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7907 format, imageSize, data);
7908 }
7909 break;
7910
7911 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007912 {
7913 gl::Texture2DArray *texture = context->getTexture2DArray();
7914 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7915 format, imageSize, data);
7916 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007917 break;
7918
7919 default:
7920 return gl::error(GL_INVALID_ENUM);
7921 }
7922 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007923 }
7924 catch(std::bad_alloc&)
7925 {
7926 return gl::error(GL_OUT_OF_MEMORY);
7927 }
7928}
7929
7930void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7931{
7932 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7933
7934 try
7935 {
7936 gl::Context *context = gl::getNonLostContext();
7937
7938 if (context)
7939 {
7940 if (context->getClientVersion() < 3)
7941 {
7942 return gl::error(GL_INVALID_OPERATION);
7943 }
7944 }
7945
7946 UNIMPLEMENTED();
7947 }
7948 catch(std::bad_alloc&)
7949 {
7950 return gl::error(GL_OUT_OF_MEMORY);
7951 }
7952}
7953
7954void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7955{
7956 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7957
7958 try
7959 {
7960 gl::Context *context = gl::getNonLostContext();
7961
7962 if (context)
7963 {
7964 if (context->getClientVersion() < 3)
7965 {
7966 return gl::error(GL_INVALID_OPERATION);
7967 }
7968 }
7969
7970 UNIMPLEMENTED();
7971 }
7972 catch(std::bad_alloc&)
7973 {
7974 return gl::error(GL_OUT_OF_MEMORY);
7975 }
7976}
7977
7978GLboolean __stdcall glIsQuery(GLuint id)
7979{
7980 EVENT("(GLuint id = %u)", id);
7981
7982 try
7983 {
7984 gl::Context *context = gl::getNonLostContext();
7985
7986 if (context)
7987 {
7988 if (context->getClientVersion() < 3)
7989 {
7990 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7991 }
7992 }
7993
7994 UNIMPLEMENTED();
7995 }
7996 catch(std::bad_alloc&)
7997 {
7998 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7999 }
8000
8001 return GL_FALSE;
8002}
8003
8004void __stdcall glBeginQuery(GLenum target, GLuint id)
8005{
8006 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
8007
8008 try
8009 {
8010 gl::Context *context = gl::getNonLostContext();
8011
8012 if (context)
8013 {
8014 if (context->getClientVersion() < 3)
8015 {
8016 return gl::error(GL_INVALID_OPERATION);
8017 }
8018 }
8019
8020 UNIMPLEMENTED();
8021 }
8022 catch(std::bad_alloc&)
8023 {
8024 return gl::error(GL_OUT_OF_MEMORY);
8025 }
8026}
8027
8028void __stdcall glEndQuery(GLenum target)
8029{
8030 EVENT("(GLenum target = 0x%X)", target);
8031
8032 try
8033 {
8034 gl::Context *context = gl::getNonLostContext();
8035
8036 if (context)
8037 {
8038 if (context->getClientVersion() < 3)
8039 {
8040 return gl::error(GL_INVALID_OPERATION);
8041 }
8042 }
8043
8044 UNIMPLEMENTED();
8045 }
8046 catch(std::bad_alloc&)
8047 {
8048 return gl::error(GL_OUT_OF_MEMORY);
8049 }
8050}
8051
8052void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
8053{
8054 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
8055
8056 try
8057 {
8058 gl::Context *context = gl::getNonLostContext();
8059
8060 if (context)
8061 {
8062 if (context->getClientVersion() < 3)
8063 {
8064 return gl::error(GL_INVALID_OPERATION);
8065 }
8066 }
8067
8068 UNIMPLEMENTED();
8069 }
8070 catch(std::bad_alloc&)
8071 {
8072 return gl::error(GL_OUT_OF_MEMORY);
8073 }
8074}
8075
8076void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
8077{
8078 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
8079
8080 try
8081 {
8082 gl::Context *context = gl::getNonLostContext();
8083
8084 if (context)
8085 {
8086 if (context->getClientVersion() < 3)
8087 {
8088 return gl::error(GL_INVALID_OPERATION);
8089 }
8090 }
8091
8092 UNIMPLEMENTED();
8093 }
8094 catch(std::bad_alloc&)
8095 {
8096 return gl::error(GL_OUT_OF_MEMORY);
8097 }
8098}
8099
8100GLboolean __stdcall glUnmapBuffer(GLenum target)
8101{
8102 EVENT("(GLenum target = 0x%X)", target);
8103
8104 try
8105 {
8106 gl::Context *context = gl::getNonLostContext();
8107
8108 if (context)
8109 {
8110 if (context->getClientVersion() < 3)
8111 {
8112 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8113 }
8114 }
8115
8116 UNIMPLEMENTED();
8117 }
8118 catch(std::bad_alloc&)
8119 {
8120 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8121 }
8122
8123 return GL_FALSE;
8124}
8125
8126void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8127{
8128 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8129
8130 try
8131 {
8132 gl::Context *context = gl::getNonLostContext();
8133
8134 if (context)
8135 {
8136 if (context->getClientVersion() < 3)
8137 {
8138 return gl::error(GL_INVALID_OPERATION);
8139 }
8140 }
8141
8142 UNIMPLEMENTED();
8143 }
8144 catch(std::bad_alloc&)
8145 {
8146 return gl::error(GL_OUT_OF_MEMORY);
8147 }
8148}
8149
8150void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8151{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008152 try
8153 {
8154 gl::Context *context = gl::getNonLostContext();
8155
8156 if (context)
8157 {
8158 if (context->getClientVersion() < 3)
8159 {
8160 return gl::error(GL_INVALID_OPERATION);
8161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008162
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008163 glDrawBuffersEXT(n, bufs);
8164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008165 }
8166 catch(std::bad_alloc&)
8167 {
8168 return gl::error(GL_OUT_OF_MEMORY);
8169 }
8170}
8171
8172void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8173{
8174 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8175 location, count, transpose, value);
8176
8177 try
8178 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008179 if (count < 0)
8180 {
8181 return gl::error(GL_INVALID_VALUE);
8182 }
8183
8184 if (location == -1)
8185 {
8186 return;
8187 }
8188
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008189 gl::Context *context = gl::getNonLostContext();
8190
8191 if (context)
8192 {
8193 if (context->getClientVersion() < 3)
8194 {
8195 return gl::error(GL_INVALID_OPERATION);
8196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008197
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008198 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8199 if (!programBinary)
8200 {
8201 return gl::error(GL_INVALID_OPERATION);
8202 }
8203
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008204 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008205 {
8206 return gl::error(GL_INVALID_OPERATION);
8207 }
8208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008209 }
8210 catch(std::bad_alloc&)
8211 {
8212 return gl::error(GL_OUT_OF_MEMORY);
8213 }
8214}
8215
8216void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8217{
8218 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8219 location, count, transpose, value);
8220
8221 try
8222 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008223 if (count < 0)
8224 {
8225 return gl::error(GL_INVALID_VALUE);
8226 }
8227
8228 if (location == -1)
8229 {
8230 return;
8231 }
8232
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008233 gl::Context *context = gl::getNonLostContext();
8234
8235 if (context)
8236 {
8237 if (context->getClientVersion() < 3)
8238 {
8239 return gl::error(GL_INVALID_OPERATION);
8240 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008241
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008242 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8243 if (!programBinary)
8244 {
8245 return gl::error(GL_INVALID_OPERATION);
8246 }
8247
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008248 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008249 {
8250 return gl::error(GL_INVALID_OPERATION);
8251 }
8252 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008253 }
8254 catch(std::bad_alloc&)
8255 {
8256 return gl::error(GL_OUT_OF_MEMORY);
8257 }
8258}
8259
8260void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8261{
8262 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8263 location, count, transpose, value);
8264
8265 try
8266 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008267 if (count < 0)
8268 {
8269 return gl::error(GL_INVALID_VALUE);
8270 }
8271
8272 if (location == -1)
8273 {
8274 return;
8275 }
8276
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008277 gl::Context *context = gl::getNonLostContext();
8278
8279 if (context)
8280 {
8281 if (context->getClientVersion() < 3)
8282 {
8283 return gl::error(GL_INVALID_OPERATION);
8284 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008285
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008286 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8287 if (!programBinary)
8288 {
8289 return gl::error(GL_INVALID_OPERATION);
8290 }
8291
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008292 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008293 {
8294 return gl::error(GL_INVALID_OPERATION);
8295 }
8296 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008297 }
8298 catch(std::bad_alloc&)
8299 {
8300 return gl::error(GL_OUT_OF_MEMORY);
8301 }
8302}
8303
8304void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8305{
8306 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8307 location, count, transpose, value);
8308
8309 try
8310 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008311 if (count < 0)
8312 {
8313 return gl::error(GL_INVALID_VALUE);
8314 }
8315
8316 if (location == -1)
8317 {
8318 return;
8319 }
8320
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008321 gl::Context *context = gl::getNonLostContext();
8322
8323 if (context)
8324 {
8325 if (context->getClientVersion() < 3)
8326 {
8327 return gl::error(GL_INVALID_OPERATION);
8328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008329
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008330 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8331 if (!programBinary)
8332 {
8333 return gl::error(GL_INVALID_OPERATION);
8334 }
8335
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008336 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008337 {
8338 return gl::error(GL_INVALID_OPERATION);
8339 }
8340 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008341 }
8342 catch(std::bad_alloc&)
8343 {
8344 return gl::error(GL_OUT_OF_MEMORY);
8345 }
8346}
8347
8348void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8349{
8350 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8351 location, count, transpose, value);
8352
8353 try
8354 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008355 if (count < 0)
8356 {
8357 return gl::error(GL_INVALID_VALUE);
8358 }
8359
8360 if (location == -1)
8361 {
8362 return;
8363 }
8364
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008365 gl::Context *context = gl::getNonLostContext();
8366
8367 if (context)
8368 {
8369 if (context->getClientVersion() < 3)
8370 {
8371 return gl::error(GL_INVALID_OPERATION);
8372 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008373
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008374 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8375 if (!programBinary)
8376 {
8377 return gl::error(GL_INVALID_OPERATION);
8378 }
8379
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008380 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008381 {
8382 return gl::error(GL_INVALID_OPERATION);
8383 }
8384 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008385 }
8386 catch(std::bad_alloc&)
8387 {
8388 return gl::error(GL_OUT_OF_MEMORY);
8389 }
8390}
8391
8392void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8393{
8394 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8395 location, count, transpose, value);
8396
8397 try
8398 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008399 if (count < 0)
8400 {
8401 return gl::error(GL_INVALID_VALUE);
8402 }
8403
8404 if (location == -1)
8405 {
8406 return;
8407 }
8408
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008409 gl::Context *context = gl::getNonLostContext();
8410
8411 if (context)
8412 {
8413 if (context->getClientVersion() < 3)
8414 {
8415 return gl::error(GL_INVALID_OPERATION);
8416 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008417
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008418 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8419 if (!programBinary)
8420 {
8421 return gl::error(GL_INVALID_OPERATION);
8422 }
8423
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008424 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008425 {
8426 return gl::error(GL_INVALID_OPERATION);
8427 }
8428 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008429 }
8430 catch(std::bad_alloc&)
8431 {
8432 return gl::error(GL_OUT_OF_MEMORY);
8433 }
8434}
8435
8436void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8437{
8438 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8439 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8440 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8441
8442 try
8443 {
8444 gl::Context *context = gl::getNonLostContext();
8445
8446 if (context)
8447 {
8448 if (context->getClientVersion() < 3)
8449 {
8450 return gl::error(GL_INVALID_OPERATION);
8451 }
8452 }
8453
8454 UNIMPLEMENTED();
8455 }
8456 catch(std::bad_alloc&)
8457 {
8458 return gl::error(GL_OUT_OF_MEMORY);
8459 }
8460}
8461
8462void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8463{
8464 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8465 target, samples, internalformat, width, height);
8466
8467 try
8468 {
8469 gl::Context *context = gl::getNonLostContext();
8470
8471 if (context)
8472 {
8473 if (context->getClientVersion() < 3)
8474 {
8475 return gl::error(GL_INVALID_OPERATION);
8476 }
8477 }
8478
8479 UNIMPLEMENTED();
8480 }
8481 catch(std::bad_alloc&)
8482 {
8483 return gl::error(GL_OUT_OF_MEMORY);
8484 }
8485}
8486
8487void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8488{
8489 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8490 target, attachment, texture, level, layer);
8491
8492 try
8493 {
8494 gl::Context *context = gl::getNonLostContext();
8495
8496 if (context)
8497 {
8498 if (context->getClientVersion() < 3)
8499 {
8500 return gl::error(GL_INVALID_OPERATION);
8501 }
8502 }
8503
8504 UNIMPLEMENTED();
8505 }
8506 catch(std::bad_alloc&)
8507 {
8508 return gl::error(GL_OUT_OF_MEMORY);
8509 }
8510}
8511
8512GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8513{
8514 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8515 target, offset, length, access);
8516
8517 try
8518 {
8519 gl::Context *context = gl::getNonLostContext();
8520
8521 if (context)
8522 {
8523 if (context->getClientVersion() < 3)
8524 {
8525 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8526 }
8527 }
8528
8529 UNIMPLEMENTED();
8530 }
8531 catch(std::bad_alloc&)
8532 {
8533 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8534 }
8535
8536 return NULL;
8537}
8538
8539void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8540{
8541 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8542
8543 try
8544 {
8545 gl::Context *context = gl::getNonLostContext();
8546
8547 if (context)
8548 {
8549 if (context->getClientVersion() < 3)
8550 {
8551 return gl::error(GL_INVALID_OPERATION);
8552 }
8553 }
8554
8555 UNIMPLEMENTED();
8556 }
8557 catch(std::bad_alloc&)
8558 {
8559 return gl::error(GL_OUT_OF_MEMORY);
8560 }
8561}
8562
8563void __stdcall glBindVertexArray(GLuint array)
8564{
8565 EVENT("(GLuint array = %u)", array);
8566
8567 try
8568 {
8569 gl::Context *context = gl::getNonLostContext();
8570
8571 if (context)
8572 {
8573 if (context->getClientVersion() < 3)
8574 {
8575 return gl::error(GL_INVALID_OPERATION);
8576 }
8577 }
8578
8579 UNIMPLEMENTED();
8580 }
8581 catch(std::bad_alloc&)
8582 {
8583 return gl::error(GL_OUT_OF_MEMORY);
8584 }
8585}
8586
8587void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8588{
8589 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8590
8591 try
8592 {
8593 gl::Context *context = gl::getNonLostContext();
8594
8595 if (context)
8596 {
8597 if (context->getClientVersion() < 3)
8598 {
8599 return gl::error(GL_INVALID_OPERATION);
8600 }
8601 }
8602
8603 UNIMPLEMENTED();
8604 }
8605 catch(std::bad_alloc&)
8606 {
8607 return gl::error(GL_OUT_OF_MEMORY);
8608 }
8609}
8610
8611void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8612{
8613 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8614
8615 try
8616 {
8617 gl::Context *context = gl::getNonLostContext();
8618
8619 if (context)
8620 {
8621 if (context->getClientVersion() < 3)
8622 {
8623 return gl::error(GL_INVALID_OPERATION);
8624 }
8625 }
8626
8627 UNIMPLEMENTED();
8628 }
8629 catch(std::bad_alloc&)
8630 {
8631 return gl::error(GL_OUT_OF_MEMORY);
8632 }
8633}
8634
8635GLboolean __stdcall glIsVertexArray(GLuint array)
8636{
8637 EVENT("(GLuint array = %u)", array);
8638
8639 try
8640 {
8641 gl::Context *context = gl::getNonLostContext();
8642
8643 if (context)
8644 {
8645 if (context->getClientVersion() < 3)
8646 {
8647 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8648 }
8649 }
8650
8651 UNIMPLEMENTED();
8652 }
8653 catch(std::bad_alloc&)
8654 {
8655 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8656 }
8657
8658 return GL_FALSE;
8659}
8660
8661void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8662{
8663 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8664 target, index, data);
8665
8666 try
8667 {
8668 gl::Context *context = gl::getNonLostContext();
8669
8670 if (context)
8671 {
8672 if (context->getClientVersion() < 3)
8673 {
8674 return gl::error(GL_INVALID_OPERATION);
8675 }
8676 }
8677
8678 UNIMPLEMENTED();
8679 }
8680 catch(std::bad_alloc&)
8681 {
8682 return gl::error(GL_OUT_OF_MEMORY);
8683 }
8684}
8685
8686void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8687{
8688 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8689
8690 try
8691 {
8692 gl::Context *context = gl::getNonLostContext();
8693
8694 if (context)
8695 {
8696 if (context->getClientVersion() < 3)
8697 {
8698 return gl::error(GL_INVALID_OPERATION);
8699 }
8700 }
8701
8702 UNIMPLEMENTED();
8703 }
8704 catch(std::bad_alloc&)
8705 {
8706 return gl::error(GL_OUT_OF_MEMORY);
8707 }
8708}
8709
8710void __stdcall glEndTransformFeedback(void)
8711{
8712 EVENT("(void)");
8713
8714 try
8715 {
8716 gl::Context *context = gl::getNonLostContext();
8717
8718 if (context)
8719 {
8720 if (context->getClientVersion() < 3)
8721 {
8722 return gl::error(GL_INVALID_OPERATION);
8723 }
8724 }
8725
8726 UNIMPLEMENTED();
8727 }
8728 catch(std::bad_alloc&)
8729 {
8730 return gl::error(GL_OUT_OF_MEMORY);
8731 }
8732}
8733
8734void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8735{
8736 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8737 target, index, buffer, offset, size);
8738
8739 try
8740 {
8741 gl::Context *context = gl::getNonLostContext();
8742
8743 if (context)
8744 {
8745 if (context->getClientVersion() < 3)
8746 {
8747 return gl::error(GL_INVALID_OPERATION);
8748 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008749
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008750 switch (target)
8751 {
8752 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008753 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008754 {
8755 return gl::error(GL_INVALID_VALUE);
8756 }
8757 break;
8758
8759 case GL_UNIFORM_BUFFER:
8760 if (index >= context->getMaximumCombinedUniformBufferBindings())
8761 {
8762 return gl::error(GL_INVALID_VALUE);
8763 }
8764 break;
8765
8766 default:
8767 return gl::error(GL_INVALID_ENUM);
8768 }
8769
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008770 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008771 {
8772 return gl::error(GL_INVALID_VALUE);
8773 }
8774
8775 switch (target)
8776 {
8777 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008778
8779 // size and offset must be a multiple of 4
8780 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8781 {
8782 return gl::error(GL_INVALID_VALUE);
8783 }
8784
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008785 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8786 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008787 break;
8788
8789 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008790
8791 // it is an error to bind an offset not a multiple of the alignment
8792 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8793 {
8794 return gl::error(GL_INVALID_VALUE);
8795 }
8796
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008797 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8798 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008799 break;
8800
8801 default:
8802 UNREACHABLE();
8803 }
8804 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008805 }
8806 catch(std::bad_alloc&)
8807 {
8808 return gl::error(GL_OUT_OF_MEMORY);
8809 }
8810}
8811
8812void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8813{
8814 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8815 target, index, buffer);
8816
8817 try
8818 {
8819 gl::Context *context = gl::getNonLostContext();
8820
8821 if (context)
8822 {
8823 if (context->getClientVersion() < 3)
8824 {
8825 return gl::error(GL_INVALID_OPERATION);
8826 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008827
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008828 switch (target)
8829 {
8830 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008831 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008832 {
8833 return gl::error(GL_INVALID_VALUE);
8834 }
8835 break;
8836
8837 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008838 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008839 {
8840 return gl::error(GL_INVALID_VALUE);
8841 }
8842 break;
8843
8844 default:
8845 return gl::error(GL_INVALID_ENUM);
8846 }
8847
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008848 switch (target)
8849 {
8850 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008851 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008852 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008853 break;
8854
8855 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008856 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008857 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008858 break;
8859
8860 default:
8861 UNREACHABLE();
8862 }
8863 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008864 }
8865 catch(std::bad_alloc&)
8866 {
8867 return gl::error(GL_OUT_OF_MEMORY);
8868 }
8869}
8870
8871void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8872{
8873 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8874 program, count, varyings, bufferMode);
8875
8876 try
8877 {
8878 gl::Context *context = gl::getNonLostContext();
8879
8880 if (context)
8881 {
8882 if (context->getClientVersion() < 3)
8883 {
8884 return gl::error(GL_INVALID_OPERATION);
8885 }
8886 }
8887
8888 UNIMPLEMENTED();
8889 }
8890 catch(std::bad_alloc&)
8891 {
8892 return gl::error(GL_OUT_OF_MEMORY);
8893 }
8894}
8895
8896void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8897{
8898 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8899 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8900 program, index, bufSize, length, size, type, name);
8901
8902 try
8903 {
8904 gl::Context *context = gl::getNonLostContext();
8905
8906 if (context)
8907 {
8908 if (context->getClientVersion() < 3)
8909 {
8910 return gl::error(GL_INVALID_OPERATION);
8911 }
8912 }
8913
8914 UNIMPLEMENTED();
8915 }
8916 catch(std::bad_alloc&)
8917 {
8918 return gl::error(GL_OUT_OF_MEMORY);
8919 }
8920}
8921
8922void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8923{
8924 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8925 index, size, type, stride, pointer);
8926
8927 try
8928 {
8929 gl::Context *context = gl::getNonLostContext();
8930
8931 if (context)
8932 {
8933 if (context->getClientVersion() < 3)
8934 {
8935 return gl::error(GL_INVALID_OPERATION);
8936 }
8937 }
8938
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008939 if (index >= gl::MAX_VERTEX_ATTRIBS)
8940 {
8941 return gl::error(GL_INVALID_VALUE);
8942 }
8943
8944 if (size < 1 || size > 4)
8945 {
8946 return gl::error(GL_INVALID_VALUE);
8947 }
8948
8949 switch (type)
8950 {
8951 case GL_BYTE:
8952 case GL_UNSIGNED_BYTE:
8953 case GL_SHORT:
8954 case GL_UNSIGNED_SHORT:
8955 case GL_INT:
8956 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008957 case GL_INT_2_10_10_10_REV:
8958 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008959 break;
8960 default:
8961 return gl::error(GL_INVALID_ENUM);
8962 }
8963
8964 if (stride < 0)
8965 {
8966 return gl::error(GL_INVALID_VALUE);
8967 }
8968
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008969 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8970 {
8971 return gl::error(GL_INVALID_OPERATION);
8972 }
8973
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008974 if (context)
8975 {
8976 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8977 stride, pointer);
8978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008979 }
8980 catch(std::bad_alloc&)
8981 {
8982 return gl::error(GL_OUT_OF_MEMORY);
8983 }
8984}
8985
8986void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8987{
8988 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8989 index, pname, params);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
9001 }
9002
9003 UNIMPLEMENTED();
9004 }
9005 catch(std::bad_alloc&)
9006 {
9007 return gl::error(GL_OUT_OF_MEMORY);
9008 }
9009}
9010
9011void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
9012{
9013 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
9014 index, pname, params);
9015
9016 try
9017 {
9018 gl::Context *context = gl::getNonLostContext();
9019
9020 if (context)
9021 {
9022 if (context->getClientVersion() < 3)
9023 {
9024 return gl::error(GL_INVALID_OPERATION);
9025 }
9026 }
9027
9028 UNIMPLEMENTED();
9029 }
9030 catch(std::bad_alloc&)
9031 {
9032 return gl::error(GL_OUT_OF_MEMORY);
9033 }
9034}
9035
9036void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
9037{
9038 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
9039 index, x, y, z, w);
9040
9041 try
9042 {
9043 gl::Context *context = gl::getNonLostContext();
9044
9045 if (context)
9046 {
9047 if (context->getClientVersion() < 3)
9048 {
9049 return gl::error(GL_INVALID_OPERATION);
9050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009051
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009052 if (index >= gl::MAX_VERTEX_ATTRIBS)
9053 {
9054 return gl::error(GL_INVALID_VALUE);
9055 }
9056
9057 GLint vals[4] = { x, y, z, w };
9058 context->setVertexAttribi(index, vals);
9059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060 }
9061 catch(std::bad_alloc&)
9062 {
9063 return gl::error(GL_OUT_OF_MEMORY);
9064 }
9065}
9066
9067void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
9068{
9069 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
9070 index, x, y, z, w);
9071
9072 try
9073 {
9074 gl::Context *context = gl::getNonLostContext();
9075
9076 if (context)
9077 {
9078 if (context->getClientVersion() < 3)
9079 {
9080 return gl::error(GL_INVALID_OPERATION);
9081 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009082
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009083 if (index >= gl::MAX_VERTEX_ATTRIBS)
9084 {
9085 return gl::error(GL_INVALID_VALUE);
9086 }
9087
9088 GLuint vals[4] = { x, y, z, w };
9089 context->setVertexAttribu(index, vals);
9090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009091 }
9092 catch(std::bad_alloc&)
9093 {
9094 return gl::error(GL_OUT_OF_MEMORY);
9095 }
9096}
9097
9098void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9099{
9100 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9101
9102 try
9103 {
9104 gl::Context *context = gl::getNonLostContext();
9105
9106 if (context)
9107 {
9108 if (context->getClientVersion() < 3)
9109 {
9110 return gl::error(GL_INVALID_OPERATION);
9111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009112
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009113 if (index >= gl::MAX_VERTEX_ATTRIBS)
9114 {
9115 return gl::error(GL_INVALID_VALUE);
9116 }
9117
9118 context->setVertexAttribi(index, v);
9119 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009120 }
9121 catch(std::bad_alloc&)
9122 {
9123 return gl::error(GL_OUT_OF_MEMORY);
9124 }
9125}
9126
9127void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9128{
9129 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9130
9131 try
9132 {
9133 gl::Context *context = gl::getNonLostContext();
9134
9135 if (context)
9136 {
9137 if (context->getClientVersion() < 3)
9138 {
9139 return gl::error(GL_INVALID_OPERATION);
9140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009141
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009142 if (index >= gl::MAX_VERTEX_ATTRIBS)
9143 {
9144 return gl::error(GL_INVALID_VALUE);
9145 }
9146
9147 context->setVertexAttribu(index, v);
9148 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009149 }
9150 catch(std::bad_alloc&)
9151 {
9152 return gl::error(GL_OUT_OF_MEMORY);
9153 }
9154}
9155
9156void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9157{
9158 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9159 program, location, params);
9160
9161 try
9162 {
9163 gl::Context *context = gl::getNonLostContext();
9164
9165 if (context)
9166 {
9167 if (context->getClientVersion() < 3)
9168 {
9169 return gl::error(GL_INVALID_OPERATION);
9170 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009171
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009172 if (program == 0)
9173 {
9174 return gl::error(GL_INVALID_VALUE);
9175 }
9176
9177 gl::Program *programObject = context->getProgram(program);
9178
9179 if (!programObject || !programObject->isLinked())
9180 {
9181 return gl::error(GL_INVALID_OPERATION);
9182 }
9183
9184 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9185 if (!programBinary)
9186 {
9187 return gl::error(GL_INVALID_OPERATION);
9188 }
9189
9190 if (!programBinary->getUniformuiv(location, NULL, params))
9191 {
9192 return gl::error(GL_INVALID_OPERATION);
9193 }
9194 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009195 }
9196 catch(std::bad_alloc&)
9197 {
9198 return gl::error(GL_OUT_OF_MEMORY);
9199 }
9200}
9201
9202GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9203{
9204 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9205 program, name);
9206
9207 try
9208 {
9209 gl::Context *context = gl::getNonLostContext();
9210
9211 if (context)
9212 {
9213 if (context->getClientVersion() < 3)
9214 {
9215 return gl::error(GL_INVALID_OPERATION, 0);
9216 }
9217 }
9218
9219 UNIMPLEMENTED();
9220 }
9221 catch(std::bad_alloc&)
9222 {
9223 return gl::error(GL_OUT_OF_MEMORY, 0);
9224 }
9225
9226 return 0;
9227}
9228
9229void __stdcall glUniform1ui(GLint location, GLuint v0)
9230{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009231 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009232}
9233
9234void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9235{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009236 const GLuint xy[] = { v0, v1 };
9237 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009238}
9239
9240void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9241{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009242 const GLuint xyz[] = { v0, v1, v2 };
9243 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009244}
9245
9246void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9247{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009248 const GLuint xyzw[] = { v0, v1, v2, v3 };
9249 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009250}
9251
9252void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9253{
9254 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9255 location, count, value);
9256
9257 try
9258 {
9259 gl::Context *context = gl::getNonLostContext();
9260
9261 if (context)
9262 {
9263 if (context->getClientVersion() < 3)
9264 {
9265 return gl::error(GL_INVALID_OPERATION);
9266 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009267
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009268 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9269 if (!programBinary)
9270 {
9271 return gl::error(GL_INVALID_OPERATION);
9272 }
9273
9274 if (!programBinary->setUniform1uiv(location, count, value))
9275 {
9276 return gl::error(GL_INVALID_OPERATION);
9277 }
9278 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009279 }
9280 catch(std::bad_alloc&)
9281 {
9282 return gl::error(GL_OUT_OF_MEMORY);
9283 }
9284}
9285
9286void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9287{
9288 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9289 location, count, value);
9290
9291 try
9292 {
9293 gl::Context *context = gl::getNonLostContext();
9294
9295 if (context)
9296 {
9297 if (context->getClientVersion() < 3)
9298 {
9299 return gl::error(GL_INVALID_OPERATION);
9300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009301
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009302 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9303 if (!programBinary)
9304 {
9305 return gl::error(GL_INVALID_OPERATION);
9306 }
9307
9308 if (!programBinary->setUniform2uiv(location, count, value))
9309 {
9310 return gl::error(GL_INVALID_OPERATION);
9311 }
9312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009313 }
9314 catch(std::bad_alloc&)
9315 {
9316 return gl::error(GL_OUT_OF_MEMORY);
9317 }
9318}
9319
9320void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9321{
9322 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9323 location, count, value);
9324
9325 try
9326 {
9327 gl::Context *context = gl::getNonLostContext();
9328
9329 if (context)
9330 {
9331 if (context->getClientVersion() < 3)
9332 {
9333 return gl::error(GL_INVALID_OPERATION);
9334 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009335
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009336 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9337 if (!programBinary)
9338 {
9339 return gl::error(GL_INVALID_OPERATION);
9340 }
9341
9342 if (!programBinary->setUniform3uiv(location, count, value))
9343 {
9344 return gl::error(GL_INVALID_OPERATION);
9345 }
9346 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009347 }
9348 catch(std::bad_alloc&)
9349 {
9350 return gl::error(GL_OUT_OF_MEMORY);
9351 }
9352}
9353
9354void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9355{
9356 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9357 location, count, value);
9358
9359 try
9360 {
9361 gl::Context *context = gl::getNonLostContext();
9362
9363 if (context)
9364 {
9365 if (context->getClientVersion() < 3)
9366 {
9367 return gl::error(GL_INVALID_OPERATION);
9368 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009369
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009370 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9371 if (!programBinary)
9372 {
9373 return gl::error(GL_INVALID_OPERATION);
9374 }
9375
9376 if (!programBinary->setUniform4uiv(location, count, value))
9377 {
9378 return gl::error(GL_INVALID_OPERATION);
9379 }
9380 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009381 }
9382 catch(std::bad_alloc&)
9383 {
9384 return gl::error(GL_OUT_OF_MEMORY);
9385 }
9386}
9387
9388void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9389{
9390 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9391 buffer, drawbuffer, value);
9392
9393 try
9394 {
9395 gl::Context *context = gl::getNonLostContext();
9396
9397 if (context)
9398 {
9399 if (context->getClientVersion() < 3)
9400 {
9401 return gl::error(GL_INVALID_OPERATION);
9402 }
9403 }
9404
9405 UNIMPLEMENTED();
9406 }
9407 catch(std::bad_alloc&)
9408 {
9409 return gl::error(GL_OUT_OF_MEMORY);
9410 }
9411}
9412
9413void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9414{
9415 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9416 buffer, drawbuffer, value);
9417
9418 try
9419 {
9420 gl::Context *context = gl::getNonLostContext();
9421
9422 if (context)
9423 {
9424 if (context->getClientVersion() < 3)
9425 {
9426 return gl::error(GL_INVALID_OPERATION);
9427 }
9428 }
9429
9430 UNIMPLEMENTED();
9431 }
9432 catch(std::bad_alloc&)
9433 {
9434 return gl::error(GL_OUT_OF_MEMORY);
9435 }
9436}
9437
9438void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9439{
9440 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9441 buffer, drawbuffer, value);
9442
9443 try
9444 {
9445 gl::Context *context = gl::getNonLostContext();
9446
9447 if (context)
9448 {
9449 if (context->getClientVersion() < 3)
9450 {
9451 return gl::error(GL_INVALID_OPERATION);
9452 }
9453 }
9454
9455 UNIMPLEMENTED();
9456 }
9457 catch(std::bad_alloc&)
9458 {
9459 return gl::error(GL_OUT_OF_MEMORY);
9460 }
9461}
9462
9463void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9464{
9465 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9466 buffer, drawbuffer, depth, stencil);
9467
9468 try
9469 {
9470 gl::Context *context = gl::getNonLostContext();
9471
9472 if (context)
9473 {
9474 if (context->getClientVersion() < 3)
9475 {
9476 return gl::error(GL_INVALID_OPERATION);
9477 }
9478 }
9479
9480 UNIMPLEMENTED();
9481 }
9482 catch(std::bad_alloc&)
9483 {
9484 return gl::error(GL_OUT_OF_MEMORY);
9485 }
9486}
9487
9488const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9489{
9490 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9491
9492 try
9493 {
9494 gl::Context *context = gl::getNonLostContext();
9495
9496 if (context)
9497 {
9498 if (context->getClientVersion() < 3)
9499 {
9500 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9501 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009502
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009503 if (name != GL_EXTENSIONS)
9504 {
9505 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9506 }
9507
9508 if (index >= context->getNumExtensions())
9509 {
9510 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9511 }
9512
9513 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9514 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009515 }
9516 catch(std::bad_alloc&)
9517 {
9518 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9519 }
9520
9521 return NULL;
9522}
9523
9524void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9525{
9526 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9527 readTarget, writeTarget, readOffset, writeOffset, size);
9528
9529 try
9530 {
9531 gl::Context *context = gl::getNonLostContext();
9532
9533 if (context)
9534 {
9535 if (context->getClientVersion() < 3)
9536 {
9537 return gl::error(GL_INVALID_OPERATION);
9538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009539
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009540 gl::Buffer *readBuffer = NULL;
9541 switch (readTarget)
9542 {
9543 case GL_ARRAY_BUFFER:
9544 readBuffer = context->getArrayBuffer();
9545 break;
9546 case GL_COPY_READ_BUFFER:
9547 readBuffer = context->getCopyReadBuffer();
9548 break;
9549 case GL_COPY_WRITE_BUFFER:
9550 readBuffer = context->getCopyWriteBuffer();
9551 break;
9552 case GL_ELEMENT_ARRAY_BUFFER:
9553 readBuffer = context->getElementArrayBuffer();
9554 break;
9555 case GL_PIXEL_PACK_BUFFER:
9556 readBuffer = context->getPixelPackBuffer();
9557 break;
9558 case GL_PIXEL_UNPACK_BUFFER:
9559 readBuffer = context->getPixelUnpackBuffer();
9560 break;
9561 case GL_TRANSFORM_FEEDBACK_BUFFER:
9562 readBuffer = context->getGenericTransformFeedbackBuffer();
9563 break;
9564 case GL_UNIFORM_BUFFER:
9565 readBuffer = context->getGenericUniformBuffer();
9566 break;
9567 default:
9568 return gl::error(GL_INVALID_ENUM);
9569 }
9570
9571 gl::Buffer *writeBuffer = NULL;
9572 switch (writeTarget)
9573 {
9574 case GL_ARRAY_BUFFER:
9575 writeBuffer = context->getArrayBuffer();
9576 break;
9577 case GL_COPY_READ_BUFFER:
9578 writeBuffer = context->getCopyReadBuffer();
9579 break;
9580 case GL_COPY_WRITE_BUFFER:
9581 writeBuffer = context->getCopyWriteBuffer();
9582 break;
9583 case GL_ELEMENT_ARRAY_BUFFER:
9584 writeBuffer = context->getElementArrayBuffer();
9585 break;
9586 case GL_PIXEL_PACK_BUFFER:
9587 writeBuffer = context->getPixelPackBuffer();
9588 break;
9589 case GL_PIXEL_UNPACK_BUFFER:
9590 writeBuffer = context->getPixelUnpackBuffer();
9591 break;
9592 case GL_TRANSFORM_FEEDBACK_BUFFER:
9593 writeBuffer = context->getGenericTransformFeedbackBuffer();
9594 break;
9595 case GL_UNIFORM_BUFFER:
9596 writeBuffer = context->getGenericUniformBuffer();
9597 break;
9598 default:
9599 return gl::error(GL_INVALID_ENUM);
9600 }
9601
9602 if (!readBuffer || !writeBuffer)
9603 {
9604 return gl::error(GL_INVALID_OPERATION);
9605 }
9606
9607 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9608 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9609 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9610 {
9611 return gl::error(GL_INVALID_VALUE);
9612 }
9613
9614 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9615 {
9616 return gl::error(GL_INVALID_VALUE);
9617 }
9618
9619 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9620
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009621 // if size is zero, the copy is a successful no-op
9622 if (size > 0)
9623 {
9624 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9625 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009626 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009627 }
9628 catch(std::bad_alloc&)
9629 {
9630 return gl::error(GL_OUT_OF_MEMORY);
9631 }
9632}
9633
9634void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9635{
9636 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9637 program, uniformCount, uniformNames, uniformIndices);
9638
9639 try
9640 {
9641 gl::Context *context = gl::getNonLostContext();
9642
9643 if (context)
9644 {
9645 if (context->getClientVersion() < 3)
9646 {
9647 return gl::error(GL_INVALID_OPERATION);
9648 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009649
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009650 if (uniformCount < 0)
9651 {
9652 return gl::error(GL_INVALID_VALUE);
9653 }
9654
9655 gl::Program *programObject = context->getProgram(program);
9656
9657 if (!programObject)
9658 {
9659 if (context->getShader(program))
9660 {
9661 return gl::error(GL_INVALID_OPERATION);
9662 }
9663 else
9664 {
9665 return gl::error(GL_INVALID_VALUE);
9666 }
9667 }
9668
9669 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9670 if (!programObject->isLinked() || !programBinary)
9671 {
9672 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9673 {
9674 uniformIndices[uniformId] = GL_INVALID_INDEX;
9675 }
9676 }
9677 else
9678 {
9679 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9680 {
9681 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9682 }
9683 }
9684 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009685 }
9686 catch(std::bad_alloc&)
9687 {
9688 return gl::error(GL_OUT_OF_MEMORY);
9689 }
9690}
9691
9692void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9693{
9694 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9695 program, uniformCount, uniformIndices, pname, params);
9696
9697 try
9698 {
9699 gl::Context *context = gl::getNonLostContext();
9700
9701 if (context)
9702 {
9703 if (context->getClientVersion() < 3)
9704 {
9705 return gl::error(GL_INVALID_OPERATION);
9706 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009707
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009708 if (uniformCount < 0)
9709 {
9710 return gl::error(GL_INVALID_VALUE);
9711 }
9712
9713 gl::Program *programObject = context->getProgram(program);
9714
9715 if (!programObject)
9716 {
9717 if (context->getShader(program))
9718 {
9719 return gl::error(GL_INVALID_OPERATION);
9720 }
9721 else
9722 {
9723 return gl::error(GL_INVALID_VALUE);
9724 }
9725 }
9726
9727 switch (pname)
9728 {
9729 case GL_UNIFORM_TYPE:
9730 case GL_UNIFORM_SIZE:
9731 case GL_UNIFORM_NAME_LENGTH:
9732 case GL_UNIFORM_BLOCK_INDEX:
9733 case GL_UNIFORM_OFFSET:
9734 case GL_UNIFORM_ARRAY_STRIDE:
9735 case GL_UNIFORM_MATRIX_STRIDE:
9736 case GL_UNIFORM_IS_ROW_MAJOR:
9737 break;
9738 default:
9739 return gl::error(GL_INVALID_ENUM);
9740 }
9741
9742 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9743
9744 if (!programBinary && uniformCount > 0)
9745 {
9746 return gl::error(GL_INVALID_VALUE);
9747 }
9748
9749 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9750 {
9751 const GLuint index = uniformIndices[uniformId];
9752
9753 if (index >= (GLuint)programBinary->getActiveUniformCount())
9754 {
9755 return gl::error(GL_INVALID_VALUE);
9756 }
9757 }
9758
9759 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9760 {
9761 const GLuint index = uniformIndices[uniformId];
9762 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9763 }
9764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009765 }
9766 catch(std::bad_alloc&)
9767 {
9768 return gl::error(GL_OUT_OF_MEMORY);
9769 }
9770}
9771
9772GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9773{
9774 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9775
9776 try
9777 {
9778 gl::Context *context = gl::getNonLostContext();
9779
9780 if (context)
9781 {
9782 if (context->getClientVersion() < 3)
9783 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009784 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009786
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009787 gl::Program *programObject = context->getProgram(program);
9788
9789 if (!programObject)
9790 {
9791 if (context->getShader(program))
9792 {
9793 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9794 }
9795 else
9796 {
9797 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9798 }
9799 }
9800
9801 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9802 if (!programBinary)
9803 {
9804 return GL_INVALID_INDEX;
9805 }
9806
9807 return programBinary->getUniformBlockIndex(uniformBlockName);
9808 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009809 }
9810 catch(std::bad_alloc&)
9811 {
9812 return gl::error(GL_OUT_OF_MEMORY, 0);
9813 }
9814
9815 return 0;
9816}
9817
9818void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9819{
9820 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9821 program, uniformBlockIndex, pname, params);
9822
9823 try
9824 {
9825 gl::Context *context = gl::getNonLostContext();
9826
9827 if (context)
9828 {
9829 if (context->getClientVersion() < 3)
9830 {
9831 return gl::error(GL_INVALID_OPERATION);
9832 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009833 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009834
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009835 if (!programObject)
9836 {
9837 if (context->getShader(program))
9838 {
9839 return gl::error(GL_INVALID_OPERATION);
9840 }
9841 else
9842 {
9843 return gl::error(GL_INVALID_VALUE);
9844 }
9845 }
9846
9847 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9848
9849 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9850 {
9851 return gl::error(GL_INVALID_VALUE);
9852 }
9853
9854 switch (pname)
9855 {
9856 case GL_UNIFORM_BLOCK_BINDING:
9857 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9858 break;
9859
9860 case GL_UNIFORM_BLOCK_DATA_SIZE:
9861 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9862 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9863 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9864 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9865 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9866 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9867 break;
9868
9869 default:
9870 return gl::error(GL_INVALID_ENUM);
9871 }
9872 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009873 }
9874 catch(std::bad_alloc&)
9875 {
9876 return gl::error(GL_OUT_OF_MEMORY);
9877 }
9878}
9879
9880void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9881{
9882 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9883 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9884
9885 try
9886 {
9887 gl::Context *context = gl::getNonLostContext();
9888
9889 if (context)
9890 {
9891 if (context->getClientVersion() < 3)
9892 {
9893 return gl::error(GL_INVALID_OPERATION);
9894 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009895
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009896 gl::Program *programObject = context->getProgram(program);
9897
9898 if (!programObject)
9899 {
9900 if (context->getShader(program))
9901 {
9902 return gl::error(GL_INVALID_OPERATION);
9903 }
9904 else
9905 {
9906 return gl::error(GL_INVALID_VALUE);
9907 }
9908 }
9909
9910 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9911
9912 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9913 {
9914 return gl::error(GL_INVALID_VALUE);
9915 }
9916
9917 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
9918 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009919 }
9920 catch(std::bad_alloc&)
9921 {
9922 return gl::error(GL_OUT_OF_MEMORY);
9923 }
9924}
9925
9926void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9927{
9928 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9929 program, uniformBlockIndex, uniformBlockBinding);
9930
9931 try
9932 {
9933 gl::Context *context = gl::getNonLostContext();
9934
9935 if (context)
9936 {
9937 if (context->getClientVersion() < 3)
9938 {
9939 return gl::error(GL_INVALID_OPERATION);
9940 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009941
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00009942 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
9943 {
9944 return gl::error(GL_INVALID_VALUE);
9945 }
9946
9947 gl::Program *programObject = context->getProgram(program);
9948
9949 if (!programObject)
9950 {
9951 if (context->getShader(program))
9952 {
9953 return gl::error(GL_INVALID_OPERATION);
9954 }
9955 else
9956 {
9957 return gl::error(GL_INVALID_VALUE);
9958 }
9959 }
9960
9961 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9962
9963 // if never linked, there won't be any uniform blocks
9964 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9965 {
9966 return gl::error(GL_INVALID_VALUE);
9967 }
9968
9969 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9970 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009971 }
9972 catch(std::bad_alloc&)
9973 {
9974 return gl::error(GL_OUT_OF_MEMORY);
9975 }
9976}
9977
9978void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9979{
9980 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9981 mode, first, count, instanceCount);
9982
9983 try
9984 {
9985 gl::Context *context = gl::getNonLostContext();
9986
9987 if (context)
9988 {
9989 if (context->getClientVersion() < 3)
9990 {
9991 return gl::error(GL_INVALID_OPERATION);
9992 }
9993 }
9994
9995 UNIMPLEMENTED();
9996 }
9997 catch(std::bad_alloc&)
9998 {
9999 return gl::error(GL_OUT_OF_MEMORY);
10000 }
10001}
10002
10003void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
10004{
10005 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
10006 mode, count, type, indices, instanceCount);
10007
10008 try
10009 {
10010 gl::Context *context = gl::getNonLostContext();
10011
10012 if (context)
10013 {
10014 if (context->getClientVersion() < 3)
10015 {
10016 return gl::error(GL_INVALID_OPERATION);
10017 }
10018 }
10019
10020 UNIMPLEMENTED();
10021 }
10022 catch(std::bad_alloc&)
10023 {
10024 return gl::error(GL_OUT_OF_MEMORY);
10025 }
10026}
10027
10028GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
10029{
10030 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
10031
10032 try
10033 {
10034 gl::Context *context = gl::getNonLostContext();
10035
10036 if (context)
10037 {
10038 if (context->getClientVersion() < 3)
10039 {
10040 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
10041 }
10042 }
10043
10044 UNIMPLEMENTED();
10045 }
10046 catch(std::bad_alloc&)
10047 {
10048 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
10049 }
10050
10051 return NULL;
10052}
10053
10054GLboolean __stdcall glIsSync(GLsync sync)
10055{
10056 EVENT("(GLsync sync = 0x%0.8p)", sync);
10057
10058 try
10059 {
10060 gl::Context *context = gl::getNonLostContext();
10061
10062 if (context)
10063 {
10064 if (context->getClientVersion() < 3)
10065 {
10066 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10067 }
10068 }
10069
10070 UNIMPLEMENTED();
10071 }
10072 catch(std::bad_alloc&)
10073 {
10074 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10075 }
10076
10077 return GL_FALSE;
10078}
10079
10080void __stdcall glDeleteSync(GLsync sync)
10081{
10082 EVENT("(GLsync sync = 0x%0.8p)", sync);
10083
10084 try
10085 {
10086 gl::Context *context = gl::getNonLostContext();
10087
10088 if (context)
10089 {
10090 if (context->getClientVersion() < 3)
10091 {
10092 return gl::error(GL_INVALID_OPERATION);
10093 }
10094 }
10095
10096 UNIMPLEMENTED();
10097 }
10098 catch(std::bad_alloc&)
10099 {
10100 return gl::error(GL_OUT_OF_MEMORY);
10101 }
10102}
10103
10104GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10105{
10106 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10107 sync, flags, timeout);
10108
10109 try
10110 {
10111 gl::Context *context = gl::getNonLostContext();
10112
10113 if (context)
10114 {
10115 if (context->getClientVersion() < 3)
10116 {
10117 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10118 }
10119 }
10120
10121 UNIMPLEMENTED();
10122 }
10123 catch(std::bad_alloc&)
10124 {
10125 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10126 }
10127
10128 return GL_FALSE;
10129}
10130
10131void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10132{
10133 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10134 sync, flags, timeout);
10135
10136 try
10137 {
10138 gl::Context *context = gl::getNonLostContext();
10139
10140 if (context)
10141 {
10142 if (context->getClientVersion() < 3)
10143 {
10144 return gl::error(GL_INVALID_OPERATION);
10145 }
10146 }
10147
10148 UNIMPLEMENTED();
10149 }
10150 catch(std::bad_alloc&)
10151 {
10152 return gl::error(GL_OUT_OF_MEMORY);
10153 }
10154}
10155
10156void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10157{
10158 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10159 pname, params);
10160
10161 try
10162 {
10163 gl::Context *context = gl::getNonLostContext();
10164
10165 if (context)
10166 {
10167 if (context->getClientVersion() < 3)
10168 {
10169 return gl::error(GL_INVALID_OPERATION);
10170 }
10171 }
10172
10173 UNIMPLEMENTED();
10174 }
10175 catch(std::bad_alloc&)
10176 {
10177 return gl::error(GL_OUT_OF_MEMORY);
10178 }
10179}
10180
10181void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10182{
10183 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10184 sync, pname, bufSize, length, values);
10185
10186 try
10187 {
10188 gl::Context *context = gl::getNonLostContext();
10189
10190 if (context)
10191 {
10192 if (context->getClientVersion() < 3)
10193 {
10194 return gl::error(GL_INVALID_OPERATION);
10195 }
10196 }
10197
10198 UNIMPLEMENTED();
10199 }
10200 catch(std::bad_alloc&)
10201 {
10202 return gl::error(GL_OUT_OF_MEMORY);
10203 }
10204}
10205
10206void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10207{
10208 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10209 target, index, data);
10210
10211 try
10212 {
10213 gl::Context *context = gl::getNonLostContext();
10214
10215 if (context)
10216 {
10217 if (context->getClientVersion() < 3)
10218 {
10219 return gl::error(GL_INVALID_OPERATION);
10220 }
10221 }
10222
10223 UNIMPLEMENTED();
10224 }
10225 catch(std::bad_alloc&)
10226 {
10227 return gl::error(GL_OUT_OF_MEMORY);
10228 }
10229}
10230
10231void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10232{
10233 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10234 target, pname, params);
10235
10236 try
10237 {
10238 gl::Context *context = gl::getNonLostContext();
10239
10240 if (context)
10241 {
10242 if (context->getClientVersion() < 3)
10243 {
10244 return gl::error(GL_INVALID_OPERATION);
10245 }
10246 }
10247
10248 UNIMPLEMENTED();
10249 }
10250 catch(std::bad_alloc&)
10251 {
10252 return gl::error(GL_OUT_OF_MEMORY);
10253 }
10254}
10255
10256void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10257{
10258 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10259
10260 try
10261 {
10262 gl::Context *context = gl::getNonLostContext();
10263
10264 if (context)
10265 {
10266 if (context->getClientVersion() < 3)
10267 {
10268 return gl::error(GL_INVALID_OPERATION);
10269 }
10270 }
10271
10272 UNIMPLEMENTED();
10273 }
10274 catch(std::bad_alloc&)
10275 {
10276 return gl::error(GL_OUT_OF_MEMORY);
10277 }
10278}
10279
10280void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10281{
10282 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10283
10284 try
10285 {
10286 gl::Context *context = gl::getNonLostContext();
10287
10288 if (context)
10289 {
10290 if (context->getClientVersion() < 3)
10291 {
10292 return gl::error(GL_INVALID_OPERATION);
10293 }
10294 }
10295
10296 UNIMPLEMENTED();
10297 }
10298 catch(std::bad_alloc&)
10299 {
10300 return gl::error(GL_OUT_OF_MEMORY);
10301 }
10302}
10303
10304GLboolean __stdcall glIsSampler(GLuint sampler)
10305{
10306 EVENT("(GLuint sampler = %u)", sampler);
10307
10308 try
10309 {
10310 gl::Context *context = gl::getNonLostContext();
10311
10312 if (context)
10313 {
10314 if (context->getClientVersion() < 3)
10315 {
10316 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10317 }
10318 }
10319
10320 UNIMPLEMENTED();
10321 }
10322 catch(std::bad_alloc&)
10323 {
10324 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10325 }
10326
10327 return GL_FALSE;
10328}
10329
10330void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10331{
10332 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10333
10334 try
10335 {
10336 gl::Context *context = gl::getNonLostContext();
10337
10338 if (context)
10339 {
10340 if (context->getClientVersion() < 3)
10341 {
10342 return gl::error(GL_INVALID_OPERATION);
10343 }
10344 }
10345
10346 UNIMPLEMENTED();
10347 }
10348 catch(std::bad_alloc&)
10349 {
10350 return gl::error(GL_OUT_OF_MEMORY);
10351 }
10352}
10353
10354void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10355{
10356 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10357
10358 try
10359 {
10360 gl::Context *context = gl::getNonLostContext();
10361
10362 if (context)
10363 {
10364 if (context->getClientVersion() < 3)
10365 {
10366 return gl::error(GL_INVALID_OPERATION);
10367 }
10368 }
10369
10370 UNIMPLEMENTED();
10371 }
10372 catch(std::bad_alloc&)
10373 {
10374 return gl::error(GL_OUT_OF_MEMORY);
10375 }
10376}
10377
10378void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10379{
10380 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10381 sampler, pname, param);
10382
10383 try
10384 {
10385 gl::Context *context = gl::getNonLostContext();
10386
10387 if (context)
10388 {
10389 if (context->getClientVersion() < 3)
10390 {
10391 return gl::error(GL_INVALID_OPERATION);
10392 }
10393 }
10394
10395 UNIMPLEMENTED();
10396 }
10397 catch(std::bad_alloc&)
10398 {
10399 return gl::error(GL_OUT_OF_MEMORY);
10400 }
10401}
10402
10403void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10404{
10405 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10406
10407 try
10408 {
10409 gl::Context *context = gl::getNonLostContext();
10410
10411 if (context)
10412 {
10413 if (context->getClientVersion() < 3)
10414 {
10415 return gl::error(GL_INVALID_OPERATION);
10416 }
10417 }
10418
10419 UNIMPLEMENTED();
10420 }
10421 catch(std::bad_alloc&)
10422 {
10423 return gl::error(GL_OUT_OF_MEMORY);
10424 }
10425}
10426
10427void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10428{
10429 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10430
10431 try
10432 {
10433 gl::Context *context = gl::getNonLostContext();
10434
10435 if (context)
10436 {
10437 if (context->getClientVersion() < 3)
10438 {
10439 return gl::error(GL_INVALID_OPERATION);
10440 }
10441 }
10442
10443 UNIMPLEMENTED();
10444 }
10445 catch(std::bad_alloc&)
10446 {
10447 return gl::error(GL_OUT_OF_MEMORY);
10448 }
10449}
10450
10451void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10452{
10453 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10454
10455 try
10456 {
10457 gl::Context *context = gl::getNonLostContext();
10458
10459 if (context)
10460 {
10461 if (context->getClientVersion() < 3)
10462 {
10463 return gl::error(GL_INVALID_OPERATION);
10464 }
10465 }
10466
10467 UNIMPLEMENTED();
10468 }
10469 catch(std::bad_alloc&)
10470 {
10471 return gl::error(GL_OUT_OF_MEMORY);
10472 }
10473}
10474
10475void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10476{
10477 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10478
10479 try
10480 {
10481 gl::Context *context = gl::getNonLostContext();
10482
10483 if (context)
10484 {
10485 if (context->getClientVersion() < 3)
10486 {
10487 return gl::error(GL_INVALID_OPERATION);
10488 }
10489 }
10490
10491 UNIMPLEMENTED();
10492 }
10493 catch(std::bad_alloc&)
10494 {
10495 return gl::error(GL_OUT_OF_MEMORY);
10496 }
10497}
10498
10499void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10500{
10501 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10502
10503 try
10504 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010505 if (index >= gl::MAX_VERTEX_ATTRIBS)
10506 {
10507 return gl::error(GL_INVALID_VALUE);
10508 }
10509
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010510 gl::Context *context = gl::getNonLostContext();
10511
10512 if (context)
10513 {
10514 if (context->getClientVersion() < 3)
10515 {
10516 return gl::error(GL_INVALID_OPERATION);
10517 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010518
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010519 context->setVertexAttribDivisor(index, divisor);
10520 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010521 }
10522 catch(std::bad_alloc&)
10523 {
10524 return gl::error(GL_OUT_OF_MEMORY);
10525 }
10526}
10527
10528void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10529{
10530 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10531
10532 try
10533 {
10534 gl::Context *context = gl::getNonLostContext();
10535
10536 if (context)
10537 {
10538 if (context->getClientVersion() < 3)
10539 {
10540 return gl::error(GL_INVALID_OPERATION);
10541 }
10542 }
10543
10544 UNIMPLEMENTED();
10545 }
10546 catch(std::bad_alloc&)
10547 {
10548 return gl::error(GL_OUT_OF_MEMORY);
10549 }
10550}
10551
10552void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10553{
10554 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10555
10556 try
10557 {
10558 gl::Context *context = gl::getNonLostContext();
10559
10560 if (context)
10561 {
10562 if (context->getClientVersion() < 3)
10563 {
10564 return gl::error(GL_INVALID_OPERATION);
10565 }
10566 }
10567
10568 UNIMPLEMENTED();
10569 }
10570 catch(std::bad_alloc&)
10571 {
10572 return gl::error(GL_OUT_OF_MEMORY);
10573 }
10574}
10575
10576void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10577{
10578 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10579
10580 try
10581 {
10582 gl::Context *context = gl::getNonLostContext();
10583
10584 if (context)
10585 {
10586 if (context->getClientVersion() < 3)
10587 {
10588 return gl::error(GL_INVALID_OPERATION);
10589 }
10590 }
10591
10592 UNIMPLEMENTED();
10593 }
10594 catch(std::bad_alloc&)
10595 {
10596 return gl::error(GL_OUT_OF_MEMORY);
10597 }
10598}
10599
10600GLboolean __stdcall glIsTransformFeedback(GLuint id)
10601{
10602 EVENT("(GLuint id = %u)", id);
10603
10604 try
10605 {
10606 gl::Context *context = gl::getNonLostContext();
10607
10608 if (context)
10609 {
10610 if (context->getClientVersion() < 3)
10611 {
10612 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10613 }
10614 }
10615
10616 UNIMPLEMENTED();
10617 }
10618 catch(std::bad_alloc&)
10619 {
10620 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10621 }
10622
10623 return GL_FALSE;
10624}
10625
10626void __stdcall glPauseTransformFeedback(void)
10627{
10628 EVENT("(void)");
10629
10630 try
10631 {
10632 gl::Context *context = gl::getNonLostContext();
10633
10634 if (context)
10635 {
10636 if (context->getClientVersion() < 3)
10637 {
10638 return gl::error(GL_INVALID_OPERATION);
10639 }
10640 }
10641
10642 UNIMPLEMENTED();
10643 }
10644 catch(std::bad_alloc&)
10645 {
10646 return gl::error(GL_OUT_OF_MEMORY);
10647 }
10648}
10649
10650void __stdcall glResumeTransformFeedback(void)
10651{
10652 EVENT("(void)");
10653
10654 try
10655 {
10656 gl::Context *context = gl::getNonLostContext();
10657
10658 if (context)
10659 {
10660 if (context->getClientVersion() < 3)
10661 {
10662 return gl::error(GL_INVALID_OPERATION);
10663 }
10664 }
10665
10666 UNIMPLEMENTED();
10667 }
10668 catch(std::bad_alloc&)
10669 {
10670 return gl::error(GL_OUT_OF_MEMORY);
10671 }
10672}
10673
10674void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10675{
10676 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10677 program, bufSize, length, binaryFormat, binary);
10678
10679 try
10680 {
10681 gl::Context *context = gl::getNonLostContext();
10682
10683 if (context)
10684 {
10685 if (context->getClientVersion() < 3)
10686 {
10687 return gl::error(GL_INVALID_OPERATION);
10688 }
10689 }
10690
10691 UNIMPLEMENTED();
10692 }
10693 catch(std::bad_alloc&)
10694 {
10695 return gl::error(GL_OUT_OF_MEMORY);
10696 }
10697}
10698
10699void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10700{
10701 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10702 program, binaryFormat, binary, length);
10703
10704 try
10705 {
10706 gl::Context *context = gl::getNonLostContext();
10707
10708 if (context)
10709 {
10710 if (context->getClientVersion() < 3)
10711 {
10712 return gl::error(GL_INVALID_OPERATION);
10713 }
10714 }
10715
10716 UNIMPLEMENTED();
10717 }
10718 catch(std::bad_alloc&)
10719 {
10720 return gl::error(GL_OUT_OF_MEMORY);
10721 }
10722}
10723
10724void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10725{
10726 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10727 program, pname, value);
10728
10729 try
10730 {
10731 gl::Context *context = gl::getNonLostContext();
10732
10733 if (context)
10734 {
10735 if (context->getClientVersion() < 3)
10736 {
10737 return gl::error(GL_INVALID_OPERATION);
10738 }
10739 }
10740
10741 UNIMPLEMENTED();
10742 }
10743 catch(std::bad_alloc&)
10744 {
10745 return gl::error(GL_OUT_OF_MEMORY);
10746 }
10747}
10748
10749void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10750{
10751 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10752 target, numAttachments, attachments);
10753
10754 try
10755 {
10756 gl::Context *context = gl::getNonLostContext();
10757
10758 if (context)
10759 {
10760 if (context->getClientVersion() < 3)
10761 {
10762 return gl::error(GL_INVALID_OPERATION);
10763 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010764
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010765 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10766 {
10767 return;
10768 }
10769
10770 int maxDimension = context->getMaximumRenderbufferDimension();
10771 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10772 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010773 }
10774 catch(std::bad_alloc&)
10775 {
10776 return gl::error(GL_OUT_OF_MEMORY);
10777 }
10778}
10779
10780void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10781{
10782 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10783 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10784 target, numAttachments, attachments, x, y, width, height);
10785
10786 try
10787 {
10788 gl::Context *context = gl::getNonLostContext();
10789
10790 if (context)
10791 {
10792 if (context->getClientVersion() < 3)
10793 {
10794 return gl::error(GL_INVALID_OPERATION);
10795 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010796
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010797 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10798 {
10799 return;
10800 }
10801
10802 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10803 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010804 }
10805 catch(std::bad_alloc&)
10806 {
10807 return gl::error(GL_OUT_OF_MEMORY);
10808 }
10809}
10810
10811void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10812{
10813 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10814 target, levels, internalformat, width, height);
10815
10816 try
10817 {
10818 gl::Context *context = gl::getNonLostContext();
10819
10820 if (context)
10821 {
10822 if (context->getClientVersion() < 3)
10823 {
10824 return gl::error(GL_INVALID_OPERATION);
10825 }
10826 }
10827
10828 UNIMPLEMENTED();
10829 }
10830 catch(std::bad_alloc&)
10831 {
10832 return gl::error(GL_OUT_OF_MEMORY);
10833 }
10834}
10835
10836void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10837{
10838 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10839 "GLsizei height = %d, GLsizei depth = %d)",
10840 target, levels, internalformat, width, height, depth);
10841
10842 try
10843 {
10844 gl::Context *context = gl::getNonLostContext();
10845
10846 if (context)
10847 {
10848 if (context->getClientVersion() < 3)
10849 {
10850 return gl::error(GL_INVALID_OPERATION);
10851 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010852 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010853 }
10854 catch(std::bad_alloc&)
10855 {
10856 return gl::error(GL_OUT_OF_MEMORY);
10857 }
10858}
10859
10860void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10861{
10862 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10863 "GLint* params = 0x%0.8p)",
10864 target, internalformat, pname, bufSize, params);
10865
10866 try
10867 {
10868 gl::Context *context = gl::getNonLostContext();
10869
10870 if (context)
10871 {
10872 if (context->getClientVersion() < 3)
10873 {
10874 return gl::error(GL_INVALID_OPERATION);
10875 }
10876 }
10877
10878 UNIMPLEMENTED();
10879 }
10880 catch(std::bad_alloc&)
10881 {
10882 return gl::error(GL_OUT_OF_MEMORY);
10883 }
10884}
10885
10886// Extension functions
10887
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010888void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10889 GLbitfield mask, GLenum filter)
10890{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010891 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010892 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10893 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10894 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10895
10896 try
10897 {
10898 switch (filter)
10899 {
10900 case GL_NEAREST:
10901 break;
10902 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010903 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010904 }
10905
10906 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010909 }
10910
10911 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10912 {
10913 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010914 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010915 }
10916
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010917 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010918
10919 if (context)
10920 {
10921 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10922 {
10923 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010924 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010925 }
10926
10927 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10928 }
10929 }
10930 catch(std::bad_alloc&)
10931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010933 }
10934}
10935
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010936void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10937 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010938{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010939 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010940 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010941 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010942 target, level, internalformat, width, height, depth, border, format, type, pixels);
10943
10944 try
10945 {
10946 UNIMPLEMENTED(); // FIXME
10947 }
10948 catch(std::bad_alloc&)
10949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010950 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010951 }
10952}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010953
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010954void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10955 GLenum *binaryFormat, void *binary)
10956{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010957 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 +000010958 program, bufSize, length, binaryFormat, binary);
10959
10960 try
10961 {
10962 gl::Context *context = gl::getNonLostContext();
10963
10964 if (context)
10965 {
10966 gl::Program *programObject = context->getProgram(program);
10967
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010968 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010970 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010971 }
10972
10973 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10974
10975 if (!programBinary)
10976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010977 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010978 }
10979
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010980 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010982 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010983 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010984
10985 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010986 }
10987 }
10988 catch(std::bad_alloc&)
10989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010990 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010991 }
10992}
10993
10994void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10995 const void *binary, GLint length)
10996{
10997 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10998 program, binaryFormat, binary, length);
10999
11000 try
11001 {
11002 gl::Context *context = gl::getNonLostContext();
11003
11004 if (context)
11005 {
11006 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
11007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011008 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011009 }
11010
11011 gl::Program *programObject = context->getProgram(program);
11012
11013 if (!programObject)
11014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011015 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011016 }
11017
daniel@transgaming.com95d29422012-07-24 18:36:10 +000011018 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011019 }
11020 }
11021 catch(std::bad_alloc&)
11022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011023 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011024 }
11025}
11026
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011027void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
11028{
11029 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
11030
11031 try
11032 {
11033 gl::Context *context = gl::getNonLostContext();
11034
11035 if (context)
11036 {
11037 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
11038 {
11039 return gl::error(GL_INVALID_VALUE);
11040 }
11041
11042 if (context->getDrawFramebufferHandle() == 0)
11043 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011044 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011045 {
11046 return gl::error(GL_INVALID_OPERATION);
11047 }
11048
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011049 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011050 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011051 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011052 }
11053 }
11054 else
11055 {
11056 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11057 {
11058 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
11059 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
11060 {
11061 return gl::error(GL_INVALID_OPERATION);
11062 }
11063 }
11064 }
11065
11066 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
11067
11068 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11069 {
11070 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
11071 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011072
11073 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
11074 {
11075 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
11076 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011077 }
11078 }
11079 catch (std::bad_alloc&)
11080 {
11081 return gl::error(GL_OUT_OF_MEMORY);
11082 }
11083}
11084
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011085__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
11086{
11087 struct Extension
11088 {
11089 const char *name;
11090 __eglMustCastToProperFunctionPointerType address;
11091 };
11092
11093 static const Extension glExtensions[] =
11094 {
11095 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011096 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011097 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011098 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11099 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11100 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11101 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11102 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11103 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11104 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011105 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011106 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011107 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11108 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11109 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11110 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011111 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11112 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11113 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11114 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11115 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11116 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11117 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011118 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011119 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11120 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11121 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011122 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11123 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011124
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011125 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011126 {
11127 if (strcmp(procname, glExtensions[ext].name) == 0)
11128 {
11129 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11130 }
11131 }
11132
11133 return NULL;
11134}
11135
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011136// Non-public functions used by EGL
11137
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011138bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011139{
11140 EVENT("(egl::Surface* surface = 0x%0.8p)",
11141 surface);
11142
11143 try
11144 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011145 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011146
11147 if (context)
11148 {
11149 gl::Texture2D *textureObject = context->getTexture2D();
11150
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011151 if (textureObject->isImmutable())
11152 {
11153 return false;
11154 }
11155
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011156 if (textureObject)
11157 {
11158 textureObject->bindTexImage(surface);
11159 }
11160 }
11161 }
11162 catch(std::bad_alloc&)
11163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011164 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011165 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011166
11167 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011168}
11169
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011170}