blob: cc15969bc897a0093ad9b17718bf69bf8a942b2f [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000013#include "common/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024
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 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001109 gl::Context *context = gl::getNonLostContext();
1110
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111 switch (srcRGB)
1112 {
1113 case GL_ZERO:
1114 case GL_ONE:
1115 case GL_SRC_COLOR:
1116 case GL_ONE_MINUS_SRC_COLOR:
1117 case GL_DST_COLOR:
1118 case GL_ONE_MINUS_DST_COLOR:
1119 case GL_SRC_ALPHA:
1120 case GL_ONE_MINUS_SRC_ALPHA:
1121 case GL_DST_ALPHA:
1122 case GL_ONE_MINUS_DST_ALPHA:
1123 case GL_CONSTANT_COLOR:
1124 case GL_ONE_MINUS_CONSTANT_COLOR:
1125 case GL_CONSTANT_ALPHA:
1126 case GL_ONE_MINUS_CONSTANT_ALPHA:
1127 case GL_SRC_ALPHA_SATURATE:
1128 break;
1129 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001130 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001131 }
1132
1133 switch (dstRGB)
1134 {
1135 case GL_ZERO:
1136 case GL_ONE:
1137 case GL_SRC_COLOR:
1138 case GL_ONE_MINUS_SRC_COLOR:
1139 case GL_DST_COLOR:
1140 case GL_ONE_MINUS_DST_COLOR:
1141 case GL_SRC_ALPHA:
1142 case GL_ONE_MINUS_SRC_ALPHA:
1143 case GL_DST_ALPHA:
1144 case GL_ONE_MINUS_DST_ALPHA:
1145 case GL_CONSTANT_COLOR:
1146 case GL_ONE_MINUS_CONSTANT_COLOR:
1147 case GL_CONSTANT_ALPHA:
1148 case GL_ONE_MINUS_CONSTANT_ALPHA:
1149 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001150
1151 case GL_SRC_ALPHA_SATURATE:
1152 if (!context || context->getClientVersion() < 3)
1153 {
1154 return gl::error(GL_INVALID_ENUM);
1155 }
1156 break;
1157
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001159 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160 }
1161
1162 switch (srcAlpha)
1163 {
1164 case GL_ZERO:
1165 case GL_ONE:
1166 case GL_SRC_COLOR:
1167 case GL_ONE_MINUS_SRC_COLOR:
1168 case GL_DST_COLOR:
1169 case GL_ONE_MINUS_DST_COLOR:
1170 case GL_SRC_ALPHA:
1171 case GL_ONE_MINUS_SRC_ALPHA:
1172 case GL_DST_ALPHA:
1173 case GL_ONE_MINUS_DST_ALPHA:
1174 case GL_CONSTANT_COLOR:
1175 case GL_ONE_MINUS_CONSTANT_COLOR:
1176 case GL_CONSTANT_ALPHA:
1177 case GL_ONE_MINUS_CONSTANT_ALPHA:
1178 case GL_SRC_ALPHA_SATURATE:
1179 break;
1180 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001181 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001182 }
1183
1184 switch (dstAlpha)
1185 {
1186 case GL_ZERO:
1187 case GL_ONE:
1188 case GL_SRC_COLOR:
1189 case GL_ONE_MINUS_SRC_COLOR:
1190 case GL_DST_COLOR:
1191 case GL_ONE_MINUS_DST_COLOR:
1192 case GL_SRC_ALPHA:
1193 case GL_ONE_MINUS_SRC_ALPHA:
1194 case GL_DST_ALPHA:
1195 case GL_ONE_MINUS_DST_ALPHA:
1196 case GL_CONSTANT_COLOR:
1197 case GL_ONE_MINUS_CONSTANT_COLOR:
1198 case GL_CONSTANT_ALPHA:
1199 case GL_ONE_MINUS_CONSTANT_ALPHA:
1200 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001201
1202 case GL_SRC_ALPHA_SATURATE:
1203 if (!context || context->getClientVersion() < 3)
1204 {
1205 return gl::error(GL_INVALID_ENUM);
1206 }
1207 break;
1208
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001209 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001211 }
1212
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001213 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1214 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1215
1216 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1217 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1218
1219 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001220 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001221 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 +00001222 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001223 }
1224
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001225 if (context)
1226 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001227 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001228 }
1229 }
1230 catch(std::bad_alloc&)
1231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001232 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 }
1234}
1235
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001236void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001237{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001238 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 +00001239 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001240
1241 try
1242 {
1243 if (size < 0)
1244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001245 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001246 }
1247
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001248 gl::Context *context = gl::getNonLostContext();
1249
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250 switch (usage)
1251 {
1252 case GL_STREAM_DRAW:
1253 case GL_STATIC_DRAW:
1254 case GL_DYNAMIC_DRAW:
1255 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001256
1257 case GL_STREAM_READ:
1258 case GL_STREAM_COPY:
1259 case GL_STATIC_READ:
1260 case GL_STATIC_COPY:
1261 case GL_DYNAMIC_READ:
1262 case GL_DYNAMIC_COPY:
1263 if (context && context->getClientVersion() < 3)
1264 {
1265 return gl::error(GL_INVALID_ENUM);
1266 }
1267 break;
1268
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001270 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001271 }
1272
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001273 if (context)
1274 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001275 // Check ES3 specific targets
1276 switch (target)
1277 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001278 case GL_COPY_READ_BUFFER:
1279 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001280 case GL_PIXEL_PACK_BUFFER:
1281 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001282 case GL_UNIFORM_BUFFER:
1283 case GL_TRANSFORM_FEEDBACK_BUFFER:
1284 if (context->getClientVersion() < 3)
1285 {
1286 return gl::error(GL_INVALID_ENUM);
1287 }
1288 }
1289
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001290 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001291
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001292 switch (target)
1293 {
1294 case GL_ARRAY_BUFFER:
1295 buffer = context->getArrayBuffer();
1296 break;
1297 case GL_ELEMENT_ARRAY_BUFFER:
1298 buffer = context->getElementArrayBuffer();
1299 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001300 case GL_COPY_READ_BUFFER:
1301 buffer = context->getCopyReadBuffer();
1302 break;
1303 case GL_COPY_WRITE_BUFFER:
1304 buffer = context->getCopyWriteBuffer();
1305 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001306 case GL_PIXEL_PACK_BUFFER:
1307 buffer = context->getPixelPackBuffer();
1308 break;
1309 case GL_PIXEL_UNPACK_BUFFER:
1310 buffer = context->getPixelUnpackBuffer();
1311 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001312 case GL_TRANSFORM_FEEDBACK_BUFFER:
1313 buffer = context->getGenericTransformFeedbackBuffer();
1314 break;
1315 case GL_UNIFORM_BUFFER:
1316 buffer = context->getGenericUniformBuffer();
1317 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001318 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001319 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001320 }
1321
1322 if (!buffer)
1323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001325 }
1326
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001327 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001328 }
1329 }
1330 catch(std::bad_alloc&)
1331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001332 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001333 }
1334}
1335
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001336void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001337{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001338 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 +00001339 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001340
1341 try
1342 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001343 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001345 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346 }
1347
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001348 if (data == NULL)
1349 {
1350 return;
1351 }
1352
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001353 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001354
1355 if (context)
1356 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001357 // Check ES3 specific targets
1358 switch (target)
1359 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001360 case GL_COPY_READ_BUFFER:
1361 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001362 case GL_PIXEL_PACK_BUFFER:
1363 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001364 case GL_UNIFORM_BUFFER:
1365 case GL_TRANSFORM_FEEDBACK_BUFFER:
1366 if (context->getClientVersion() < 3)
1367 {
1368 return gl::error(GL_INVALID_ENUM);
1369 }
1370 }
1371
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001372 gl::Buffer *buffer;
1373
1374 switch (target)
1375 {
1376 case GL_ARRAY_BUFFER:
1377 buffer = context->getArrayBuffer();
1378 break;
1379 case GL_ELEMENT_ARRAY_BUFFER:
1380 buffer = context->getElementArrayBuffer();
1381 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001382 case GL_COPY_READ_BUFFER:
1383 buffer = context->getCopyReadBuffer();
1384 break;
1385 case GL_COPY_WRITE_BUFFER:
1386 buffer = context->getCopyWriteBuffer();
1387 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001388 case GL_PIXEL_PACK_BUFFER:
1389 buffer = context->getPixelPackBuffer();
1390 break;
1391 case GL_PIXEL_UNPACK_BUFFER:
1392 buffer = context->getPixelUnpackBuffer();
1393 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001394 case GL_TRANSFORM_FEEDBACK_BUFFER:
1395 buffer = context->getGenericTransformFeedbackBuffer();
1396 break;
1397 case GL_UNIFORM_BUFFER:
1398 buffer = context->getGenericUniformBuffer();
1399 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001400 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001401 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001402 }
1403
1404 if (!buffer)
1405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001406 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001407 }
1408
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001409 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001412 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001413
1414 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001416 }
1417 catch(std::bad_alloc&)
1418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420 }
1421}
1422
1423GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1424{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001425 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001426
1427 try
1428 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001429 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001431 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001432 }
1433
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001435
1436 if (context)
1437 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001438 gl::Framebuffer *framebuffer = NULL;
1439 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1440 {
1441 framebuffer = context->getReadFramebuffer();
1442 }
1443 else
1444 {
1445 framebuffer = context->getDrawFramebuffer();
1446 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001447
1448 return framebuffer->completeness();
1449 }
1450 }
1451 catch(std::bad_alloc&)
1452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001453 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001454 }
1455
1456 return 0;
1457}
1458
1459void __stdcall glClear(GLbitfield mask)
1460{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001461 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001462
1463 try
1464 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001465 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466
1467 if (context)
1468 {
1469 context->clear(mask);
1470 }
1471 }
1472 catch(std::bad_alloc&)
1473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475 }
1476}
1477
1478void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001480 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001481 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482
1483 try
1484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001486
1487 if (context)
1488 {
1489 context->setClearColor(red, green, blue, alpha);
1490 }
1491 }
1492 catch(std::bad_alloc&)
1493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001494 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001495 }
1496}
1497
1498void __stdcall glClearDepthf(GLclampf depth)
1499{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001500 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001501
1502 try
1503 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001504 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001505
1506 if (context)
1507 {
1508 context->setClearDepth(depth);
1509 }
1510 }
1511 catch(std::bad_alloc&)
1512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001514 }
1515}
1516
1517void __stdcall glClearStencil(GLint s)
1518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001519 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001520
1521 try
1522 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001523 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001524
1525 if (context)
1526 {
1527 context->setClearStencil(s);
1528 }
1529 }
1530 catch(std::bad_alloc&)
1531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001532 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001533 }
1534}
1535
1536void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1537{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001538 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001539 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001540
1541 try
1542 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001543 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001544
1545 if (context)
1546 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001547 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001548 }
1549 }
1550 catch(std::bad_alloc&)
1551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001552 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553 }
1554}
1555
1556void __stdcall glCompileShader(GLuint shader)
1557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001558 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001559
1560 try
1561 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001563
1564 if (context)
1565 {
1566 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 if (!shaderObject)
1569 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001570 if (context->getProgram(shader))
1571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001572 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001573 }
1574 else
1575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001576 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001578 }
1579
1580 shaderObject->compile();
1581 }
1582 }
1583 catch(std::bad_alloc&)
1584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586 }
1587}
1588
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001589void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1590 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001592 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001593 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001594 target, level, internalformat, width, height, border, imageSize, data);
1595
1596 try
1597 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001598 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001601 }
1602
daniel@transgaming.com01868132010-08-24 19:21:17 +00001603 switch (internalformat)
1604 {
1605 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1606 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001607 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1608 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001609 break;
1610 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001611 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001612 }
1613
1614 if (border != 0)
1615 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001616 return gl::error(GL_INVALID_OPERATION);
1617 }
1618
1619 if (width != 1 && width != 2 && width % 4 != 0)
1620 {
1621 return gl::error(GL_INVALID_OPERATION);
1622 }
1623
1624 if (height != 1 && height != 2 && height % 4 != 0)
1625 {
1626 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001627 }
1628
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001630
1631 if (context)
1632 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001633 if (level > context->getMaximumTextureLevel())
1634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001635 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001636 }
1637
1638 switch (target)
1639 {
1640 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001641 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1642 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001645 }
1646 break;
1647 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1648 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1649 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1650 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1651 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1652 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1653 if (width != height)
1654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001655 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001656 }
1657
1658 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1659 height > (context->getMaximumCubeTextureDimension() >> level))
1660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001662 }
1663 break;
1664 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001665 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001666 }
1667
gman@chromium.org50c526d2011-08-10 05:19:44 +00001668 switch (internalformat) {
1669 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1670 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1671 if (!context->supportsDXT1Textures())
1672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001673 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 +00001674 }
1675 break;
1676 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1677 if (!context->supportsDXT3Textures())
1678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001679 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 +00001680 }
1681 break;
1682 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1683 if (!context->supportsDXT5Textures())
1684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001686 }
1687 break;
1688 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001689 }
1690
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001691 if (imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001693 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001694 }
1695
1696 if (target == GL_TEXTURE_2D)
1697 {
1698 gl::Texture2D *texture = context->getTexture2D();
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 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1711 }
1712 else
1713 {
1714 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1715
1716 if (!texture)
1717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001718 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001719 }
1720
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001721 if (texture->isImmutable())
1722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001723 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001724 }
1725
daniel@transgaming.com01868132010-08-24 19:21:17 +00001726 switch (target)
1727 {
1728 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1729 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1730 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1731 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1732 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1733 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1734 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1735 break;
1736 default: UNREACHABLE();
1737 }
1738 }
1739 }
1740
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001741 }
1742 catch(std::bad_alloc&)
1743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001744 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001745 }
1746}
1747
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001748void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1749 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001751 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001752 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001753 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001754 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1755
1756 try
1757 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001758 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001759 {
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
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001763 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001765 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001766 }
1767
daniel@transgaming.com01868132010-08-24 19:21:17 +00001768 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001769 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001770 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1771 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001772 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1773 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001774 break;
1775 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001776 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001777 }
1778
daniel@transgaming.com01868132010-08-24 19:21:17 +00001779 if (width == 0 || height == 0 || data == NULL)
1780 {
1781 return;
1782 }
1783
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001784 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001785
1786 if (context)
1787 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001788 if (level > context->getMaximumTextureLevel())
1789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001790 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001791 }
1792
gman@chromium.org50c526d2011-08-10 05:19:44 +00001793 switch (format) {
1794 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1795 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1796 if (!context->supportsDXT1Textures())
1797 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001798 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 +00001799 }
1800 break;
1801 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1802 if (!context->supportsDXT3Textures())
1803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001804 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 +00001805 }
1806 break;
1807 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1808 if (!context->supportsDXT5Textures())
1809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001810 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 +00001811 }
1812 break;
1813 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001814 }
1815
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001816 if (imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001819 }
1820
1821 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001823 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 +00001824 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001825 }
1826
1827 if (target == GL_TEXTURE_2D)
1828 {
1829 gl::Texture2D *texture = context->getTexture2D();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001830 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001831 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001832 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001833 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001834 }
1835 else if (gl::IsCubemapTextureTarget(target))
1836 {
1837 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001838 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001839 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001840 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001841 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001842 }
1843 else
1844 {
1845 UNREACHABLE();
1846 }
1847 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001848 }
1849 catch(std::bad_alloc&)
1850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001852 }
1853}
1854
1855void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1856{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001857 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001858 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001859 target, level, internalformat, x, y, width, height, border);
1860
1861 try
1862 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001863 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001866 }
1867
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001868 if (border != 0)
1869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001870 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001871 }
1872
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001873 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001874
1875 if (context)
1876 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001877 if (level > context->getMaximumTextureLevel())
1878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001879 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001880 }
1881
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001882 switch (target)
1883 {
1884 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001885 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1886 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001889 }
1890 break;
1891 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1892 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1893 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1894 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1895 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1896 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1897 if (width != height)
1898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001900 }
1901
1902 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1903 height > (context->getMaximumCubeTextureDimension() >> level))
1904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001905 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001906 }
1907 break;
1908 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001909 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001910 }
1911
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001912 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001913
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001914 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001916 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001917 }
1918
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001919 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001921 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001922 }
1923
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001924 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001925 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001926
1927 // [OpenGL ES 2.0.24] table 3.9
1928 switch (internalformat)
1929 {
1930 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001931 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001932 colorbufferFormat != GL_RGBA4 &&
1933 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001934 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001935 colorbufferFormat != GL_RGBA8_OES)
1936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001937 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001938 }
1939 break;
1940 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001941 case GL_RGB:
1942 if (colorbufferFormat != GL_RGB565 &&
1943 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001944 colorbufferFormat != GL_RGBA4 &&
1945 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001946 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001947 colorbufferFormat != GL_RGBA8_OES)
1948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001949 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001950 }
1951 break;
1952 case GL_LUMINANCE_ALPHA:
1953 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001954 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001955 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001956 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001957 colorbufferFormat != GL_RGBA8_OES)
1958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001959 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001960 }
1961 break;
1962 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1963 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001964 if (context->supportsDXT1Textures())
1965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001966 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001967 }
1968 else
1969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001970 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001971 }
1972 break;
1973 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1974 if (context->supportsDXT3Textures())
1975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001976 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001977 }
1978 else
1979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001980 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001981 }
1982 break;
1983 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1984 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001986 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001987 }
1988 else
1989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001990 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001991 }
1992 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001993 case GL_DEPTH_COMPONENT:
1994 case GL_DEPTH_COMPONENT16:
1995 case GL_DEPTH_COMPONENT32_OES:
1996 case GL_DEPTH_STENCIL_OES:
1997 case GL_DEPTH24_STENCIL8_OES:
1998 if (context->supportsDepthTextures())
1999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002000 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002001 }
2002 else
2003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002005 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002006 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002007 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002008 }
2009
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002010 if (target == GL_TEXTURE_2D)
2011 {
2012 gl::Texture2D *texture = context->getTexture2D();
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 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00002018
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(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002025 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002026 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002027 {
2028 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2029
2030 if (!texture)
2031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002032 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002033 }
2034
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002035 if (texture->isImmutable())
2036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002038 }
2039
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00002040 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002041 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002042 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002043 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002044 }
2045 catch(std::bad_alloc&)
2046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002047 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002048 }
2049}
2050
2051void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
2052{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002053 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002054 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002055 target, level, xoffset, yoffset, x, y, width, height);
2056
2057 try
2058 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00002059 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002061 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002062 }
2063
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002064 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002067 }
2068
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002069 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
2070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002072 }
2073
2074 if (width == 0 || height == 0)
2075 {
2076 return;
2077 }
2078
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002079 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002080
2081 if (context)
2082 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002083 if (level > context->getMaximumTextureLevel())
2084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002086 }
2087
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002088 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002089
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002090 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
2091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002092 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002093 }
2094
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002095 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002097 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002098 }
2099
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002100 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00002101 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002102 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002103 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002104
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002105 if (target == GL_TEXTURE_2D)
2106 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002107 gl::Texture2D *tex2d = context->getTexture2D();
2108
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002109 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002110 {
2111 return; // error already registered by validateSubImageParams
2112 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002113 textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002114 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002115 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002116 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002117 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002118 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2119
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002120 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002121 {
2122 return; // error already registered by validateSubImageParams
2123 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002124 textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002125 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002126 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002127 else UNREACHABLE();
2128
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002129 // [OpenGL ES 2.0.24] table 3.9
2130 switch (textureFormat)
2131 {
2132 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002133 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002134 colorbufferFormat != GL_RGBA4 &&
2135 colorbufferFormat != GL_RGB5_A1 &&
2136 colorbufferFormat != GL_RGBA8_OES)
2137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002138 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002139 }
2140 break;
2141 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002142 case GL_RGB:
2143 if (colorbufferFormat != GL_RGB565 &&
2144 colorbufferFormat != GL_RGB8_OES &&
2145 colorbufferFormat != GL_RGBA4 &&
2146 colorbufferFormat != GL_RGB5_A1 &&
2147 colorbufferFormat != GL_RGBA8_OES)
2148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002150 }
2151 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002152 case GL_LUMINANCE_ALPHA:
2153 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002154 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002155 colorbufferFormat != GL_RGB5_A1 &&
2156 colorbufferFormat != GL_RGBA8_OES)
2157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002158 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002159 }
2160 break;
2161 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2162 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002163 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2164 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002165 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002166 case GL_DEPTH_COMPONENT:
2167 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002168 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002169 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002171 }
2172
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002173 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002174 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002176
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177 catch(std::bad_alloc&)
2178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002179 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002180 }
2181}
2182
2183GLuint __stdcall glCreateProgram(void)
2184{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002185 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002186
2187 try
2188 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002190
2191 if (context)
2192 {
2193 return context->createProgram();
2194 }
2195 }
2196 catch(std::bad_alloc&)
2197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002198 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002199 }
2200
2201 return 0;
2202}
2203
2204GLuint __stdcall glCreateShader(GLenum type)
2205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002206 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002207
2208 try
2209 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002210 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002211
2212 if (context)
2213 {
2214 switch (type)
2215 {
2216 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002217 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218 return context->createShader(type);
2219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002220 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002221 }
2222 }
2223 }
2224 catch(std::bad_alloc&)
2225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002226 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227 }
2228
2229 return 0;
2230}
2231
2232void __stdcall glCullFace(GLenum mode)
2233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002234 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002235
2236 try
2237 {
2238 switch (mode)
2239 {
2240 case GL_FRONT:
2241 case GL_BACK:
2242 case GL_FRONT_AND_BACK:
2243 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002244 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002245
2246 if (context)
2247 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002248 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250 }
2251 break;
2252 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254 }
2255 }
2256 catch(std::bad_alloc&)
2257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 }
2260}
2261
2262void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002264 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265
2266 try
2267 {
2268 if (n < 0)
2269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271 }
2272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
2275 if (context)
2276 {
2277 for (int i = 0; i < n; i++)
2278 {
2279 context->deleteBuffer(buffers[i]);
2280 }
2281 }
2282 }
2283 catch(std::bad_alloc&)
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002286 }
2287}
2288
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002289void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002291 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002292
2293 try
2294 {
2295 if (n < 0)
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002298 }
2299
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002300 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002301
2302 if (context)
2303 {
2304 for (int i = 0; i < n; i++)
2305 {
2306 context->deleteFence(fences[i]);
2307 }
2308 }
2309 }
2310 catch(std::bad_alloc&)
2311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002312 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002313 }
2314}
2315
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002316void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002318 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002319
2320 try
2321 {
2322 if (n < 0)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325 }
2326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328
2329 if (context)
2330 {
2331 for (int i = 0; i < n; i++)
2332 {
2333 if (framebuffers[i] != 0)
2334 {
2335 context->deleteFramebuffer(framebuffers[i]);
2336 }
2337 }
2338 }
2339 }
2340 catch(std::bad_alloc&)
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343 }
2344}
2345
2346void __stdcall glDeleteProgram(GLuint program)
2347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002348 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002349
2350 try
2351 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002352 if (program == 0)
2353 {
2354 return;
2355 }
2356
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002358
2359 if (context)
2360 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002361 if (!context->getProgram(program))
2362 {
2363 if(context->getShader(program))
2364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002365 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002366 }
2367 else
2368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002370 }
2371 }
2372
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 context->deleteProgram(program);
2374 }
2375 }
2376 catch(std::bad_alloc&)
2377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002378 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379 }
2380}
2381
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002382void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2383{
2384 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2385
2386 try
2387 {
2388 if (n < 0)
2389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002391 }
2392
2393 gl::Context *context = gl::getNonLostContext();
2394
2395 if (context)
2396 {
2397 for (int i = 0; i < n; i++)
2398 {
2399 context->deleteQuery(ids[i]);
2400 }
2401 }
2402 }
2403 catch(std::bad_alloc&)
2404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002406 }
2407}
2408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002409void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2410{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002411 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002412
2413 try
2414 {
2415 if (n < 0)
2416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002417 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002418 }
2419
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421
2422 if (context)
2423 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002424 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002425 {
2426 context->deleteRenderbuffer(renderbuffers[i]);
2427 }
2428 }
2429 }
2430 catch(std::bad_alloc&)
2431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002432 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433 }
2434}
2435
2436void __stdcall glDeleteShader(GLuint shader)
2437{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002438 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439
2440 try
2441 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002442 if (shader == 0)
2443 {
2444 return;
2445 }
2446
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002448
2449 if (context)
2450 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002451 if (!context->getShader(shader))
2452 {
2453 if(context->getProgram(shader))
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002456 }
2457 else
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002460 }
2461 }
2462
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002463 context->deleteShader(shader);
2464 }
2465 }
2466 catch(std::bad_alloc&)
2467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469 }
2470}
2471
2472void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002474 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475
2476 try
2477 {
2478 if (n < 0)
2479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002480 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481 }
2482
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002484
2485 if (context)
2486 {
2487 for (int i = 0; i < n; i++)
2488 {
2489 if (textures[i] != 0)
2490 {
2491 context->deleteTexture(textures[i]);
2492 }
2493 }
2494 }
2495 }
2496 catch(std::bad_alloc&)
2497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002498 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002499 }
2500}
2501
2502void __stdcall glDepthFunc(GLenum func)
2503{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002504 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505
2506 try
2507 {
2508 switch (func)
2509 {
2510 case GL_NEVER:
2511 case GL_ALWAYS:
2512 case GL_LESS:
2513 case GL_LEQUAL:
2514 case GL_EQUAL:
2515 case GL_GREATER:
2516 case GL_GEQUAL:
2517 case GL_NOTEQUAL:
2518 break;
2519 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002520 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521 }
2522
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002523 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002524
2525 if (context)
2526 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002527 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002528 }
2529 }
2530 catch(std::bad_alloc&)
2531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002532 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 }
2534}
2535
2536void __stdcall glDepthMask(GLboolean flag)
2537{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002538 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002539
2540 try
2541 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002543
2544 if (context)
2545 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002546 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002547 }
2548 }
2549 catch(std::bad_alloc&)
2550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002552 }
2553}
2554
2555void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002557 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558
2559 try
2560 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002561 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002562
2563 if (context)
2564 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002565 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 }
2567 }
2568 catch(std::bad_alloc&)
2569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 }
2572}
2573
2574void __stdcall glDetachShader(GLuint program, GLuint shader)
2575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002576 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577
2578 try
2579 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002580 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581
2582 if (context)
2583 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002584
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002585 gl::Program *programObject = context->getProgram(program);
2586 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002587
2588 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002589 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002590 gl::Shader *shaderByProgramHandle;
2591 shaderByProgramHandle = context->getShader(program);
2592 if (!shaderByProgramHandle)
2593 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002594 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002595 }
2596 else
2597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002598 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002599 }
2600 }
2601
2602 if (!shaderObject)
2603 {
2604 gl::Program *programByShaderHandle = context->getProgram(shader);
2605 if (!programByShaderHandle)
2606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002608 }
2609 else
2610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002611 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002612 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002613 }
2614
2615 if (!programObject->detachShader(shaderObject))
2616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002617 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002618 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002619 }
2620 }
2621 catch(std::bad_alloc&)
2622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002623 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002624 }
2625}
2626
2627void __stdcall glDisable(GLenum cap)
2628{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002629 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002630
2631 try
2632 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002633 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634
2635 if (context)
2636 {
2637 switch (cap)
2638 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002639 case GL_CULL_FACE: context->setCullFace(false); break;
2640 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2641 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2642 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2643 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2644 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2645 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2646 case GL_BLEND: context->setBlend(false); break;
2647 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002650 }
2651 }
2652 }
2653 catch(std::bad_alloc&)
2654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002656 }
2657}
2658
2659void __stdcall glDisableVertexAttribArray(GLuint index)
2660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002661 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002662
2663 try
2664 {
2665 if (index >= gl::MAX_VERTEX_ATTRIBS)
2666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002667 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002668 }
2669
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002670 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002671
2672 if (context)
2673 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002674 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002675 }
2676 }
2677 catch(std::bad_alloc&)
2678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680 }
2681}
2682
2683void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002685 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002686
2687 try
2688 {
2689 if (count < 0 || first < 0)
2690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002691 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002692 }
2693
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002694 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002695
2696 if (context)
2697 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002698 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002699 }
2700 }
2701 catch(std::bad_alloc&)
2702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002703 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002704 }
2705}
2706
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002707void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2708{
2709 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2710
2711 try
2712 {
2713 if (count < 0 || first < 0 || primcount < 0)
2714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002716 }
2717
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002718 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002719 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002720 gl::Context *context = gl::getNonLostContext();
2721
2722 if (context)
2723 {
2724 context->drawArrays(mode, first, count, primcount);
2725 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002726 }
2727 }
2728 catch(std::bad_alloc&)
2729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002731 }
2732}
2733
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002734void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002735{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002736 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 +00002737 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002738
2739 try
2740 {
2741 if (count < 0)
2742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002743 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002744 }
2745
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002747
2748 if (context)
2749 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002750 switch (type)
2751 {
2752 case GL_UNSIGNED_BYTE:
2753 case GL_UNSIGNED_SHORT:
2754 break;
2755 case GL_UNSIGNED_INT:
2756 if (!context->supports32bitIndices())
2757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002758 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002759 }
2760 break;
2761 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002763 }
2764
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002765 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002766 }
2767 }
2768 catch(std::bad_alloc&)
2769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002770 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002771 }
2772}
2773
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002774void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2775{
2776 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2777 mode, count, type, indices, primcount);
2778
2779 try
2780 {
2781 if (count < 0 || primcount < 0)
2782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002784 }
2785
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002786 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002787 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002788 gl::Context *context = gl::getNonLostContext();
2789
2790 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002791 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002792 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002793 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002794 case GL_UNSIGNED_BYTE:
2795 case GL_UNSIGNED_SHORT:
2796 break;
2797 case GL_UNSIGNED_INT:
2798 if (!context->supports32bitIndices())
2799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002800 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002801 }
2802 break;
2803 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002804 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002805 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002806
2807 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002808 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002809 }
2810 }
2811 catch(std::bad_alloc&)
2812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002814 }
2815}
2816
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002817void __stdcall glEnable(GLenum cap)
2818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002819 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002820
2821 try
2822 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002823 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824
2825 if (context)
2826 {
2827 switch (cap)
2828 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002829 case GL_CULL_FACE: context->setCullFace(true); break;
2830 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2831 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2832 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2833 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2834 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2835 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2836 case GL_BLEND: context->setBlend(true); break;
2837 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002838 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002840 }
2841 }
2842 }
2843 catch(std::bad_alloc&)
2844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846 }
2847}
2848
2849void __stdcall glEnableVertexAttribArray(GLuint index)
2850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002851 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002852
2853 try
2854 {
2855 if (index >= gl::MAX_VERTEX_ATTRIBS)
2856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002857 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002858 }
2859
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861
2862 if (context)
2863 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002864 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002865 }
2866 }
2867 catch(std::bad_alloc&)
2868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870 }
2871}
2872
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002873void __stdcall glEndQueryEXT(GLenum target)
2874{
2875 EVENT("GLenum target = 0x%X)", target);
2876
2877 try
2878 {
2879 switch (target)
2880 {
2881 case GL_ANY_SAMPLES_PASSED_EXT:
2882 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2883 break;
2884 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002885 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002886 }
2887
2888 gl::Context *context = gl::getNonLostContext();
2889
2890 if (context)
2891 {
2892 context->endQuery(target);
2893 }
2894 }
2895 catch(std::bad_alloc&)
2896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002897 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002898 }
2899}
2900
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002901void __stdcall glFinishFenceNV(GLuint fence)
2902{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002903 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002904
2905 try
2906 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002907 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002908
2909 if (context)
2910 {
2911 gl::Fence* fenceObject = context->getFence(fence);
2912
2913 if (fenceObject == NULL)
2914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002915 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002916 }
2917
2918 fenceObject->finishFence();
2919 }
2920 }
2921 catch(std::bad_alloc&)
2922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002923 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002924 }
2925}
2926
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002927void __stdcall glFinish(void)
2928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002929 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002930
2931 try
2932 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934
2935 if (context)
2936 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002937 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002938 }
2939 }
2940 catch(std::bad_alloc&)
2941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002943 }
2944}
2945
2946void __stdcall glFlush(void)
2947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002948 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002949
2950 try
2951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953
2954 if (context)
2955 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002956 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957 }
2958 }
2959 catch(std::bad_alloc&)
2960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 }
2963}
2964
2965void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002967 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002968 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969
2970 try
2971 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002972 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002973 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002975 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976 }
2977
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002978 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979
2980 if (context)
2981 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002982 gl::Framebuffer *framebuffer = NULL;
2983 GLuint framebufferHandle = 0;
2984 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2985 {
2986 framebuffer = context->getReadFramebuffer();
2987 framebufferHandle = context->getReadFramebufferHandle();
2988 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002989 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002990 {
2991 framebuffer = context->getDrawFramebuffer();
2992 framebufferHandle = context->getDrawFramebufferHandle();
2993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002995 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002997 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002998 }
2999
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003000 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003001 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003002 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3003
3004 if (colorAttachment >= context->getMaximumRenderTargets())
3005 {
3006 return gl::error(GL_INVALID_VALUE);
3007 }
3008
3009 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
3010 }
3011 else
3012 {
3013 switch (attachment)
3014 {
3015 case GL_DEPTH_ATTACHMENT:
3016 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
3017 break;
3018 case GL_STENCIL_ATTACHMENT:
3019 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
3020 break;
3021 default:
3022 return gl::error(GL_INVALID_ENUM);
3023 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003024 }
3025 }
3026 }
3027 catch(std::bad_alloc&)
3028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003029 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003030 }
3031}
3032
3033void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
3034{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003035 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003036 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037
3038 try
3039 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003040 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003042 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003043 }
3044
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003045 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003046
3047 if (context)
3048 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003049 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
3050 {
3051 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3052
3053 if (colorAttachment >= context->getMaximumRenderTargets())
3054 {
3055 return gl::error(GL_INVALID_VALUE);
3056 }
3057 }
3058 else
3059 {
3060 switch (attachment)
3061 {
3062 case GL_DEPTH_ATTACHMENT:
3063 case GL_STENCIL_ATTACHMENT:
3064 break;
3065 default:
3066 return gl::error(GL_INVALID_ENUM);
3067 }
3068 }
3069
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003070 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003071 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003072 textarget = GL_NONE;
3073 }
3074 else
3075 {
3076 gl::Texture *tex = context->getTexture(texture);
3077
3078 if (tex == NULL)
3079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003081 }
3082
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003083 switch (textarget)
3084 {
3085 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003087 if (tex->getTarget() != GL_TEXTURE_2D)
3088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003089 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003090 }
3091 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003092 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003094 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003095 }
3096 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003097 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003098
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003100 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003103 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003105 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003106 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003108 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003109 }
3110 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003111 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003113 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003114 }
3115 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003116 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003117
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003119 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003120 }
3121
3122 if (level != 0)
3123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003124 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126 }
3127
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003128 gl::Framebuffer *framebuffer = NULL;
3129 GLuint framebufferHandle = 0;
3130 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3131 {
3132 framebuffer = context->getReadFramebuffer();
3133 framebufferHandle = context->getReadFramebufferHandle();
3134 }
3135 else
3136 {
3137 framebuffer = context->getDrawFramebuffer();
3138 framebufferHandle = context->getDrawFramebufferHandle();
3139 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003141 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003144 }
3145
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003146 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003147 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003148 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3149
3150 if (colorAttachment >= context->getMaximumRenderTargets())
3151 {
3152 return gl::error(GL_INVALID_VALUE);
3153 }
3154
3155 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3156 }
3157 else
3158 {
3159 switch (attachment)
3160 {
3161 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3162 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3163 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003164 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003165 }
3166 }
3167 catch(std::bad_alloc&)
3168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003169 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003170 }
3171}
3172
3173void __stdcall glFrontFace(GLenum mode)
3174{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003175 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003176
3177 try
3178 {
3179 switch (mode)
3180 {
3181 case GL_CW:
3182 case GL_CCW:
3183 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003185
3186 if (context)
3187 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003188 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003189 }
3190 }
3191 break;
3192 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194 }
3195 }
3196 catch(std::bad_alloc&)
3197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003198 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003199 }
3200}
3201
3202void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3203{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003204 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205
3206 try
3207 {
3208 if (n < 0)
3209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003210 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003211 }
3212
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003213 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003214
3215 if (context)
3216 {
3217 for (int i = 0; i < n; i++)
3218 {
3219 buffers[i] = context->createBuffer();
3220 }
3221 }
3222 }
3223 catch(std::bad_alloc&)
3224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003226 }
3227}
3228
3229void __stdcall glGenerateMipmap(GLenum target)
3230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003231 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232
3233 try
3234 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003235 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003236
3237 if (context)
3238 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003239 switch (target)
3240 {
3241 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003242 {
3243 gl::Texture2D *tex2d = context->getTexture2D();
3244
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003245 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003247 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003248 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003249 if (tex2d->isDepth(0))
3250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003251 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003252 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003253
3254 tex2d->generateMipmaps();
3255 break;
3256 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003257
3258 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003259 {
3260 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3261
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003262 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003265 }
3266
3267 texcube->generateMipmaps();
3268 break;
3269 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003270
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003271 case GL_TEXTURE_3D:
3272 {
3273 if (context->getClientVersion() < 3)
3274 {
3275 return gl::error(GL_INVALID_ENUM);
3276 }
3277
3278 gl::Texture3D *tex3D = context->getTexture3D();
3279 if (tex3D->isCompressed(0))
3280 {
3281 return gl::error(GL_INVALID_OPERATION);
3282 }
3283
3284 tex3D->generateMipmaps();
3285 break;
3286 }
3287
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003288 case GL_TEXTURE_2D_ARRAY:
3289 {
3290 if (context->getClientVersion() < 3)
3291 {
3292 return gl::error(GL_INVALID_ENUM);
3293 }
3294
3295 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3296 if (tex2darr->isCompressed(0))
3297 {
3298 return gl::error(GL_INVALID_OPERATION);
3299 }
3300
3301 tex2darr->generateMipmaps();
3302 break;
3303 }
3304
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003305 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003306 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003307 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003308 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309 }
3310 catch(std::bad_alloc&)
3311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003312 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313 }
3314}
3315
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003316void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3317{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003318 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003319
3320 try
3321 {
3322 if (n < 0)
3323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003324 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003325 }
3326
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003327 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003328
3329 if (context)
3330 {
3331 for (int i = 0; i < n; i++)
3332 {
3333 fences[i] = context->createFence();
3334 }
3335 }
3336 }
3337 catch(std::bad_alloc&)
3338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003339 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003340 }
3341}
3342
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003345 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003346
3347 try
3348 {
3349 if (n < 0)
3350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352 }
3353
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003354 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355
3356 if (context)
3357 {
3358 for (int i = 0; i < n; i++)
3359 {
3360 framebuffers[i] = context->createFramebuffer();
3361 }
3362 }
3363 }
3364 catch(std::bad_alloc&)
3365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367 }
3368}
3369
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003370void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3371{
3372 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3373
3374 try
3375 {
3376 if (n < 0)
3377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003379 }
3380
3381 gl::Context *context = gl::getNonLostContext();
3382
3383 if (context)
3384 {
3385 for (int i = 0; i < n; i++)
3386 {
3387 ids[i] = context->createQuery();
3388 }
3389 }
3390 }
3391 catch(std::bad_alloc&)
3392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003393 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003394 }
3395}
3396
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3398{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003399 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400
3401 try
3402 {
3403 if (n < 0)
3404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003405 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 }
3407
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003408 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409
3410 if (context)
3411 {
3412 for (int i = 0; i < n; i++)
3413 {
3414 renderbuffers[i] = context->createRenderbuffer();
3415 }
3416 }
3417 }
3418 catch(std::bad_alloc&)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421 }
3422}
3423
3424void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003426 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427
3428 try
3429 {
3430 if (n < 0)
3431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003432 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003433 }
3434
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436
3437 if (context)
3438 {
3439 for (int i = 0; i < n; i++)
3440 {
3441 textures[i] = context->createTexture();
3442 }
3443 }
3444 }
3445 catch(std::bad_alloc&)
3446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448 }
3449}
3450
daniel@transgaming.com85423182010-04-22 13:35:27 +00003451void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003453 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003454 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455 program, index, bufsize, length, size, type, name);
3456
3457 try
3458 {
3459 if (bufsize < 0)
3460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003461 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462 }
3463
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003464 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003465
3466 if (context)
3467 {
3468 gl::Program *programObject = context->getProgram(program);
3469
3470 if (!programObject)
3471 {
3472 if (context->getShader(program))
3473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003474 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003475 }
3476 else
3477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003478 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003479 }
3480 }
3481
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003482 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003484 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003485 }
3486
3487 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3488 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489 }
3490 catch(std::bad_alloc&)
3491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 }
3494}
3495
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003496void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003498 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003499 "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 +00003500 program, index, bufsize, length, size, type, name);
3501
3502 try
3503 {
3504 if (bufsize < 0)
3505 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003506 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 }
3508
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003509 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003510
3511 if (context)
3512 {
3513 gl::Program *programObject = context->getProgram(program);
3514
3515 if (!programObject)
3516 {
3517 if (context->getShader(program))
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003520 }
3521 else
3522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003524 }
3525 }
3526
3527 if (index >= (GLuint)programObject->getActiveUniformCount())
3528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003529 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003530 }
3531
3532 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3533 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003534 }
3535 catch(std::bad_alloc&)
3536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003537 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003538 }
3539}
3540
3541void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3542{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003543 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 +00003544 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003545
3546 try
3547 {
3548 if (maxcount < 0)
3549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003550 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003551 }
3552
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003553 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003554
3555 if (context)
3556 {
3557 gl::Program *programObject = context->getProgram(program);
3558
3559 if (!programObject)
3560 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003561 if (context->getShader(program))
3562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003563 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003564 }
3565 else
3566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003567 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003568 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003569 }
3570
3571 return programObject->getAttachedShaders(maxcount, count, shaders);
3572 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003573 }
3574 catch(std::bad_alloc&)
3575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003577 }
3578}
3579
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003580int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003581{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003582 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003583
3584 try
3585 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003587
3588 if (context)
3589 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003590
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003591 gl::Program *programObject = context->getProgram(program);
3592
3593 if (!programObject)
3594 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003595 if (context->getShader(program))
3596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003597 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003598 }
3599 else
3600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003601 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003602 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003603 }
3604
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003605 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003606 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003608 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003609 }
3610
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003611 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003612 }
3613 }
3614 catch(std::bad_alloc&)
3615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003616 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617 }
3618
3619 return -1;
3620}
3621
3622void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3623{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003624 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625
3626 try
3627 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003628 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003629
3630 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003631 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003632 if (!(context->getBooleanv(pname, params)))
3633 {
3634 GLenum nativeType;
3635 unsigned int numParams = 0;
3636 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003638
3639 if (numParams == 0)
3640 return; // it is known that the pname is valid, but there are no parameters to return
3641
3642 if (nativeType == GL_FLOAT)
3643 {
3644 GLfloat *floatParams = NULL;
3645 floatParams = new GLfloat[numParams];
3646
3647 context->getFloatv(pname, floatParams);
3648
3649 for (unsigned int i = 0; i < numParams; ++i)
3650 {
3651 if (floatParams[i] == 0.0f)
3652 params[i] = GL_FALSE;
3653 else
3654 params[i] = GL_TRUE;
3655 }
3656
3657 delete [] floatParams;
3658 }
3659 else if (nativeType == GL_INT)
3660 {
3661 GLint *intParams = NULL;
3662 intParams = new GLint[numParams];
3663
3664 context->getIntegerv(pname, intParams);
3665
3666 for (unsigned int i = 0; i < numParams; ++i)
3667 {
3668 if (intParams[i] == 0)
3669 params[i] = GL_FALSE;
3670 else
3671 params[i] = GL_TRUE;
3672 }
3673
3674 delete [] intParams;
3675 }
3676 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003677 }
3678 }
3679 catch(std::bad_alloc&)
3680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003681 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003682 }
3683}
3684
3685void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3686{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003687 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 +00003688
3689 try
3690 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003691 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003692
3693 if (context)
3694 {
3695 gl::Buffer *buffer;
3696
3697 switch (target)
3698 {
3699 case GL_ARRAY_BUFFER:
3700 buffer = context->getArrayBuffer();
3701 break;
3702 case GL_ELEMENT_ARRAY_BUFFER:
3703 buffer = context->getElementArrayBuffer();
3704 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003705 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003706 }
3707
3708 if (!buffer)
3709 {
3710 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003711 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003712 }
3713
3714 switch (pname)
3715 {
3716 case GL_BUFFER_USAGE:
3717 *params = buffer->usage();
3718 break;
3719 case GL_BUFFER_SIZE:
3720 *params = buffer->size();
3721 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003722 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003723 }
3724 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725 }
3726 catch(std::bad_alloc&)
3727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003729 }
3730}
3731
3732GLenum __stdcall glGetError(void)
3733{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003734 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003735
3736 gl::Context *context = gl::getContext();
3737
3738 if (context)
3739 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003740 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741 }
3742
3743 return GL_NO_ERROR;
3744}
3745
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003746void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003748 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003749
3750 try
3751 {
3752
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003753 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003754
3755 if (context)
3756 {
3757 gl::Fence *fenceObject = context->getFence(fence);
3758
3759 if (fenceObject == NULL)
3760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003761 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003762 }
3763
3764 fenceObject->getFenceiv(pname, params);
3765 }
3766 }
3767 catch(std::bad_alloc&)
3768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003770 }
3771}
3772
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003773void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3774{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003775 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003776
3777 try
3778 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003779 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003780
3781 if (context)
3782 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003783 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003784 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003785 GLenum nativeType;
3786 unsigned int numParams = 0;
3787 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003789
3790 if (numParams == 0)
3791 return; // it is known that the pname is valid, but that there are no parameters to return.
3792
3793 if (nativeType == GL_BOOL)
3794 {
3795 GLboolean *boolParams = NULL;
3796 boolParams = new GLboolean[numParams];
3797
3798 context->getBooleanv(pname, boolParams);
3799
3800 for (unsigned int i = 0; i < numParams; ++i)
3801 {
3802 if (boolParams[i] == GL_FALSE)
3803 params[i] = 0.0f;
3804 else
3805 params[i] = 1.0f;
3806 }
3807
3808 delete [] boolParams;
3809 }
3810 else if (nativeType == GL_INT)
3811 {
3812 GLint *intParams = NULL;
3813 intParams = new GLint[numParams];
3814
3815 context->getIntegerv(pname, intParams);
3816
3817 for (unsigned int i = 0; i < numParams; ++i)
3818 {
3819 params[i] = (GLfloat)intParams[i];
3820 }
3821
3822 delete [] intParams;
3823 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003824 }
3825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003826 }
3827 catch(std::bad_alloc&)
3828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003830 }
3831}
3832
3833void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003835 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 +00003836 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003837
3838 try
3839 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003841
3842 if (context)
3843 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003844 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003846 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003847 }
3848
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003849 gl::Framebuffer *framebuffer = NULL;
3850 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3851 {
3852 if(context->getReadFramebufferHandle() == 0)
3853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003854 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003855 }
3856
3857 framebuffer = context->getReadFramebuffer();
3858 }
3859 else
3860 {
3861 if (context->getDrawFramebufferHandle() == 0)
3862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003864 }
3865
3866 framebuffer = context->getDrawFramebuffer();
3867 }
3868
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003869 GLenum attachmentType;
3870 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003871
3872 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003873 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003874 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3875
3876 if (colorAttachment >= context->getMaximumRenderTargets())
3877 {
3878 return gl::error(GL_INVALID_ENUM);
3879 }
3880
3881 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3882 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3883 }
3884 else
3885 {
3886 switch (attachment)
3887 {
3888 case GL_DEPTH_ATTACHMENT:
3889 attachmentType = framebuffer->getDepthbufferType();
3890 attachmentHandle = framebuffer->getDepthbufferHandle();
3891 break;
3892 case GL_STENCIL_ATTACHMENT:
3893 attachmentType = framebuffer->getStencilbufferType();
3894 attachmentHandle = framebuffer->getStencilbufferHandle();
3895 break;
3896 default: return gl::error(GL_INVALID_ENUM);
3897 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003898 }
3899
3900 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003901 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003902 {
3903 attachmentObjectType = attachmentType;
3904 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003905 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003906 {
3907 attachmentObjectType = GL_TEXTURE;
3908 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003909 else
3910 {
3911 UNREACHABLE();
3912 return;
3913 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003914
3915 switch (pname)
3916 {
3917 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3918 *params = attachmentObjectType;
3919 break;
3920 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3921 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3922 {
3923 *params = attachmentHandle;
3924 }
3925 else
3926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003928 }
3929 break;
3930 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3931 if (attachmentObjectType == GL_TEXTURE)
3932 {
3933 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3934 }
3935 else
3936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003937 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003938 }
3939 break;
3940 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3941 if (attachmentObjectType == GL_TEXTURE)
3942 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003943 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003944 {
3945 *params = attachmentType;
3946 }
3947 else
3948 {
3949 *params = 0;
3950 }
3951 }
3952 else
3953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003954 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003955 }
3956 break;
3957 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003958 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960 }
3961 }
3962 catch(std::bad_alloc&)
3963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003964 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965 }
3966}
3967
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003968GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3969{
3970 EVENT("()");
3971
3972 try
3973 {
3974 gl::Context *context = gl::getContext();
3975
3976 if (context)
3977 {
3978 return context->getResetStatus();
3979 }
3980
3981 return GL_NO_ERROR;
3982 }
3983 catch(std::bad_alloc&)
3984 {
3985 return GL_OUT_OF_MEMORY;
3986 }
3987}
3988
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003989void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003991 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992
3993 try
3994 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996
3997 if (context)
3998 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003999 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004000 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004001 GLenum nativeType;
4002 unsigned int numParams = 0;
4003 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004005
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004006 if (numParams == 0)
4007 return; // it is known that pname is valid, but there are no parameters to return
4008
4009 if (nativeType == GL_BOOL)
4010 {
4011 GLboolean *boolParams = NULL;
4012 boolParams = new GLboolean[numParams];
4013
4014 context->getBooleanv(pname, boolParams);
4015
4016 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004018 if (boolParams[i] == GL_FALSE)
4019 params[i] = 0;
4020 else
4021 params[i] = 1;
4022 }
4023
4024 delete [] boolParams;
4025 }
4026 else if (nativeType == GL_FLOAT)
4027 {
4028 GLfloat *floatParams = NULL;
4029 floatParams = new GLfloat[numParams];
4030
4031 context->getFloatv(pname, floatParams);
4032
4033 for (unsigned int i = 0; i < numParams; ++i)
4034 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00004035 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 +00004036 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004037 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004038 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004039 else
4040 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 +00004041 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004043 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004045 }
4046 }
4047 }
4048 catch(std::bad_alloc&)
4049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004051 }
4052}
4053
4054void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
4055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004056 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057
4058 try
4059 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004060 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061
4062 if (context)
4063 {
4064 gl::Program *programObject = context->getProgram(program);
4065
4066 if (!programObject)
4067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004068 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004069 }
4070
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004071 if (context->getClientVersion() < 3)
4072 {
4073 switch (pname)
4074 {
4075 case GL_ACTIVE_UNIFORM_BLOCKS:
4076 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4077 return gl::error(GL_INVALID_ENUM);
4078 }
4079 }
4080
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004081 switch (pname)
4082 {
4083 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004084 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004085 return;
4086 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004087 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004088 return;
4089 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004090 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004091 return;
4092 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004093 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094 return;
4095 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004096 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097 return;
4098 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004099 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004100 return;
4101 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004102 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 return;
4104 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004105 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004106 return;
4107 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004108 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004109 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004110 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004111 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004112 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004113 case GL_ACTIVE_UNIFORM_BLOCKS:
4114 *params = programObject->getActiveUniformBlockCount();
4115 return;
4116 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4117 *params = programObject->getActiveUniformBlockMaxLength();
4118 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004119 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004120 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004121 }
4122 }
4123 }
4124 catch(std::bad_alloc&)
4125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004126 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004127 }
4128}
4129
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004130void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004131{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004132 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 +00004133 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134
4135 try
4136 {
4137 if (bufsize < 0)
4138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004139 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004140 }
4141
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004142 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004143
4144 if (context)
4145 {
4146 gl::Program *programObject = context->getProgram(program);
4147
4148 if (!programObject)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004151 }
4152
4153 programObject->getInfoLog(bufsize, length, infolog);
4154 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155 }
4156 catch(std::bad_alloc&)
4157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004158 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159 }
4160}
4161
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004162void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4163{
4164 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4165
4166 try
4167 {
4168 switch (pname)
4169 {
4170 case GL_CURRENT_QUERY_EXT:
4171 break;
4172 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004174 }
4175
4176 gl::Context *context = gl::getNonLostContext();
4177
4178 if (context)
4179 {
4180 params[0] = context->getActiveQuery(target);
4181 }
4182 }
4183 catch(std::bad_alloc&)
4184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004185 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004186 }
4187}
4188
4189void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4190{
4191 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4192
4193 try
4194 {
4195 switch (pname)
4196 {
4197 case GL_QUERY_RESULT_EXT:
4198 case GL_QUERY_RESULT_AVAILABLE_EXT:
4199 break;
4200 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004201 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004202 }
4203 gl::Context *context = gl::getNonLostContext();
4204
4205 if (context)
4206 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004207 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4208
4209 if (!queryObject)
4210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004211 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004212 }
4213
4214 if (context->getActiveQuery(queryObject->getType()) == id)
4215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004216 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004217 }
4218
4219 switch(pname)
4220 {
4221 case GL_QUERY_RESULT_EXT:
4222 params[0] = queryObject->getResult();
4223 break;
4224 case GL_QUERY_RESULT_AVAILABLE_EXT:
4225 params[0] = queryObject->isResultAvailable();
4226 break;
4227 default:
4228 ASSERT(false);
4229 }
4230 }
4231 }
4232 catch(std::bad_alloc&)
4233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004235 }
4236}
4237
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004240 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 +00004241
4242 try
4243 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004244 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004245
4246 if (context)
4247 {
4248 if (target != GL_RENDERBUFFER)
4249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004251 }
4252
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004253 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004255 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004256 }
4257
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004258 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004259
4260 switch (pname)
4261 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004262 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4263 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4264 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4265 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4266 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4267 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4268 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4269 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4270 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004271 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004272 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004273 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004274 *params = renderbuffer->getSamples();
4275 }
4276 else
4277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004278 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004279 }
4280 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004281 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004282 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004283 }
4284 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004285 }
4286 catch(std::bad_alloc&)
4287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004288 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004289 }
4290}
4291
4292void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004294 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295
4296 try
4297 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004298 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004299
4300 if (context)
4301 {
4302 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004303
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304 if (!shaderObject)
4305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004307 }
4308
4309 switch (pname)
4310 {
4311 case GL_SHADER_TYPE:
4312 *params = shaderObject->getType();
4313 return;
4314 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004315 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004316 return;
4317 case GL_COMPILE_STATUS:
4318 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4319 return;
4320 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004321 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004322 return;
4323 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004324 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004325 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004326 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4327 *params = shaderObject->getTranslatedSourceLength();
4328 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004329 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331 }
4332 }
4333 }
4334 catch(std::bad_alloc&)
4335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337 }
4338}
4339
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004340void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004342 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 +00004343 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344
4345 try
4346 {
4347 if (bufsize < 0)
4348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004350 }
4351
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004353
4354 if (context)
4355 {
4356 gl::Shader *shaderObject = context->getShader(shader);
4357
4358 if (!shaderObject)
4359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004361 }
4362
4363 shaderObject->getInfoLog(bufsize, length, infolog);
4364 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365 }
4366 catch(std::bad_alloc&)
4367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004368 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369 }
4370}
4371
4372void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4373{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004374 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 +00004375 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004376
4377 try
4378 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004379 switch (shadertype)
4380 {
4381 case GL_VERTEX_SHADER:
4382 case GL_FRAGMENT_SHADER:
4383 break;
4384 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004385 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004386 }
4387
4388 switch (precisiontype)
4389 {
4390 case GL_LOW_FLOAT:
4391 case GL_MEDIUM_FLOAT:
4392 case GL_HIGH_FLOAT:
4393 // Assume IEEE 754 precision
4394 range[0] = 127;
4395 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004396 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004397 break;
4398 case GL_LOW_INT:
4399 case GL_MEDIUM_INT:
4400 case GL_HIGH_INT:
4401 // Some (most) hardware only supports single-precision floating-point numbers,
4402 // which can accurately represent integers up to +/-16777216
4403 range[0] = 24;
4404 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004405 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004406 break;
4407 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004408 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004409 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004410 }
4411 catch(std::bad_alloc&)
4412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004413 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414 }
4415}
4416
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004417void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004418{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004419 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 +00004420 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421
4422 try
4423 {
4424 if (bufsize < 0)
4425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 }
4428
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004429 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004430
4431 if (context)
4432 {
4433 gl::Shader *shaderObject = context->getShader(shader);
4434
4435 if (!shaderObject)
4436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004437 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004438 }
4439
4440 shaderObject->getSource(bufsize, length, source);
4441 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442 }
4443 catch(std::bad_alloc&)
4444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004445 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446 }
4447}
4448
zmo@google.coma574f782011-10-03 21:45:23 +00004449void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4450{
4451 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4452 shader, bufsize, length, source);
4453
4454 try
4455 {
4456 if (bufsize < 0)
4457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004458 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004459 }
4460
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004461 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004462
4463 if (context)
4464 {
4465 gl::Shader *shaderObject = context->getShader(shader);
4466
4467 if (!shaderObject)
4468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004469 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004470 }
4471
4472 shaderObject->getTranslatedSource(bufsize, length, source);
4473 }
4474 }
4475 catch(std::bad_alloc&)
4476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004477 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004478 }
4479}
4480
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004481const GLubyte* __stdcall glGetString(GLenum name)
4482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004483 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004484
4485 try
4486 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004487 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004488
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489 switch (name)
4490 {
4491 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004492 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004493 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004494 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004496 if (context->getClientVersion() == 2)
4497 {
4498 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4499 }
4500 else
4501 {
4502 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4503 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004505 if (context->getClientVersion() == 2)
4506 {
4507 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4508 }
4509 else
4510 {
4511 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4512 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004513 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004514 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004515 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004516 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517 }
4518 }
4519 catch(std::bad_alloc&)
4520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004521 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004523}
4524
4525void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4526{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004527 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 +00004528
4529 try
4530 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004531 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004532
4533 if (context)
4534 {
4535 gl::Texture *texture;
4536
4537 switch (target)
4538 {
4539 case GL_TEXTURE_2D:
4540 texture = context->getTexture2D();
4541 break;
4542 case GL_TEXTURE_CUBE_MAP:
4543 texture = context->getTextureCubeMap();
4544 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004545 case GL_TEXTURE_3D:
4546 if (context->getClientVersion() < 3)
4547 {
4548 return gl::error(GL_INVALID_ENUM);
4549 }
4550 texture = context->getTexture3D();
4551 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004552 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004553 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004554 }
4555
4556 switch (pname)
4557 {
4558 case GL_TEXTURE_MAG_FILTER:
4559 *params = (GLfloat)texture->getMagFilter();
4560 break;
4561 case GL_TEXTURE_MIN_FILTER:
4562 *params = (GLfloat)texture->getMinFilter();
4563 break;
4564 case GL_TEXTURE_WRAP_S:
4565 *params = (GLfloat)texture->getWrapS();
4566 break;
4567 case GL_TEXTURE_WRAP_T:
4568 *params = (GLfloat)texture->getWrapT();
4569 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004570 case GL_TEXTURE_WRAP_R:
4571 if (context->getClientVersion() < 3)
4572 {
4573 return gl::error(GL_INVALID_ENUM);
4574 }
4575 *params = (GLfloat)texture->getWrapR();
4576 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004577 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4578 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4579 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004580 case GL_TEXTURE_USAGE_ANGLE:
4581 *params = (GLfloat)texture->getUsage();
4582 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004583 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4584 if (!context->supportsTextureFilterAnisotropy())
4585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004587 }
4588 *params = (GLfloat)texture->getMaxAnisotropy();
4589 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004590 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004591 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004592 }
4593 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004594 }
4595 catch(std::bad_alloc&)
4596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004598 }
4599}
4600
4601void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004603 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 +00004604
4605 try
4606 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004608
4609 if (context)
4610 {
4611 gl::Texture *texture;
4612
4613 switch (target)
4614 {
4615 case GL_TEXTURE_2D:
4616 texture = context->getTexture2D();
4617 break;
4618 case GL_TEXTURE_CUBE_MAP:
4619 texture = context->getTextureCubeMap();
4620 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004621 case GL_TEXTURE_3D:
4622 if (context->getClientVersion() < 3)
4623 {
4624 return gl::error(GL_INVALID_ENUM);
4625 }
4626 texture = context->getTexture3D();
4627 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004628 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004630 }
4631
4632 switch (pname)
4633 {
4634 case GL_TEXTURE_MAG_FILTER:
4635 *params = texture->getMagFilter();
4636 break;
4637 case GL_TEXTURE_MIN_FILTER:
4638 *params = texture->getMinFilter();
4639 break;
4640 case GL_TEXTURE_WRAP_S:
4641 *params = texture->getWrapS();
4642 break;
4643 case GL_TEXTURE_WRAP_T:
4644 *params = texture->getWrapT();
4645 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004646 case GL_TEXTURE_WRAP_R:
4647 if (context->getClientVersion() < 3)
4648 {
4649 return gl::error(GL_INVALID_ENUM);
4650 }
4651 *params = texture->getWrapR();
4652 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004653 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4654 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4655 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004656 case GL_TEXTURE_USAGE_ANGLE:
4657 *params = texture->getUsage();
4658 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004659 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4660 if (!context->supportsTextureFilterAnisotropy())
4661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004662 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004663 }
4664 *params = (GLint)texture->getMaxAnisotropy();
4665 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004666 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004667 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004668 }
4669 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670 }
4671 catch(std::bad_alloc&)
4672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004673 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004674 }
4675}
4676
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004677void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4678{
4679 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4680 program, location, bufSize, params);
4681
4682 try
4683 {
4684 if (bufSize < 0)
4685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004687 }
4688
4689 gl::Context *context = gl::getNonLostContext();
4690
4691 if (context)
4692 {
4693 if (program == 0)
4694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004695 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004696 }
4697
4698 gl::Program *programObject = context->getProgram(program);
4699
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004700 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004702 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004703 }
4704
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004705 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4706 if (!programBinary)
4707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004708 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004709 }
4710
4711 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004713 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004714 }
4715 }
4716 }
4717 catch(std::bad_alloc&)
4718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004720 }
4721}
4722
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004723void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004725 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004726
4727 try
4728 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004730
4731 if (context)
4732 {
4733 if (program == 0)
4734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004735 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004736 }
4737
4738 gl::Program *programObject = context->getProgram(program);
4739
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004740 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004742 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004743 }
4744
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004745 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4746 if (!programBinary)
4747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004748 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004749 }
4750
4751 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004754 }
4755 }
4756 }
4757 catch(std::bad_alloc&)
4758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004759 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004760 }
4761}
4762
4763void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4764{
4765 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4766 program, location, bufSize, params);
4767
4768 try
4769 {
4770 if (bufSize < 0)
4771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004773 }
4774
4775 gl::Context *context = gl::getNonLostContext();
4776
4777 if (context)
4778 {
4779 if (program == 0)
4780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004782 }
4783
4784 gl::Program *programObject = context->getProgram(program);
4785
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004786 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004789 }
4790
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004791 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4792 if (!programBinary)
4793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004794 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004795 }
4796
4797 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004799 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004800 }
4801 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802 }
4803 catch(std::bad_alloc&)
4804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004806 }
4807}
4808
4809void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4810{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004811 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812
4813 try
4814 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004815 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004816
4817 if (context)
4818 {
4819 if (program == 0)
4820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004822 }
4823
4824 gl::Program *programObject = context->getProgram(program);
4825
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004826 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004828 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004829 }
4830
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004831 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4832 if (!programBinary)
4833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004834 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004835 }
4836
4837 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004839 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004840 }
4841 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 }
4843 catch(std::bad_alloc&)
4844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004845 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846 }
4847}
4848
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004849int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004850{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004851 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852
4853 try
4854 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004855 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856
4857 if (strstr(name, "gl_") == name)
4858 {
4859 return -1;
4860 }
4861
4862 if (context)
4863 {
4864 gl::Program *programObject = context->getProgram(program);
4865
4866 if (!programObject)
4867 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004868 if (context->getShader(program))
4869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004870 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004871 }
4872 else
4873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004874 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004875 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004876 }
4877
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004878 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004879 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004881 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004882 }
4883
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004884 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 }
4886 }
4887 catch(std::bad_alloc&)
4888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004889 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004890 }
4891
4892 return -1;
4893}
4894
4895void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4896{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004897 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004898
4899 try
4900 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004902
daniel@transgaming.come0078962010-04-15 20:45:08 +00004903 if (context)
4904 {
4905 if (index >= gl::MAX_VERTEX_ATTRIBS)
4906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004907 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004908 }
4909
daniel@transgaming.com83921382011-01-08 05:46:00 +00004910 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004911
daniel@transgaming.come0078962010-04-15 20:45:08 +00004912 switch (pname)
4913 {
4914 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004915 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004916 break;
4917 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004918 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004919 break;
4920 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004921 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004922 break;
4923 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004924 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004925 break;
4926 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004927 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004928 break;
4929 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004930 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004931 break;
4932 case GL_CURRENT_VERTEX_ATTRIB:
4933 for (int i = 0; i < 4; ++i)
4934 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004935 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004936 }
4937 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004938 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4939 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4940 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004941 *params = (GLfloat)attribState.mDivisor;
4942 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004943 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004944 }
4945 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 }
4947 catch(std::bad_alloc&)
4948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004949 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004950 }
4951}
4952
4953void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004955 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004956
4957 try
4958 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960
daniel@transgaming.come0078962010-04-15 20:45:08 +00004961 if (context)
4962 {
4963 if (index >= gl::MAX_VERTEX_ATTRIBS)
4964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004965 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004966 }
4967
daniel@transgaming.com83921382011-01-08 05:46:00 +00004968 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004969
daniel@transgaming.come0078962010-04-15 20:45:08 +00004970 switch (pname)
4971 {
4972 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004973 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004974 break;
4975 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004976 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004977 break;
4978 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004979 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004980 break;
4981 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004982 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004983 break;
4984 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004985 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004986 break;
4987 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004988 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004989 break;
4990 case GL_CURRENT_VERTEX_ATTRIB:
4991 for (int i = 0; i < 4; ++i)
4992 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004993 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004994 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4995 }
4996 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004997 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4998 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4999 // the same constant.
5000 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005001 *params = (GLint)attribState.mDivisor;
5002 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005003 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005004 }
5005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005006 }
5007 catch(std::bad_alloc&)
5008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005010 }
5011}
5012
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005013void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005015 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005016
5017 try
5018 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005019 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020
daniel@transgaming.come0078962010-04-15 20:45:08 +00005021 if (context)
5022 {
5023 if (index >= gl::MAX_VERTEX_ATTRIBS)
5024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005025 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005026 }
5027
5028 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
5029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005030 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005031 }
5032
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005033 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00005034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035 }
5036 catch(std::bad_alloc&)
5037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005038 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005039 }
5040}
5041
5042void __stdcall glHint(GLenum target, GLenum mode)
5043{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005044 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005045
5046 try
5047 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005048 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005049 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005050 case GL_FASTEST:
5051 case GL_NICEST:
5052 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005053 break;
5054 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005055 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005056 }
5057
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005058 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005059 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005060 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005061 case GL_GENERATE_MIPMAP_HINT:
5062 if (context) context->setGenerateMipmapHint(mode);
5063 break;
5064 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
5065 if (context) context->setFragmentShaderDerivativeHint(mode);
5066 break;
5067 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005068 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005069 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005070 }
5071 catch(std::bad_alloc&)
5072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074 }
5075}
5076
5077GLboolean __stdcall glIsBuffer(GLuint buffer)
5078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005079 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005080
5081 try
5082 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005083 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005084
5085 if (context && buffer)
5086 {
5087 gl::Buffer *bufferObject = context->getBuffer(buffer);
5088
5089 if (bufferObject)
5090 {
5091 return GL_TRUE;
5092 }
5093 }
5094 }
5095 catch(std::bad_alloc&)
5096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005097 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098 }
5099
5100 return GL_FALSE;
5101}
5102
5103GLboolean __stdcall glIsEnabled(GLenum cap)
5104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005105 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005106
5107 try
5108 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005109 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005110
5111 if (context)
5112 {
5113 switch (cap)
5114 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005115 case GL_CULL_FACE: return context->isCullFaceEnabled();
5116 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5117 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5118 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5119 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5120 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5121 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5122 case GL_BLEND: return context->isBlendEnabled();
5123 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005124 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005125 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005126 }
5127 }
5128 }
5129 catch(std::bad_alloc&)
5130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005131 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133
5134 return false;
5135}
5136
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005137GLboolean __stdcall glIsFenceNV(GLuint fence)
5138{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005139 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005140
5141 try
5142 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005143 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005144
5145 if (context)
5146 {
5147 gl::Fence *fenceObject = context->getFence(fence);
5148
5149 if (fenceObject == NULL)
5150 {
5151 return GL_FALSE;
5152 }
5153
5154 return fenceObject->isFence();
5155 }
5156 }
5157 catch(std::bad_alloc&)
5158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005159 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005160 }
5161
5162 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005163}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005164
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005167 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005168
5169 try
5170 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005172
5173 if (context && framebuffer)
5174 {
5175 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5176
5177 if (framebufferObject)
5178 {
5179 return GL_TRUE;
5180 }
5181 }
5182 }
5183 catch(std::bad_alloc&)
5184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005185 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005186 }
5187
5188 return GL_FALSE;
5189}
5190
5191GLboolean __stdcall glIsProgram(GLuint program)
5192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005193 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005194
5195 try
5196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005198
5199 if (context && program)
5200 {
5201 gl::Program *programObject = context->getProgram(program);
5202
5203 if (programObject)
5204 {
5205 return GL_TRUE;
5206 }
5207 }
5208 }
5209 catch(std::bad_alloc&)
5210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005211 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212 }
5213
5214 return GL_FALSE;
5215}
5216
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005217GLboolean __stdcall glIsQueryEXT(GLuint id)
5218{
5219 EVENT("(GLuint id = %d)", id);
5220
5221 try
5222 {
5223 if (id == 0)
5224 {
5225 return GL_FALSE;
5226 }
5227
5228 gl::Context *context = gl::getNonLostContext();
5229
5230 if (context)
5231 {
5232 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5233
5234 if (queryObject)
5235 {
5236 return GL_TRUE;
5237 }
5238 }
5239 }
5240 catch(std::bad_alloc&)
5241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005242 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005243 }
5244
5245 return GL_FALSE;
5246}
5247
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005248GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5249{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005250 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005251
5252 try
5253 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005255
5256 if (context && renderbuffer)
5257 {
5258 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5259
5260 if (renderbufferObject)
5261 {
5262 return GL_TRUE;
5263 }
5264 }
5265 }
5266 catch(std::bad_alloc&)
5267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005268 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005269 }
5270
5271 return GL_FALSE;
5272}
5273
5274GLboolean __stdcall glIsShader(GLuint shader)
5275{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005276 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277
5278 try
5279 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281
5282 if (context && shader)
5283 {
5284 gl::Shader *shaderObject = context->getShader(shader);
5285
5286 if (shaderObject)
5287 {
5288 return GL_TRUE;
5289 }
5290 }
5291 }
5292 catch(std::bad_alloc&)
5293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005294 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005295 }
5296
5297 return GL_FALSE;
5298}
5299
5300GLboolean __stdcall glIsTexture(GLuint texture)
5301{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005302 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303
5304 try
5305 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005307
5308 if (context && texture)
5309 {
5310 gl::Texture *textureObject = context->getTexture(texture);
5311
5312 if (textureObject)
5313 {
5314 return GL_TRUE;
5315 }
5316 }
5317 }
5318 catch(std::bad_alloc&)
5319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005320 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321 }
5322
5323 return GL_FALSE;
5324}
5325
5326void __stdcall glLineWidth(GLfloat width)
5327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005328 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005329
5330 try
5331 {
5332 if (width <= 0.0f)
5333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 }
5336
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005338
5339 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005341 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005342 }
5343 }
5344 catch(std::bad_alloc&)
5345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347 }
5348}
5349
5350void __stdcall glLinkProgram(GLuint program)
5351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005352 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353
5354 try
5355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005357
5358 if (context)
5359 {
5360 gl::Program *programObject = context->getProgram(program);
5361
5362 if (!programObject)
5363 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005364 if (context->getShader(program))
5365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005367 }
5368 else
5369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005370 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005371 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005372 }
5373
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005374 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005375 }
5376 }
5377 catch(std::bad_alloc&)
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381}
5382
5383void __stdcall glPixelStorei(GLenum pname, GLint param)
5384{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005385 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005386
5387 try
5388 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005389 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005390
5391 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005392 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005393 switch (pname)
5394 {
5395 case GL_UNPACK_ALIGNMENT:
5396 if (param != 1 && param != 2 && param != 4 && param != 8)
5397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005398 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005399 }
5400
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005401 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005402 break;
5403
5404 case GL_PACK_ALIGNMENT:
5405 if (param != 1 && param != 2 && param != 4 && param != 8)
5406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005408 }
5409
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005410 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005411 break;
5412
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005413 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5414 context->setPackReverseRowOrder(param != 0);
5415 break;
5416
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005419 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 }
5421 }
5422 catch(std::bad_alloc&)
5423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426}
5427
5428void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005430 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431
5432 try
5433 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005435
5436 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005437 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005438 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440 }
5441 catch(std::bad_alloc&)
5442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444 }
5445}
5446
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005447void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5448 GLenum format, GLenum type, GLsizei bufSize,
5449 GLvoid *data)
5450{
5451 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5452 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5453 x, y, width, height, format, type, bufSize, data);
5454
5455 try
5456 {
5457 if (width < 0 || height < 0 || bufSize < 0)
5458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005460 }
5461
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005462 gl::Context *context = gl::getNonLostContext();
5463
5464 if (context)
5465 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005466 GLenum currentFormat, currentType;
5467
5468 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5469 // and attempting to read back if that's the case is an error. The error will be registered
5470 // by getCurrentReadFormat.
5471 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5472 return;
5473
5474 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005476 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005477 }
5478
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005479 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5480 }
5481 }
5482 catch(std::bad_alloc&)
5483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005484 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005485 }
5486}
5487
5488void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5489 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005491 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005492 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005493 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005494
5495 try
5496 {
5497 if (width < 0 || height < 0)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005500 }
5501
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503
5504 if (context)
5505 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005506 GLenum currentFormat, currentType;
5507
5508 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5509 // and attempting to read back if that's the case is an error. The error will be registered
5510 // by getCurrentReadFormat.
5511 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5512 return;
5513
5514 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005517 }
5518
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005519 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 }
5521 }
5522 catch(std::bad_alloc&)
5523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 }
5526}
5527
5528void __stdcall glReleaseShaderCompiler(void)
5529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005530 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005531
5532 try
5533 {
5534 gl::Shader::releaseCompiler();
5535 }
5536 catch(std::bad_alloc&)
5537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005538 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 }
5540}
5541
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005542void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005544 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 +00005545 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546
5547 try
5548 {
5549 switch (target)
5550 {
5551 case GL_RENDERBUFFER:
5552 break;
5553 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005554 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555 }
5556
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005557 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005559 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005560 }
5561
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563
5564 if (context)
5565 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005566 if (!gl::IsValidInternalFormat(internalformat, context))
5567 {
5568 return gl::error(GL_INVALID_ENUM);
5569 }
5570
5571 if (!gl::IsColorRenderingSupported(internalformat, context) &&
5572 !gl::IsDepthRenderingSupported(internalformat, context) &&
5573 !gl::IsStencilRenderingSupported(internalformat, context))
5574 {
5575 return gl::error(GL_INVALID_ENUM);
5576 }
5577
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005578 if (width > context->getMaximumRenderbufferDimension() ||
5579 height > context->getMaximumRenderbufferDimension() ||
5580 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005582 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005583 }
5584
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005585 GLuint handle = context->getRenderbufferHandle();
5586 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005588 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005589 }
5590
5591 switch (internalformat)
5592 {
5593 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594 case GL_RGBA4:
5595 case GL_RGB5_A1:
5596 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005597 case GL_RGB8_OES:
5598 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005600 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005601 break;
5602 case GL_SRGB8_ALPHA8:
5603 case GL_RGB10_A2:
5604 case GL_RG8:
5605 case GL_R8:
5606 if (context->getClientVersion() < 3)
5607 {
5608 return gl::error(GL_INVALID_ENUM);
5609 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005610 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005612 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005614
5615 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616 }
5617 }
5618 catch(std::bad_alloc&)
5619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 }
5622}
5623
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005624void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5625{
5626 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5627}
5628
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5630{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005631 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005632
5633 try
5634 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005635 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005636
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637 if (context)
5638 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005639 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 }
5641 }
5642 catch(std::bad_alloc&)
5643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 }
5646}
5647
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005648void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005650 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005651
5652 try
5653 {
5654 if (condition != GL_ALL_COMPLETED_NV)
5655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005656 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005657 }
5658
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005659 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005660
5661 if (context)
5662 {
5663 gl::Fence *fenceObject = context->getFence(fence);
5664
5665 if (fenceObject == NULL)
5666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005667 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005668 }
5669
5670 fenceObject->setFence(condition);
5671 }
5672 }
5673 catch(std::bad_alloc&)
5674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005675 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005676 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005677}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005678
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5680{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005681 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 +00005682
5683 try
5684 {
5685 if (width < 0 || height < 0)
5686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005688 }
5689
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005690 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005691
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005692 if (context)
5693 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005694 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695 }
5696 }
5697 catch(std::bad_alloc&)
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701}
5702
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005703void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005705 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005706 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005707 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005708
5709 try
5710 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005711 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713 }
5714 catch(std::bad_alloc&)
5715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717 }
5718}
5719
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005720void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005722 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 +00005723 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005724
5725 try
5726 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005727 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005730 }
5731
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005733
5734 if (context)
5735 {
5736 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005737
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738 if (!shaderObject)
5739 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005740 if (context->getProgram(shader))
5741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005742 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005743 }
5744 else
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005747 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748 }
5749
5750 shaderObject->setSource(count, string, length);
5751 }
5752 }
5753 catch(std::bad_alloc&)
5754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005755 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005756 }
5757}
5758
5759void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5760{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005761 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005762}
5763
5764void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5765{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005766 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 +00005767
5768 try
5769 {
5770 switch (face)
5771 {
5772 case GL_FRONT:
5773 case GL_BACK:
5774 case GL_FRONT_AND_BACK:
5775 break;
5776 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778 }
5779
5780 switch (func)
5781 {
5782 case GL_NEVER:
5783 case GL_ALWAYS:
5784 case GL_LESS:
5785 case GL_LEQUAL:
5786 case GL_EQUAL:
5787 case GL_GEQUAL:
5788 case GL_GREATER:
5789 case GL_NOTEQUAL:
5790 break;
5791 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005792 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005793 }
5794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005796
5797 if (context)
5798 {
5799 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5800 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005801 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802 }
5803
5804 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5805 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005806 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005807 }
5808 }
5809 }
5810 catch(std::bad_alloc&)
5811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005812 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 }
5814}
5815
5816void __stdcall glStencilMask(GLuint mask)
5817{
5818 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5819}
5820
5821void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5822{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005823 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005824
5825 try
5826 {
5827 switch (face)
5828 {
5829 case GL_FRONT:
5830 case GL_BACK:
5831 case GL_FRONT_AND_BACK:
5832 break;
5833 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005834 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835 }
5836
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838
5839 if (context)
5840 {
5841 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5842 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005843 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005844 }
5845
5846 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5847 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005848 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849 }
5850 }
5851 }
5852 catch(std::bad_alloc&)
5853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856}
5857
5858void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5859{
5860 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5861}
5862
5863void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005865 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 +00005866 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005867
5868 try
5869 {
5870 switch (face)
5871 {
5872 case GL_FRONT:
5873 case GL_BACK:
5874 case GL_FRONT_AND_BACK:
5875 break;
5876 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005877 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005878 }
5879
5880 switch (fail)
5881 {
5882 case GL_ZERO:
5883 case GL_KEEP:
5884 case GL_REPLACE:
5885 case GL_INCR:
5886 case GL_DECR:
5887 case GL_INVERT:
5888 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005889 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005890 break;
5891 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005892 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005893 }
5894
5895 switch (zfail)
5896 {
5897 case GL_ZERO:
5898 case GL_KEEP:
5899 case GL_REPLACE:
5900 case GL_INCR:
5901 case GL_DECR:
5902 case GL_INVERT:
5903 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005904 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005905 break;
5906 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005907 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005908 }
5909
5910 switch (zpass)
5911 {
5912 case GL_ZERO:
5913 case GL_KEEP:
5914 case GL_REPLACE:
5915 case GL_INCR:
5916 case GL_DECR:
5917 case GL_INVERT:
5918 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005919 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005920 break;
5921 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005922 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005923 }
5924
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005926
5927 if (context)
5928 {
5929 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5930 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005931 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932 }
5933
5934 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5935 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005936 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 }
5938 }
5939 }
5940 catch(std::bad_alloc&)
5941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005943 }
5944}
5945
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005946GLboolean __stdcall glTestFenceNV(GLuint fence)
5947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005948 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005949
5950 try
5951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005952 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005953
5954 if (context)
5955 {
5956 gl::Fence *fenceObject = context->getFence(fence);
5957
5958 if (fenceObject == NULL)
5959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005961 }
5962
5963 return fenceObject->testFence();
5964 }
5965 }
5966 catch(std::bad_alloc&)
5967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005968 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005969 }
5970
5971 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005972}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005973
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005974void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5975 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005977 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 +00005978 "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 +00005979 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005980
5981 try
5982 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005983 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005987
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005988 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005990 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005991 }
5992
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005993 // validate <type> by itself (used as secondary key below)
5994 switch (type)
5995 {
5996 case GL_UNSIGNED_BYTE:
5997 case GL_UNSIGNED_SHORT_5_6_5:
5998 case GL_UNSIGNED_SHORT_4_4_4_4:
5999 case GL_UNSIGNED_SHORT_5_5_5_1:
6000 case GL_UNSIGNED_SHORT:
6001 case GL_UNSIGNED_INT:
6002 case GL_UNSIGNED_INT_24_8_OES:
6003 case GL_HALF_FLOAT_OES:
6004 case GL_FLOAT:
6005 break;
6006 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006007 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00006008 }
6009
6010 // validate <format> + <type> combinations
6011 // - invalid <format> -> sets INVALID_ENUM
6012 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006013 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 {
6015 case GL_ALPHA:
6016 case GL_LUMINANCE:
6017 case GL_LUMINANCE_ALPHA:
6018 switch (type)
6019 {
6020 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006021 case GL_FLOAT:
6022 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006023 break;
6024 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006025 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026 }
6027 break;
6028 case GL_RGB:
6029 switch (type)
6030 {
6031 case GL_UNSIGNED_BYTE:
6032 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006033 case GL_FLOAT:
6034 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 break;
6036 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006038 }
6039 break;
6040 case GL_RGBA:
6041 switch (type)
6042 {
6043 case GL_UNSIGNED_BYTE:
6044 case GL_UNSIGNED_SHORT_4_4_4_4:
6045 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006046 case GL_FLOAT:
6047 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006048 break;
6049 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006051 }
6052 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00006053 case GL_BGRA_EXT:
6054 switch (type)
6055 {
6056 case GL_UNSIGNED_BYTE:
6057 break;
6058 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006059 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00006060 }
6061 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006062 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
6063 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00006064 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6065 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00006066 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006067 case GL_DEPTH_COMPONENT:
6068 switch (type)
6069 {
6070 case GL_UNSIGNED_SHORT:
6071 case GL_UNSIGNED_INT:
6072 break;
6073 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006074 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006075 }
6076 break;
6077 case GL_DEPTH_STENCIL_OES:
6078 switch (type)
6079 {
6080 case GL_UNSIGNED_INT_24_8_OES:
6081 break;
6082 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006083 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006084 }
6085 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006086 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006087 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006088 }
6089
6090 if (border != 0)
6091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006092 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093 }
6094
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006095 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006096
6097 if (context)
6098 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006099 if (level > context->getMaximumTextureLevel())
6100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006101 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006102 }
6103
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006104 switch (target)
6105 {
6106 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006107 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6108 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006109 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006110 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006111 }
6112 break;
6113 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6114 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6115 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6116 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6117 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6118 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6119 if (width != height)
6120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006121 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006122 }
6123
6124 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6125 height > (context->getMaximumCubeTextureDimension() >> level))
6126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006127 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006128 }
6129 break;
6130 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006131 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006132 }
6133
gman@chromium.org50c526d2011-08-10 05:19:44 +00006134 switch (format) {
6135 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6136 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6137 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006139 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006140 }
6141 else
6142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006143 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006144 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006145 break;
6146 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6147 if (context->supportsDXT3Textures())
6148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006149 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006150 }
6151 else
6152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006153 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006154 }
6155 break;
6156 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6157 if (context->supportsDXT5Textures())
6158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006159 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006160 }
6161 else
6162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006163 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006164 }
6165 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006166 case GL_DEPTH_COMPONENT:
6167 case GL_DEPTH_STENCIL_OES:
6168 if (!context->supportsDepthTextures())
6169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006170 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006171 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006172 if (target != GL_TEXTURE_2D)
6173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006174 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006175 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006176 // OES_depth_texture supports loading depth data and multiple levels,
6177 // but ANGLE_depth_texture does not
6178 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006180 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006181 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006182 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006183 default:
6184 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006185 }
6186
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006187 if (type == GL_FLOAT)
6188 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006189 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006191 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006192 }
6193 }
6194 else if (type == GL_HALF_FLOAT_OES)
6195 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006196 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006199 }
6200 }
6201
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006202 if (target == GL_TEXTURE_2D)
6203 {
6204 gl::Texture2D *texture = context->getTexture2D();
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
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006216 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006217 }
6218 else
6219 {
6220 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6221
6222 if (!texture)
6223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006224 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006225 }
6226
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006227 if (texture->isImmutable())
6228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006229 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006230 }
6231
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 switch (target)
6233 {
6234 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006235 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006236 break;
6237 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006238 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006239 break;
6240 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006241 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006242 break;
6243 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006244 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006245 break;
6246 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006247 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006248 break;
6249 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006250 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006251 break;
6252 default: UNREACHABLE();
6253 }
6254 }
6255 }
6256 }
6257 catch(std::bad_alloc&)
6258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006260 }
6261}
6262
6263void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6264{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006265 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6266
6267 try
6268 {
6269 gl::Context *context = gl::getNonLostContext();
6270
6271 if (context)
6272 {
6273 gl::Texture *texture;
6274
6275 switch (target)
6276 {
6277 case GL_TEXTURE_2D:
6278 texture = context->getTexture2D();
6279 break;
6280 case GL_TEXTURE_CUBE_MAP:
6281 texture = context->getTextureCubeMap();
6282 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006283 case GL_TEXTURE_3D:
6284 if (context->getClientVersion() < 3)
6285 {
6286 return gl::error(GL_INVALID_ENUM);
6287 }
6288 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006289 case GL_TEXTURE_2D_ARRAY:
6290 if (context->getClientVersion() < 3)
6291 {
6292 return gl::error(GL_INVALID_ENUM);
6293 }
6294 texture = context->getTexture2DArray();
6295 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006296 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006297 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006298 }
6299
6300 switch (pname)
6301 {
6302 case GL_TEXTURE_WRAP_S:
6303 if (!texture->setWrapS((GLenum)param))
6304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006305 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006306 }
6307 break;
6308 case GL_TEXTURE_WRAP_T:
6309 if (!texture->setWrapT((GLenum)param))
6310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006311 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006312 }
6313 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006314 case GL_TEXTURE_WRAP_R:
6315 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6316 {
6317 return gl::error(GL_INVALID_ENUM);
6318 }
6319 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006320 case GL_TEXTURE_MIN_FILTER:
6321 if (!texture->setMinFilter((GLenum)param))
6322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006323 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006324 }
6325 break;
6326 case GL_TEXTURE_MAG_FILTER:
6327 if (!texture->setMagFilter((GLenum)param))
6328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006329 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006330 }
6331 break;
6332 case GL_TEXTURE_USAGE_ANGLE:
6333 if (!texture->setUsage((GLenum)param))
6334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006335 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006336 }
6337 break;
6338 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6339 if (!context->supportsTextureFilterAnisotropy())
6340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006341 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006342 }
6343 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006345 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006346 }
6347 break;
6348 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006349 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006350 }
6351 }
6352 }
6353 catch(std::bad_alloc&)
6354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006356 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006357}
6358
6359void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6360{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006361 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006362}
6363
6364void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6365{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006366 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006367
6368 try
6369 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006370 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006371
6372 if (context)
6373 {
6374 gl::Texture *texture;
6375
6376 switch (target)
6377 {
6378 case GL_TEXTURE_2D:
6379 texture = context->getTexture2D();
6380 break;
6381 case GL_TEXTURE_CUBE_MAP:
6382 texture = context->getTextureCubeMap();
6383 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006384 case GL_TEXTURE_3D:
6385 if (context->getClientVersion() < 3)
6386 {
6387 return gl::error(GL_INVALID_ENUM);
6388 }
6389 texture = context->getTexture3D();
6390 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006391 case GL_TEXTURE_2D_ARRAY:
6392 if (context->getClientVersion() < 3)
6393 {
6394 return gl::error(GL_INVALID_ENUM);
6395 }
6396 texture = context->getTexture2DArray();
6397 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006398 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006400 }
6401
6402 switch (pname)
6403 {
6404 case GL_TEXTURE_WRAP_S:
6405 if (!texture->setWrapS((GLenum)param))
6406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006407 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006408 }
6409 break;
6410 case GL_TEXTURE_WRAP_T:
6411 if (!texture->setWrapT((GLenum)param))
6412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006413 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006414 }
6415 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006416 case GL_TEXTURE_WRAP_R:
6417 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6418 {
6419 return gl::error(GL_INVALID_ENUM);
6420 }
6421 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006422 case GL_TEXTURE_MIN_FILTER:
6423 if (!texture->setMinFilter((GLenum)param))
6424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006425 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006426 }
6427 break;
6428 case GL_TEXTURE_MAG_FILTER:
6429 if (!texture->setMagFilter((GLenum)param))
6430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006432 }
6433 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006434 case GL_TEXTURE_USAGE_ANGLE:
6435 if (!texture->setUsage((GLenum)param))
6436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006437 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006438 }
6439 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006440 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6441 if (!context->supportsTextureFilterAnisotropy())
6442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006444 }
6445 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006448 }
6449 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006450 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006451 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006452 }
6453 }
6454 }
6455 catch(std::bad_alloc&)
6456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006457 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006458 }
6459}
6460
6461void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6462{
6463 glTexParameteri(target, pname, *params);
6464}
6465
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006466void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6467{
6468 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6469 target, levels, internalformat, width, height);
6470
6471 try
6472 {
6473 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006475 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006476 }
6477
6478 if (width < 1 || height < 1 || levels < 1)
6479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006480 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006481 }
6482
6483 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006485 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006486 }
6487
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006488 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006490 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006491 }
6492
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006493 gl::Context *context = gl::getNonLostContext();
6494
6495 if (context)
6496 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006497 if (!gl::IsValidInternalFormat(internalformat, context))
6498 {
6499 return gl::error(GL_INVALID_ENUM);
6500 }
6501
6502 GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
6503 GLenum type = gl::GetType(internalformat, context->getClientVersion());
6504
6505 if (format == GL_NONE || type == GL_NONE)
6506 {
6507 return gl::error(GL_INVALID_ENUM);
6508 }
6509
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006510 switch (target)
6511 {
6512 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006513 if (width > context->getMaximum2DTextureDimension() ||
6514 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006517 }
6518 break;
6519 case GL_TEXTURE_CUBE_MAP:
6520 if (width > context->getMaximumCubeTextureDimension() ||
6521 height > context->getMaximumCubeTextureDimension())
6522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006524 }
6525 break;
6526 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006527 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006528 }
6529
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006530 if (levels != 1 && !context->supportsNonPower2Texture())
6531 {
6532 if (!gl::isPow2(width) || !gl::isPow2(height))
6533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006534 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006535 }
6536 }
6537
daniel@transgaming.come1077362011-11-11 04:16:50 +00006538 switch (internalformat)
6539 {
6540 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6541 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6542 if (!context->supportsDXT1Textures())
6543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006545 }
6546 break;
6547 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6548 if (!context->supportsDXT3Textures())
6549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006551 }
6552 break;
6553 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6554 if (!context->supportsDXT5Textures())
6555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006556 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006557 }
6558 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006559 case GL_RGBA32F_EXT:
6560 case GL_RGB32F_EXT:
6561 case GL_ALPHA32F_EXT:
6562 case GL_LUMINANCE32F_EXT:
6563 case GL_LUMINANCE_ALPHA32F_EXT:
6564 if (!context->supportsFloat32Textures())
6565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006566 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006567 }
6568 break;
6569 case GL_RGBA16F_EXT:
6570 case GL_RGB16F_EXT:
6571 case GL_ALPHA16F_EXT:
6572 case GL_LUMINANCE16F_EXT:
6573 case GL_LUMINANCE_ALPHA16F_EXT:
6574 if (!context->supportsFloat16Textures())
6575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006577 }
6578 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006579 case GL_DEPTH_COMPONENT16:
6580 case GL_DEPTH_COMPONENT32_OES:
6581 case GL_DEPTH24_STENCIL8_OES:
6582 if (!context->supportsDepthTextures())
6583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006584 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006585 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006586 if (target != GL_TEXTURE_2D)
6587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006588 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006589 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006590 // ANGLE_depth_texture only supports 1-level textures
6591 if (levels != 1)
6592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006594 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006595 break;
6596 default:
6597 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006598 }
6599
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006600 if (target == GL_TEXTURE_2D)
6601 {
6602 gl::Texture2D *texture = context->getTexture2D();
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, height);
6615 }
6616 else if (target == GL_TEXTURE_CUBE_MAP)
6617 {
6618 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6619
6620 if (!texture || texture->id() == 0)
6621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006623 }
6624
6625 if (texture->isImmutable())
6626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006627 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006628 }
6629
6630 texture->storage(levels, internalformat, width);
6631 }
6632 else UNREACHABLE();
6633 }
6634 }
6635 catch(std::bad_alloc&)
6636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006638 }
6639}
6640
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006641void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6642 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006644 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006645 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006646 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006647 target, level, xoffset, yoffset, width, height, format, type, pixels);
6648
6649 try
6650 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006651 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006654 }
6655
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006656 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006659 }
6660
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006661 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006664 }
6665
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006666 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006667 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006668 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006669 }
6670
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006671 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006672
6673 if (context)
6674 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006675 if (level > context->getMaximumTextureLevel())
6676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006678 }
6679
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006680 if (type == GL_FLOAT)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006681 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006682 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006684 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006685 }
6686 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006687 else if (type == GL_HALF_FLOAT_OES)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006688 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006689 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006692 }
6693 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006694
6695 if (format == GL_DEPTH_COMPONENT)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006696 {
6697 if (!context->supportsDepthTextures())
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006700 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006701 if (target != GL_TEXTURE_2D)
6702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006703 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006704 }
6705 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006706 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006707 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006708
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006709 if (width == 0 || height == 0 || pixels == NULL)
6710 {
6711 return;
6712 }
6713
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006714 if (target == GL_TEXTURE_2D)
6715 {
6716 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006717 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006718 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006719 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006720 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006721 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006722 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006723 {
6724 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006725 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006726 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006727 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006728 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006729 }
6730 else
6731 {
6732 UNREACHABLE();
6733 }
6734 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006735 }
6736 catch(std::bad_alloc&)
6737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006738 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006739 }
6740}
6741
6742void __stdcall glUniform1f(GLint location, GLfloat x)
6743{
6744 glUniform1fv(location, 1, &x);
6745}
6746
6747void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006749 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006750
6751 try
6752 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006753 if (count < 0)
6754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006756 }
6757
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006758 if (location == -1)
6759 {
6760 return;
6761 }
6762
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006764
6765 if (context)
6766 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006767 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006768 if (!programBinary)
6769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006770 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006771 }
6772
6773 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006775 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006776 }
6777 }
6778 }
6779 catch(std::bad_alloc&)
6780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006781 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006782 }
6783}
6784
6785void __stdcall glUniform1i(GLint location, GLint x)
6786{
6787 glUniform1iv(location, 1, &x);
6788}
6789
6790void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6791{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006792 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006793
6794 try
6795 {
6796 if (count < 0)
6797 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006798 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006799 }
6800
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006801 if (location == -1)
6802 {
6803 return;
6804 }
6805
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006806 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006807
6808 if (context)
6809 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006810 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006811 if (!programBinary)
6812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006813 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006814 }
6815
6816 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006819 }
6820 }
6821 }
6822 catch(std::bad_alloc&)
6823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006824 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006825 }
6826}
6827
6828void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6829{
6830 GLfloat xy[2] = {x, y};
6831
6832 glUniform2fv(location, 1, (GLfloat*)&xy);
6833}
6834
6835void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6836{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006837 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838
6839 try
6840 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006841 if (count < 0)
6842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006843 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006844 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006845
6846 if (location == -1)
6847 {
6848 return;
6849 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006850
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006851 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006852
6853 if (context)
6854 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006855 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006856 if (!programBinary)
6857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006858 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006859 }
6860
6861 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006863 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006864 }
6865 }
6866 }
6867 catch(std::bad_alloc&)
6868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006870 }
6871}
6872
6873void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6874{
6875 GLint xy[4] = {x, y};
6876
6877 glUniform2iv(location, 1, (GLint*)&xy);
6878}
6879
6880void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6881{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006882 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006883
6884 try
6885 {
6886 if (count < 0)
6887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006889 }
6890
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006891 if (location == -1)
6892 {
6893 return;
6894 }
6895
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006896 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006897
6898 if (context)
6899 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006900 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006901 if (!programBinary)
6902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006903 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006904 }
6905
6906 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006908 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006909 }
6910 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006911 }
6912 catch(std::bad_alloc&)
6913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006915 }
6916}
6917
6918void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6919{
6920 GLfloat xyz[3] = {x, y, z};
6921
6922 glUniform3fv(location, 1, (GLfloat*)&xyz);
6923}
6924
6925void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6926{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006927 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006928
6929 try
6930 {
6931 if (count < 0)
6932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006933 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006934 }
6935
6936 if (location == -1)
6937 {
6938 return;
6939 }
6940
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006941 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006942
6943 if (context)
6944 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006945 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006946 if (!programBinary)
6947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006948 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006949 }
6950
6951 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006953 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006954 }
6955 }
6956 }
6957 catch(std::bad_alloc&)
6958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006959 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006960 }
6961}
6962
6963void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6964{
6965 GLint xyz[3] = {x, y, z};
6966
6967 glUniform3iv(location, 1, (GLint*)&xyz);
6968}
6969
6970void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006972 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006973
6974 try
6975 {
6976 if (count < 0)
6977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006978 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006979 }
6980
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006981 if (location == -1)
6982 {
6983 return;
6984 }
6985
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006986 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006987
6988 if (context)
6989 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006990 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006991 if (!programBinary)
6992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006993 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006994 }
6995
6996 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006998 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006999 }
7000 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007001 }
7002 catch(std::bad_alloc&)
7003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007004 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007005 }
7006}
7007
7008void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7009{
7010 GLfloat xyzw[4] = {x, y, z, w};
7011
7012 glUniform4fv(location, 1, (GLfloat*)&xyzw);
7013}
7014
7015void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
7016{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007017 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007018
7019 try
7020 {
7021 if (count < 0)
7022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007023 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007024 }
7025
7026 if (location == -1)
7027 {
7028 return;
7029 }
7030
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007032
7033 if (context)
7034 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007035 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007036 if (!programBinary)
7037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007038 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007039 }
7040
7041 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007044 }
7045 }
7046 }
7047 catch(std::bad_alloc&)
7048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007049 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007050 }
7051}
7052
7053void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
7054{
7055 GLint xyzw[4] = {x, y, z, w};
7056
7057 glUniform4iv(location, 1, (GLint*)&xyzw);
7058}
7059
7060void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
7061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007062 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007063
7064 try
7065 {
7066 if (count < 0)
7067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007068 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007069 }
7070
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007071 if (location == -1)
7072 {
7073 return;
7074 }
7075
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007077
7078 if (context)
7079 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007080 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007081 if (!programBinary)
7082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007083 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007084 }
7085
7086 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007088 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007089 }
7090 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007091 }
7092 catch(std::bad_alloc&)
7093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007094 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007095 }
7096}
7097
7098void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7099{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007100 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007101 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007102
7103 try
7104 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007105 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007107 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007108 }
7109
7110 if (location == -1)
7111 {
7112 return;
7113 }
7114
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007115 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007116
7117 if (context)
7118 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007119 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7120 {
7121 return gl::error(GL_INVALID_VALUE);
7122 }
7123
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007124 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007125 if (!programBinary)
7126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007127 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007128 }
7129
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007130 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007132 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007133 }
7134 }
7135 }
7136 catch(std::bad_alloc&)
7137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007138 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007139 }
7140}
7141
7142void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7143{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007144 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007145 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007146
7147 try
7148 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007149 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007151 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007152 }
7153
7154 if (location == -1)
7155 {
7156 return;
7157 }
7158
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007160
7161 if (context)
7162 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007163 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7164 {
7165 return gl::error(GL_INVALID_VALUE);
7166 }
7167
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007168 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007169 if (!programBinary)
7170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007171 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007172 }
7173
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007174 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007176 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007177 }
7178 }
7179 }
7180 catch(std::bad_alloc&)
7181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007183 }
7184}
7185
7186void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7187{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007188 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007189 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007190
7191 try
7192 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007193 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007195 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007196 }
7197
7198 if (location == -1)
7199 {
7200 return;
7201 }
7202
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007203 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007204
7205 if (context)
7206 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007207 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7208 {
7209 return gl::error(GL_INVALID_VALUE);
7210 }
7211
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007212 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007213 if (!programBinary)
7214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007215 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007216 }
7217
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007218 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007220 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007221 }
7222 }
7223 }
7224 catch(std::bad_alloc&)
7225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007226 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007227 }
7228}
7229
7230void __stdcall glUseProgram(GLuint program)
7231{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007232 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007233
7234 try
7235 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007236 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007237
7238 if (context)
7239 {
7240 gl::Program *programObject = context->getProgram(program);
7241
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007242 if (!programObject && program != 0)
7243 {
7244 if (context->getShader(program))
7245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007246 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007247 }
7248 else
7249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007251 }
7252 }
7253
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007254 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007256 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007257 }
7258
7259 context->useProgram(program);
7260 }
7261 }
7262 catch(std::bad_alloc&)
7263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007265 }
7266}
7267
7268void __stdcall glValidateProgram(GLuint program)
7269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007270 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007271
7272 try
7273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007275
7276 if (context)
7277 {
7278 gl::Program *programObject = context->getProgram(program);
7279
7280 if (!programObject)
7281 {
7282 if (context->getShader(program))
7283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007284 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007285 }
7286 else
7287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007289 }
7290 }
7291
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007292 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007293 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007294 }
7295 catch(std::bad_alloc&)
7296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007297 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007298 }
7299}
7300
7301void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007303 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007304
7305 try
7306 {
7307 if (index >= gl::MAX_VERTEX_ATTRIBS)
7308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007309 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007310 }
7311
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007313
7314 if (context)
7315 {
7316 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007317 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007318 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007319 }
7320 catch(std::bad_alloc&)
7321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007322 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007323 }
7324}
7325
7326void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7327{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007328 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007329
7330 try
7331 {
7332 if (index >= gl::MAX_VERTEX_ATTRIBS)
7333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007335 }
7336
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007337 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007338
7339 if (context)
7340 {
7341 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007342 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007343 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007344 }
7345 catch(std::bad_alloc&)
7346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007347 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007348 }
7349}
7350
7351void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007353 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007354
7355 try
7356 {
7357 if (index >= gl::MAX_VERTEX_ATTRIBS)
7358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007360 }
7361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007363
7364 if (context)
7365 {
7366 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007367 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007368 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007369 }
7370 catch(std::bad_alloc&)
7371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007372 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007373 }
7374}
7375
7376void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7377{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007378 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007379
7380 try
7381 {
7382 if (index >= gl::MAX_VERTEX_ATTRIBS)
7383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007385 }
7386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007388
7389 if (context)
7390 {
7391 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007392 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007394 }
7395 catch(std::bad_alloc&)
7396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007398 }
7399}
7400
7401void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007403 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 +00007404
7405 try
7406 {
7407 if (index >= gl::MAX_VERTEX_ATTRIBS)
7408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007409 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007410 }
7411
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007413
7414 if (context)
7415 {
7416 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007417 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007418 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007419 }
7420 catch(std::bad_alloc&)
7421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007422 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007423 }
7424}
7425
7426void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7427{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007428 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007429
7430 try
7431 {
7432 if (index >= gl::MAX_VERTEX_ATTRIBS)
7433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007434 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007435 }
7436
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007437 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007438
7439 if (context)
7440 {
7441 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007442 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007443 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007444 }
7445 catch(std::bad_alloc&)
7446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007448 }
7449}
7450
7451void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007453 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 +00007454
7455 try
7456 {
7457 if (index >= gl::MAX_VERTEX_ATTRIBS)
7458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007460 }
7461
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007462 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007463
7464 if (context)
7465 {
7466 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007467 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007468 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007469 }
7470 catch(std::bad_alloc&)
7471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007472 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007473 }
7474}
7475
7476void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7477{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007478 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007479
7480 try
7481 {
7482 if (index >= gl::MAX_VERTEX_ATTRIBS)
7483 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007484 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007485 }
7486
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007487 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007488
7489 if (context)
7490 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007491 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007492 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007493 }
7494 catch(std::bad_alloc&)
7495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007496 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007497 }
7498}
7499
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007500void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7501{
7502 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7503
7504 try
7505 {
7506 if (index >= gl::MAX_VERTEX_ATTRIBS)
7507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007508 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007509 }
7510
7511 gl::Context *context = gl::getNonLostContext();
7512
7513 if (context)
7514 {
7515 context->setVertexAttribDivisor(index, divisor);
7516 }
7517 }
7518 catch(std::bad_alloc&)
7519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007521 }
7522}
7523
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007524void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007526 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007527 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007528 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007529
7530 try
7531 {
7532 if (index >= gl::MAX_VERTEX_ATTRIBS)
7533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007534 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007535 }
7536
7537 if (size < 1 || size > 4)
7538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007539 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007540 }
7541
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007542 gl::Context *context = gl::getNonLostContext();
7543
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007544 switch (type)
7545 {
7546 case GL_BYTE:
7547 case GL_UNSIGNED_BYTE:
7548 case GL_SHORT:
7549 case GL_UNSIGNED_SHORT:
7550 case GL_FIXED:
7551 case GL_FLOAT:
7552 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007553 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007554 case GL_INT:
7555 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007556 case GL_INT_2_10_10_10_REV:
7557 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007558 if (context && context->getClientVersion() < 3)
7559 {
7560 return gl::error(GL_INVALID_ENUM);
7561 }
7562 else
7563 {
7564 break;
7565 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007568 }
7569
7570 if (stride < 0)
7571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007572 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007573 }
7574
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007575 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7576 {
7577 return gl::error(GL_INVALID_OPERATION);
7578 }
7579
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007580 if (context)
7581 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007582 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7583 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007584 }
7585 }
7586 catch(std::bad_alloc&)
7587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007588 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007589 }
7590}
7591
7592void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7593{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007594 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 +00007595
7596 try
7597 {
7598 if (width < 0 || height < 0)
7599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007601 }
7602
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007603 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007604
7605 if (context)
7606 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007607 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007608 }
7609 }
7610 catch(std::bad_alloc&)
7611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007612 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007613 }
7614}
7615
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007616// OpenGL ES 3.0 functions
7617
7618void __stdcall glReadBuffer(GLenum mode)
7619{
7620 EVENT("(GLenum mode = 0x%X)", mode);
7621
7622 try
7623 {
7624 gl::Context *context = gl::getNonLostContext();
7625
7626 if (context)
7627 {
7628 if (context->getClientVersion() < 3)
7629 {
7630 return gl::error(GL_INVALID_OPERATION);
7631 }
7632 }
7633
7634 UNIMPLEMENTED();
7635 }
7636 catch(std::bad_alloc&)
7637 {
7638 return gl::error(GL_OUT_OF_MEMORY);
7639 }
7640}
7641
7642void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7643{
7644 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7645 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7646
7647 try
7648 {
7649 gl::Context *context = gl::getNonLostContext();
7650
7651 if (context)
7652 {
7653 if (context->getClientVersion() < 3)
7654 {
7655 return gl::error(GL_INVALID_OPERATION);
7656 }
7657 }
7658
7659 UNIMPLEMENTED();
7660 }
7661 catch(std::bad_alloc&)
7662 {
7663 return gl::error(GL_OUT_OF_MEMORY);
7664 }
7665}
7666
7667void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7668{
7669 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7670 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7671 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7672 target, level, internalformat, width, height, depth, border, format, type, pixels);
7673
7674 try
7675 {
7676 gl::Context *context = gl::getNonLostContext();
7677
7678 if (context)
7679 {
7680 if (context->getClientVersion() < 3)
7681 {
7682 return gl::error(GL_INVALID_OPERATION);
7683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007684
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007685 // validateES3TexImageFormat sets the error code if there is an error
7686 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7687 0, 0, 0, width, height, depth, border, format, type))
7688 {
7689 return;
7690 }
7691
7692 switch(target)
7693 {
7694 case GL_TEXTURE_3D:
7695 {
7696 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007697 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007698 }
7699 break;
7700
7701 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007702 {
7703 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007704 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007705 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007706 break;
7707
7708 default:
7709 return gl::error(GL_INVALID_ENUM);
7710 }
7711 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007712 }
7713 catch(std::bad_alloc&)
7714 {
7715 return gl::error(GL_OUT_OF_MEMORY);
7716 }
7717}
7718
7719void __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)
7720{
7721 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7722 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7723 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7724 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7725
7726 try
7727 {
7728 gl::Context *context = gl::getNonLostContext();
7729
7730 if (context)
7731 {
7732 if (context->getClientVersion() < 3)
7733 {
7734 return gl::error(GL_INVALID_OPERATION);
7735 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007736
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007737 if (!pixels)
7738 {
7739 return gl::error(GL_INVALID_VALUE);
7740 }
7741
7742 // validateES3TexImageFormat sets the error code if there is an error
7743 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7744 xoffset, yoffset, zoffset, width, height, depth, 0,
7745 format, type))
7746 {
7747 return;
7748 }
7749
7750 switch(target)
7751 {
7752 case GL_TEXTURE_3D:
7753 {
7754 gl::Texture3D *texture = context->getTexture3D();
7755 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7756 }
7757 break;
7758
7759 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007760 {
7761 gl::Texture2DArray *texture = context->getTexture2DArray();
7762 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7763 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007764 break;
7765
7766 default:
7767 return gl::error(GL_INVALID_ENUM);
7768 }
7769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007770 }
7771 catch(std::bad_alloc&)
7772 {
7773 return gl::error(GL_OUT_OF_MEMORY);
7774 }
7775}
7776
7777void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7778{
7779 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7780 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7781 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7782
7783 try
7784 {
7785 gl::Context *context = gl::getNonLostContext();
7786
7787 if (context)
7788 {
7789 if (context->getClientVersion() < 3)
7790 {
7791 return gl::error(GL_INVALID_OPERATION);
7792 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007793
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007794 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7795 x, y, width, height))
7796 {
7797 return;
7798 }
7799
7800 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7801 gl::Texture *texture = NULL;
7802 switch (target)
7803 {
7804 case GL_TEXTURE_3D:
7805 texture = context->getTexture3D();
7806 break;
7807
7808 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007809 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007810 break;
7811
7812 default:
7813 return gl::error(GL_INVALID_ENUM);
7814 }
7815
7816 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7817 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007818 }
7819 catch(std::bad_alloc&)
7820 {
7821 return gl::error(GL_OUT_OF_MEMORY);
7822 }
7823}
7824
7825void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7826{
7827 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7828 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7829 "const GLvoid* data = 0x%0.8p)",
7830 target, level, internalformat, width, height, depth, border, imageSize, data);
7831
7832 try
7833 {
7834 gl::Context *context = gl::getNonLostContext();
7835
7836 if (context)
7837 {
7838 if (context->getClientVersion() < 3)
7839 {
7840 return gl::error(GL_INVALID_OPERATION);
7841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007842
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007843 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 +00007844 {
7845 return gl::error(GL_INVALID_VALUE);
7846 }
7847
7848 // validateES3TexImageFormat sets the error code if there is an error
7849 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7850 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7851 {
7852 return;
7853 }
7854
7855 switch(target)
7856 {
7857 case GL_TEXTURE_3D:
7858 {
7859 gl::Texture3D *texture = context->getTexture3D();
7860 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7861 }
7862 break;
7863
7864 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007865 {
7866 gl::Texture2DArray *texture = context->getTexture2DArray();
7867 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7868 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007869 break;
7870
7871 default:
7872 return gl::error(GL_INVALID_ENUM);
7873 }
7874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007875 }
7876 catch(std::bad_alloc&)
7877 {
7878 return gl::error(GL_OUT_OF_MEMORY);
7879 }
7880}
7881
7882void __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)
7883{
7884 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7885 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7886 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7887 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7888
7889 try
7890 {
7891 gl::Context *context = gl::getNonLostContext();
7892
7893 if (context)
7894 {
7895 if (context->getClientVersion() < 3)
7896 {
7897 return gl::error(GL_INVALID_OPERATION);
7898 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007899
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007900 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 +00007901 {
7902 return gl::error(GL_INVALID_VALUE);
7903 }
7904
7905 if (!data)
7906 {
7907 return gl::error(GL_INVALID_VALUE);
7908 }
7909
7910 // validateES3TexImageFormat sets the error code if there is an error
7911 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7912 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7913 {
7914 return;
7915 }
7916
7917 switch(target)
7918 {
7919 case GL_TEXTURE_3D:
7920 {
7921 gl::Texture3D *texture = context->getTexture3D();
7922 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7923 format, imageSize, data);
7924 }
7925 break;
7926
7927 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007928 {
7929 gl::Texture2DArray *texture = context->getTexture2DArray();
7930 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7931 format, imageSize, data);
7932 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007933 break;
7934
7935 default:
7936 return gl::error(GL_INVALID_ENUM);
7937 }
7938 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007939 }
7940 catch(std::bad_alloc&)
7941 {
7942 return gl::error(GL_OUT_OF_MEMORY);
7943 }
7944}
7945
7946void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7947{
7948 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7949
7950 try
7951 {
7952 gl::Context *context = gl::getNonLostContext();
7953
7954 if (context)
7955 {
7956 if (context->getClientVersion() < 3)
7957 {
7958 return gl::error(GL_INVALID_OPERATION);
7959 }
7960 }
7961
7962 UNIMPLEMENTED();
7963 }
7964 catch(std::bad_alloc&)
7965 {
7966 return gl::error(GL_OUT_OF_MEMORY);
7967 }
7968}
7969
7970void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7971{
7972 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7973
7974 try
7975 {
7976 gl::Context *context = gl::getNonLostContext();
7977
7978 if (context)
7979 {
7980 if (context->getClientVersion() < 3)
7981 {
7982 return gl::error(GL_INVALID_OPERATION);
7983 }
7984 }
7985
7986 UNIMPLEMENTED();
7987 }
7988 catch(std::bad_alloc&)
7989 {
7990 return gl::error(GL_OUT_OF_MEMORY);
7991 }
7992}
7993
7994GLboolean __stdcall glIsQuery(GLuint id)
7995{
7996 EVENT("(GLuint id = %u)", id);
7997
7998 try
7999 {
8000 gl::Context *context = gl::getNonLostContext();
8001
8002 if (context)
8003 {
8004 if (context->getClientVersion() < 3)
8005 {
8006 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8007 }
8008 }
8009
8010 UNIMPLEMENTED();
8011 }
8012 catch(std::bad_alloc&)
8013 {
8014 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8015 }
8016
8017 return GL_FALSE;
8018}
8019
8020void __stdcall glBeginQuery(GLenum target, GLuint id)
8021{
8022 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
8023
8024 try
8025 {
8026 gl::Context *context = gl::getNonLostContext();
8027
8028 if (context)
8029 {
8030 if (context->getClientVersion() < 3)
8031 {
8032 return gl::error(GL_INVALID_OPERATION);
8033 }
8034 }
8035
8036 UNIMPLEMENTED();
8037 }
8038 catch(std::bad_alloc&)
8039 {
8040 return gl::error(GL_OUT_OF_MEMORY);
8041 }
8042}
8043
8044void __stdcall glEndQuery(GLenum target)
8045{
8046 EVENT("(GLenum target = 0x%X)", target);
8047
8048 try
8049 {
8050 gl::Context *context = gl::getNonLostContext();
8051
8052 if (context)
8053 {
8054 if (context->getClientVersion() < 3)
8055 {
8056 return gl::error(GL_INVALID_OPERATION);
8057 }
8058 }
8059
8060 UNIMPLEMENTED();
8061 }
8062 catch(std::bad_alloc&)
8063 {
8064 return gl::error(GL_OUT_OF_MEMORY);
8065 }
8066}
8067
8068void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
8069{
8070 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
8071
8072 try
8073 {
8074 gl::Context *context = gl::getNonLostContext();
8075
8076 if (context)
8077 {
8078 if (context->getClientVersion() < 3)
8079 {
8080 return gl::error(GL_INVALID_OPERATION);
8081 }
8082 }
8083
8084 UNIMPLEMENTED();
8085 }
8086 catch(std::bad_alloc&)
8087 {
8088 return gl::error(GL_OUT_OF_MEMORY);
8089 }
8090}
8091
8092void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
8093{
8094 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
8095
8096 try
8097 {
8098 gl::Context *context = gl::getNonLostContext();
8099
8100 if (context)
8101 {
8102 if (context->getClientVersion() < 3)
8103 {
8104 return gl::error(GL_INVALID_OPERATION);
8105 }
8106 }
8107
8108 UNIMPLEMENTED();
8109 }
8110 catch(std::bad_alloc&)
8111 {
8112 return gl::error(GL_OUT_OF_MEMORY);
8113 }
8114}
8115
8116GLboolean __stdcall glUnmapBuffer(GLenum target)
8117{
8118 EVENT("(GLenum target = 0x%X)", target);
8119
8120 try
8121 {
8122 gl::Context *context = gl::getNonLostContext();
8123
8124 if (context)
8125 {
8126 if (context->getClientVersion() < 3)
8127 {
8128 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8129 }
8130 }
8131
8132 UNIMPLEMENTED();
8133 }
8134 catch(std::bad_alloc&)
8135 {
8136 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8137 }
8138
8139 return GL_FALSE;
8140}
8141
8142void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8143{
8144 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8145
8146 try
8147 {
8148 gl::Context *context = gl::getNonLostContext();
8149
8150 if (context)
8151 {
8152 if (context->getClientVersion() < 3)
8153 {
8154 return gl::error(GL_INVALID_OPERATION);
8155 }
8156 }
8157
8158 UNIMPLEMENTED();
8159 }
8160 catch(std::bad_alloc&)
8161 {
8162 return gl::error(GL_OUT_OF_MEMORY);
8163 }
8164}
8165
8166void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8167{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008168 try
8169 {
8170 gl::Context *context = gl::getNonLostContext();
8171
8172 if (context)
8173 {
8174 if (context->getClientVersion() < 3)
8175 {
8176 return gl::error(GL_INVALID_OPERATION);
8177 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008178
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008179 glDrawBuffersEXT(n, bufs);
8180 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008181 }
8182 catch(std::bad_alloc&)
8183 {
8184 return gl::error(GL_OUT_OF_MEMORY);
8185 }
8186}
8187
8188void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8189{
8190 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8191 location, count, transpose, value);
8192
8193 try
8194 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008195 if (count < 0)
8196 {
8197 return gl::error(GL_INVALID_VALUE);
8198 }
8199
8200 if (location == -1)
8201 {
8202 return;
8203 }
8204
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008205 gl::Context *context = gl::getNonLostContext();
8206
8207 if (context)
8208 {
8209 if (context->getClientVersion() < 3)
8210 {
8211 return gl::error(GL_INVALID_OPERATION);
8212 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008213
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008214 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8215 if (!programBinary)
8216 {
8217 return gl::error(GL_INVALID_OPERATION);
8218 }
8219
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008220 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008221 {
8222 return gl::error(GL_INVALID_OPERATION);
8223 }
8224 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008225 }
8226 catch(std::bad_alloc&)
8227 {
8228 return gl::error(GL_OUT_OF_MEMORY);
8229 }
8230}
8231
8232void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8233{
8234 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8235 location, count, transpose, value);
8236
8237 try
8238 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008239 if (count < 0)
8240 {
8241 return gl::error(GL_INVALID_VALUE);
8242 }
8243
8244 if (location == -1)
8245 {
8246 return;
8247 }
8248
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008249 gl::Context *context = gl::getNonLostContext();
8250
8251 if (context)
8252 {
8253 if (context->getClientVersion() < 3)
8254 {
8255 return gl::error(GL_INVALID_OPERATION);
8256 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008257
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008258 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8259 if (!programBinary)
8260 {
8261 return gl::error(GL_INVALID_OPERATION);
8262 }
8263
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008264 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
8268 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008269 }
8270 catch(std::bad_alloc&)
8271 {
8272 return gl::error(GL_OUT_OF_MEMORY);
8273 }
8274}
8275
8276void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8277{
8278 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8279 location, count, transpose, value);
8280
8281 try
8282 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008283 if (count < 0)
8284 {
8285 return gl::error(GL_INVALID_VALUE);
8286 }
8287
8288 if (location == -1)
8289 {
8290 return;
8291 }
8292
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008293 gl::Context *context = gl::getNonLostContext();
8294
8295 if (context)
8296 {
8297 if (context->getClientVersion() < 3)
8298 {
8299 return gl::error(GL_INVALID_OPERATION);
8300 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008301
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008302 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8303 if (!programBinary)
8304 {
8305 return gl::error(GL_INVALID_OPERATION);
8306 }
8307
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008308 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008309 {
8310 return gl::error(GL_INVALID_OPERATION);
8311 }
8312 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008313 }
8314 catch(std::bad_alloc&)
8315 {
8316 return gl::error(GL_OUT_OF_MEMORY);
8317 }
8318}
8319
8320void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8321{
8322 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8323 location, count, transpose, value);
8324
8325 try
8326 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008327 if (count < 0)
8328 {
8329 return gl::error(GL_INVALID_VALUE);
8330 }
8331
8332 if (location == -1)
8333 {
8334 return;
8335 }
8336
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008337 gl::Context *context = gl::getNonLostContext();
8338
8339 if (context)
8340 {
8341 if (context->getClientVersion() < 3)
8342 {
8343 return gl::error(GL_INVALID_OPERATION);
8344 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008345
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008346 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8347 if (!programBinary)
8348 {
8349 return gl::error(GL_INVALID_OPERATION);
8350 }
8351
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008352 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008353 {
8354 return gl::error(GL_INVALID_OPERATION);
8355 }
8356 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008357 }
8358 catch(std::bad_alloc&)
8359 {
8360 return gl::error(GL_OUT_OF_MEMORY);
8361 }
8362}
8363
8364void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8365{
8366 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8367 location, count, transpose, value);
8368
8369 try
8370 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008371 if (count < 0)
8372 {
8373 return gl::error(GL_INVALID_VALUE);
8374 }
8375
8376 if (location == -1)
8377 {
8378 return;
8379 }
8380
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008381 gl::Context *context = gl::getNonLostContext();
8382
8383 if (context)
8384 {
8385 if (context->getClientVersion() < 3)
8386 {
8387 return gl::error(GL_INVALID_OPERATION);
8388 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008389
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008390 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8391 if (!programBinary)
8392 {
8393 return gl::error(GL_INVALID_OPERATION);
8394 }
8395
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008396 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008397 {
8398 return gl::error(GL_INVALID_OPERATION);
8399 }
8400 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008401 }
8402 catch(std::bad_alloc&)
8403 {
8404 return gl::error(GL_OUT_OF_MEMORY);
8405 }
8406}
8407
8408void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8409{
8410 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8411 location, count, transpose, value);
8412
8413 try
8414 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008415 if (count < 0)
8416 {
8417 return gl::error(GL_INVALID_VALUE);
8418 }
8419
8420 if (location == -1)
8421 {
8422 return;
8423 }
8424
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008425 gl::Context *context = gl::getNonLostContext();
8426
8427 if (context)
8428 {
8429 if (context->getClientVersion() < 3)
8430 {
8431 return gl::error(GL_INVALID_OPERATION);
8432 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008433
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008434 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8435 if (!programBinary)
8436 {
8437 return gl::error(GL_INVALID_OPERATION);
8438 }
8439
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008440 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008441 {
8442 return gl::error(GL_INVALID_OPERATION);
8443 }
8444 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008445 }
8446 catch(std::bad_alloc&)
8447 {
8448 return gl::error(GL_OUT_OF_MEMORY);
8449 }
8450}
8451
8452void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8453{
8454 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8455 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8456 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8457
8458 try
8459 {
8460 gl::Context *context = gl::getNonLostContext();
8461
8462 if (context)
8463 {
8464 if (context->getClientVersion() < 3)
8465 {
8466 return gl::error(GL_INVALID_OPERATION);
8467 }
8468 }
8469
8470 UNIMPLEMENTED();
8471 }
8472 catch(std::bad_alloc&)
8473 {
8474 return gl::error(GL_OUT_OF_MEMORY);
8475 }
8476}
8477
8478void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8479{
8480 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8481 target, samples, internalformat, width, height);
8482
8483 try
8484 {
8485 gl::Context *context = gl::getNonLostContext();
8486
8487 if (context)
8488 {
8489 if (context->getClientVersion() < 3)
8490 {
8491 return gl::error(GL_INVALID_OPERATION);
8492 }
8493 }
8494
8495 UNIMPLEMENTED();
8496 }
8497 catch(std::bad_alloc&)
8498 {
8499 return gl::error(GL_OUT_OF_MEMORY);
8500 }
8501}
8502
8503void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8504{
8505 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8506 target, attachment, texture, level, layer);
8507
8508 try
8509 {
8510 gl::Context *context = gl::getNonLostContext();
8511
8512 if (context)
8513 {
8514 if (context->getClientVersion() < 3)
8515 {
8516 return gl::error(GL_INVALID_OPERATION);
8517 }
8518 }
8519
8520 UNIMPLEMENTED();
8521 }
8522 catch(std::bad_alloc&)
8523 {
8524 return gl::error(GL_OUT_OF_MEMORY);
8525 }
8526}
8527
8528GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8529{
8530 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8531 target, offset, length, access);
8532
8533 try
8534 {
8535 gl::Context *context = gl::getNonLostContext();
8536
8537 if (context)
8538 {
8539 if (context->getClientVersion() < 3)
8540 {
8541 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8542 }
8543 }
8544
8545 UNIMPLEMENTED();
8546 }
8547 catch(std::bad_alloc&)
8548 {
8549 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8550 }
8551
8552 return NULL;
8553}
8554
8555void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8556{
8557 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8558
8559 try
8560 {
8561 gl::Context *context = gl::getNonLostContext();
8562
8563 if (context)
8564 {
8565 if (context->getClientVersion() < 3)
8566 {
8567 return gl::error(GL_INVALID_OPERATION);
8568 }
8569 }
8570
8571 UNIMPLEMENTED();
8572 }
8573 catch(std::bad_alloc&)
8574 {
8575 return gl::error(GL_OUT_OF_MEMORY);
8576 }
8577}
8578
8579void __stdcall glBindVertexArray(GLuint array)
8580{
8581 EVENT("(GLuint array = %u)", array);
8582
8583 try
8584 {
8585 gl::Context *context = gl::getNonLostContext();
8586
8587 if (context)
8588 {
8589 if (context->getClientVersion() < 3)
8590 {
8591 return gl::error(GL_INVALID_OPERATION);
8592 }
8593 }
8594
8595 UNIMPLEMENTED();
8596 }
8597 catch(std::bad_alloc&)
8598 {
8599 return gl::error(GL_OUT_OF_MEMORY);
8600 }
8601}
8602
8603void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8604{
8605 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8606
8607 try
8608 {
8609 gl::Context *context = gl::getNonLostContext();
8610
8611 if (context)
8612 {
8613 if (context->getClientVersion() < 3)
8614 {
8615 return gl::error(GL_INVALID_OPERATION);
8616 }
8617 }
8618
8619 UNIMPLEMENTED();
8620 }
8621 catch(std::bad_alloc&)
8622 {
8623 return gl::error(GL_OUT_OF_MEMORY);
8624 }
8625}
8626
8627void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8628{
8629 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8630
8631 try
8632 {
8633 gl::Context *context = gl::getNonLostContext();
8634
8635 if (context)
8636 {
8637 if (context->getClientVersion() < 3)
8638 {
8639 return gl::error(GL_INVALID_OPERATION);
8640 }
8641 }
8642
8643 UNIMPLEMENTED();
8644 }
8645 catch(std::bad_alloc&)
8646 {
8647 return gl::error(GL_OUT_OF_MEMORY);
8648 }
8649}
8650
8651GLboolean __stdcall glIsVertexArray(GLuint array)
8652{
8653 EVENT("(GLuint array = %u)", array);
8654
8655 try
8656 {
8657 gl::Context *context = gl::getNonLostContext();
8658
8659 if (context)
8660 {
8661 if (context->getClientVersion() < 3)
8662 {
8663 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8664 }
8665 }
8666
8667 UNIMPLEMENTED();
8668 }
8669 catch(std::bad_alloc&)
8670 {
8671 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8672 }
8673
8674 return GL_FALSE;
8675}
8676
8677void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8678{
8679 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8680 target, index, data);
8681
8682 try
8683 {
8684 gl::Context *context = gl::getNonLostContext();
8685
8686 if (context)
8687 {
8688 if (context->getClientVersion() < 3)
8689 {
8690 return gl::error(GL_INVALID_OPERATION);
8691 }
8692 }
8693
8694 UNIMPLEMENTED();
8695 }
8696 catch(std::bad_alloc&)
8697 {
8698 return gl::error(GL_OUT_OF_MEMORY);
8699 }
8700}
8701
8702void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8703{
8704 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8705
8706 try
8707 {
8708 gl::Context *context = gl::getNonLostContext();
8709
8710 if (context)
8711 {
8712 if (context->getClientVersion() < 3)
8713 {
8714 return gl::error(GL_INVALID_OPERATION);
8715 }
8716 }
8717
8718 UNIMPLEMENTED();
8719 }
8720 catch(std::bad_alloc&)
8721 {
8722 return gl::error(GL_OUT_OF_MEMORY);
8723 }
8724}
8725
8726void __stdcall glEndTransformFeedback(void)
8727{
8728 EVENT("(void)");
8729
8730 try
8731 {
8732 gl::Context *context = gl::getNonLostContext();
8733
8734 if (context)
8735 {
8736 if (context->getClientVersion() < 3)
8737 {
8738 return gl::error(GL_INVALID_OPERATION);
8739 }
8740 }
8741
8742 UNIMPLEMENTED();
8743 }
8744 catch(std::bad_alloc&)
8745 {
8746 return gl::error(GL_OUT_OF_MEMORY);
8747 }
8748}
8749
8750void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8751{
8752 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8753 target, index, buffer, offset, size);
8754
8755 try
8756 {
8757 gl::Context *context = gl::getNonLostContext();
8758
8759 if (context)
8760 {
8761 if (context->getClientVersion() < 3)
8762 {
8763 return gl::error(GL_INVALID_OPERATION);
8764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008765
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008766 switch (target)
8767 {
8768 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008769 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008770 {
8771 return gl::error(GL_INVALID_VALUE);
8772 }
8773 break;
8774
8775 case GL_UNIFORM_BUFFER:
8776 if (index >= context->getMaximumCombinedUniformBufferBindings())
8777 {
8778 return gl::error(GL_INVALID_VALUE);
8779 }
8780 break;
8781
8782 default:
8783 return gl::error(GL_INVALID_ENUM);
8784 }
8785
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008786 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008787 {
8788 return gl::error(GL_INVALID_VALUE);
8789 }
8790
8791 switch (target)
8792 {
8793 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008794
8795 // size and offset must be a multiple of 4
8796 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8797 {
8798 return gl::error(GL_INVALID_VALUE);
8799 }
8800
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008801 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8802 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008803 break;
8804
8805 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008806
8807 // it is an error to bind an offset not a multiple of the alignment
8808 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8809 {
8810 return gl::error(GL_INVALID_VALUE);
8811 }
8812
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008813 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8814 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008815 break;
8816
8817 default:
8818 UNREACHABLE();
8819 }
8820 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008821 }
8822 catch(std::bad_alloc&)
8823 {
8824 return gl::error(GL_OUT_OF_MEMORY);
8825 }
8826}
8827
8828void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8829{
8830 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8831 target, index, buffer);
8832
8833 try
8834 {
8835 gl::Context *context = gl::getNonLostContext();
8836
8837 if (context)
8838 {
8839 if (context->getClientVersion() < 3)
8840 {
8841 return gl::error(GL_INVALID_OPERATION);
8842 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008843
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008844 switch (target)
8845 {
8846 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008847 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008848 {
8849 return gl::error(GL_INVALID_VALUE);
8850 }
8851 break;
8852
8853 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008854 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008855 {
8856 return gl::error(GL_INVALID_VALUE);
8857 }
8858 break;
8859
8860 default:
8861 return gl::error(GL_INVALID_ENUM);
8862 }
8863
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008864 switch (target)
8865 {
8866 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008867 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008868 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008869 break;
8870
8871 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008872 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008873 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008874 break;
8875
8876 default:
8877 UNREACHABLE();
8878 }
8879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008880 }
8881 catch(std::bad_alloc&)
8882 {
8883 return gl::error(GL_OUT_OF_MEMORY);
8884 }
8885}
8886
8887void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8888{
8889 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8890 program, count, varyings, bufferMode);
8891
8892 try
8893 {
8894 gl::Context *context = gl::getNonLostContext();
8895
8896 if (context)
8897 {
8898 if (context->getClientVersion() < 3)
8899 {
8900 return gl::error(GL_INVALID_OPERATION);
8901 }
8902 }
8903
8904 UNIMPLEMENTED();
8905 }
8906 catch(std::bad_alloc&)
8907 {
8908 return gl::error(GL_OUT_OF_MEMORY);
8909 }
8910}
8911
8912void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8913{
8914 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8915 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8916 program, index, bufSize, length, size, type, name);
8917
8918 try
8919 {
8920 gl::Context *context = gl::getNonLostContext();
8921
8922 if (context)
8923 {
8924 if (context->getClientVersion() < 3)
8925 {
8926 return gl::error(GL_INVALID_OPERATION);
8927 }
8928 }
8929
8930 UNIMPLEMENTED();
8931 }
8932 catch(std::bad_alloc&)
8933 {
8934 return gl::error(GL_OUT_OF_MEMORY);
8935 }
8936}
8937
8938void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8939{
8940 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8941 index, size, type, stride, pointer);
8942
8943 try
8944 {
8945 gl::Context *context = gl::getNonLostContext();
8946
8947 if (context)
8948 {
8949 if (context->getClientVersion() < 3)
8950 {
8951 return gl::error(GL_INVALID_OPERATION);
8952 }
8953 }
8954
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008955 if (index >= gl::MAX_VERTEX_ATTRIBS)
8956 {
8957 return gl::error(GL_INVALID_VALUE);
8958 }
8959
8960 if (size < 1 || size > 4)
8961 {
8962 return gl::error(GL_INVALID_VALUE);
8963 }
8964
8965 switch (type)
8966 {
8967 case GL_BYTE:
8968 case GL_UNSIGNED_BYTE:
8969 case GL_SHORT:
8970 case GL_UNSIGNED_SHORT:
8971 case GL_INT:
8972 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008973 case GL_INT_2_10_10_10_REV:
8974 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008975 break;
8976 default:
8977 return gl::error(GL_INVALID_ENUM);
8978 }
8979
8980 if (stride < 0)
8981 {
8982 return gl::error(GL_INVALID_VALUE);
8983 }
8984
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008985 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8986 {
8987 return gl::error(GL_INVALID_OPERATION);
8988 }
8989
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008990 if (context)
8991 {
8992 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8993 stride, pointer);
8994 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008995 }
8996 catch(std::bad_alloc&)
8997 {
8998 return gl::error(GL_OUT_OF_MEMORY);
8999 }
9000}
9001
9002void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
9003{
9004 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9005 index, pname, params);
9006
9007 try
9008 {
9009 gl::Context *context = gl::getNonLostContext();
9010
9011 if (context)
9012 {
9013 if (context->getClientVersion() < 3)
9014 {
9015 return gl::error(GL_INVALID_OPERATION);
9016 }
9017 }
9018
9019 UNIMPLEMENTED();
9020 }
9021 catch(std::bad_alloc&)
9022 {
9023 return gl::error(GL_OUT_OF_MEMORY);
9024 }
9025}
9026
9027void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
9028{
9029 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
9030 index, pname, params);
9031
9032 try
9033 {
9034 gl::Context *context = gl::getNonLostContext();
9035
9036 if (context)
9037 {
9038 if (context->getClientVersion() < 3)
9039 {
9040 return gl::error(GL_INVALID_OPERATION);
9041 }
9042 }
9043
9044 UNIMPLEMENTED();
9045 }
9046 catch(std::bad_alloc&)
9047 {
9048 return gl::error(GL_OUT_OF_MEMORY);
9049 }
9050}
9051
9052void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
9053{
9054 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
9055 index, x, y, z, w);
9056
9057 try
9058 {
9059 gl::Context *context = gl::getNonLostContext();
9060
9061 if (context)
9062 {
9063 if (context->getClientVersion() < 3)
9064 {
9065 return gl::error(GL_INVALID_OPERATION);
9066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009067
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009068 if (index >= gl::MAX_VERTEX_ATTRIBS)
9069 {
9070 return gl::error(GL_INVALID_VALUE);
9071 }
9072
9073 GLint vals[4] = { x, y, z, w };
9074 context->setVertexAttribi(index, vals);
9075 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009076 }
9077 catch(std::bad_alloc&)
9078 {
9079 return gl::error(GL_OUT_OF_MEMORY);
9080 }
9081}
9082
9083void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
9084{
9085 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
9086 index, x, y, z, w);
9087
9088 try
9089 {
9090 gl::Context *context = gl::getNonLostContext();
9091
9092 if (context)
9093 {
9094 if (context->getClientVersion() < 3)
9095 {
9096 return gl::error(GL_INVALID_OPERATION);
9097 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009098
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009099 if (index >= gl::MAX_VERTEX_ATTRIBS)
9100 {
9101 return gl::error(GL_INVALID_VALUE);
9102 }
9103
9104 GLuint vals[4] = { x, y, z, w };
9105 context->setVertexAttribu(index, vals);
9106 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009107 }
9108 catch(std::bad_alloc&)
9109 {
9110 return gl::error(GL_OUT_OF_MEMORY);
9111 }
9112}
9113
9114void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9115{
9116 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9117
9118 try
9119 {
9120 gl::Context *context = gl::getNonLostContext();
9121
9122 if (context)
9123 {
9124 if (context->getClientVersion() < 3)
9125 {
9126 return gl::error(GL_INVALID_OPERATION);
9127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009128
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009129 if (index >= gl::MAX_VERTEX_ATTRIBS)
9130 {
9131 return gl::error(GL_INVALID_VALUE);
9132 }
9133
9134 context->setVertexAttribi(index, v);
9135 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009136 }
9137 catch(std::bad_alloc&)
9138 {
9139 return gl::error(GL_OUT_OF_MEMORY);
9140 }
9141}
9142
9143void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9144{
9145 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9146
9147 try
9148 {
9149 gl::Context *context = gl::getNonLostContext();
9150
9151 if (context)
9152 {
9153 if (context->getClientVersion() < 3)
9154 {
9155 return gl::error(GL_INVALID_OPERATION);
9156 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009157
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009158 if (index >= gl::MAX_VERTEX_ATTRIBS)
9159 {
9160 return gl::error(GL_INVALID_VALUE);
9161 }
9162
9163 context->setVertexAttribu(index, v);
9164 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009165 }
9166 catch(std::bad_alloc&)
9167 {
9168 return gl::error(GL_OUT_OF_MEMORY);
9169 }
9170}
9171
9172void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9173{
9174 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9175 program, location, params);
9176
9177 try
9178 {
9179 gl::Context *context = gl::getNonLostContext();
9180
9181 if (context)
9182 {
9183 if (context->getClientVersion() < 3)
9184 {
9185 return gl::error(GL_INVALID_OPERATION);
9186 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009187
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009188 if (program == 0)
9189 {
9190 return gl::error(GL_INVALID_VALUE);
9191 }
9192
9193 gl::Program *programObject = context->getProgram(program);
9194
9195 if (!programObject || !programObject->isLinked())
9196 {
9197 return gl::error(GL_INVALID_OPERATION);
9198 }
9199
9200 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9201 if (!programBinary)
9202 {
9203 return gl::error(GL_INVALID_OPERATION);
9204 }
9205
9206 if (!programBinary->getUniformuiv(location, NULL, params))
9207 {
9208 return gl::error(GL_INVALID_OPERATION);
9209 }
9210 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009211 }
9212 catch(std::bad_alloc&)
9213 {
9214 return gl::error(GL_OUT_OF_MEMORY);
9215 }
9216}
9217
9218GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9219{
9220 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9221 program, name);
9222
9223 try
9224 {
9225 gl::Context *context = gl::getNonLostContext();
9226
9227 if (context)
9228 {
9229 if (context->getClientVersion() < 3)
9230 {
9231 return gl::error(GL_INVALID_OPERATION, 0);
9232 }
9233 }
9234
9235 UNIMPLEMENTED();
9236 }
9237 catch(std::bad_alloc&)
9238 {
9239 return gl::error(GL_OUT_OF_MEMORY, 0);
9240 }
9241
9242 return 0;
9243}
9244
9245void __stdcall glUniform1ui(GLint location, GLuint v0)
9246{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009247 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009248}
9249
9250void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9251{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009252 const GLuint xy[] = { v0, v1 };
9253 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009254}
9255
9256void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9257{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009258 const GLuint xyz[] = { v0, v1, v2 };
9259 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009260}
9261
9262void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9263{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009264 const GLuint xyzw[] = { v0, v1, v2, v3 };
9265 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009266}
9267
9268void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9269{
9270 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9271 location, count, value);
9272
9273 try
9274 {
9275 gl::Context *context = gl::getNonLostContext();
9276
9277 if (context)
9278 {
9279 if (context->getClientVersion() < 3)
9280 {
9281 return gl::error(GL_INVALID_OPERATION);
9282 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009283
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009284 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9285 if (!programBinary)
9286 {
9287 return gl::error(GL_INVALID_OPERATION);
9288 }
9289
9290 if (!programBinary->setUniform1uiv(location, count, value))
9291 {
9292 return gl::error(GL_INVALID_OPERATION);
9293 }
9294 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009295 }
9296 catch(std::bad_alloc&)
9297 {
9298 return gl::error(GL_OUT_OF_MEMORY);
9299 }
9300}
9301
9302void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9303{
9304 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9305 location, count, value);
9306
9307 try
9308 {
9309 gl::Context *context = gl::getNonLostContext();
9310
9311 if (context)
9312 {
9313 if (context->getClientVersion() < 3)
9314 {
9315 return gl::error(GL_INVALID_OPERATION);
9316 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009317
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009318 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9319 if (!programBinary)
9320 {
9321 return gl::error(GL_INVALID_OPERATION);
9322 }
9323
9324 if (!programBinary->setUniform2uiv(location, count, value))
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
9328 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009329 }
9330 catch(std::bad_alloc&)
9331 {
9332 return gl::error(GL_OUT_OF_MEMORY);
9333 }
9334}
9335
9336void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9337{
9338 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9339 location, count, value);
9340
9341 try
9342 {
9343 gl::Context *context = gl::getNonLostContext();
9344
9345 if (context)
9346 {
9347 if (context->getClientVersion() < 3)
9348 {
9349 return gl::error(GL_INVALID_OPERATION);
9350 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009351
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009352 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9353 if (!programBinary)
9354 {
9355 return gl::error(GL_INVALID_OPERATION);
9356 }
9357
9358 if (!programBinary->setUniform3uiv(location, count, value))
9359 {
9360 return gl::error(GL_INVALID_OPERATION);
9361 }
9362 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009363 }
9364 catch(std::bad_alloc&)
9365 {
9366 return gl::error(GL_OUT_OF_MEMORY);
9367 }
9368}
9369
9370void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9371{
9372 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9373 location, count, value);
9374
9375 try
9376 {
9377 gl::Context *context = gl::getNonLostContext();
9378
9379 if (context)
9380 {
9381 if (context->getClientVersion() < 3)
9382 {
9383 return gl::error(GL_INVALID_OPERATION);
9384 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009385
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009386 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9387 if (!programBinary)
9388 {
9389 return gl::error(GL_INVALID_OPERATION);
9390 }
9391
9392 if (!programBinary->setUniform4uiv(location, count, value))
9393 {
9394 return gl::error(GL_INVALID_OPERATION);
9395 }
9396 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009397 }
9398 catch(std::bad_alloc&)
9399 {
9400 return gl::error(GL_OUT_OF_MEMORY);
9401 }
9402}
9403
9404void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9405{
9406 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9407 buffer, drawbuffer, value);
9408
9409 try
9410 {
9411 gl::Context *context = gl::getNonLostContext();
9412
9413 if (context)
9414 {
9415 if (context->getClientVersion() < 3)
9416 {
9417 return gl::error(GL_INVALID_OPERATION);
9418 }
9419 }
9420
9421 UNIMPLEMENTED();
9422 }
9423 catch(std::bad_alloc&)
9424 {
9425 return gl::error(GL_OUT_OF_MEMORY);
9426 }
9427}
9428
9429void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9430{
9431 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9432 buffer, drawbuffer, value);
9433
9434 try
9435 {
9436 gl::Context *context = gl::getNonLostContext();
9437
9438 if (context)
9439 {
9440 if (context->getClientVersion() < 3)
9441 {
9442 return gl::error(GL_INVALID_OPERATION);
9443 }
9444 }
9445
9446 UNIMPLEMENTED();
9447 }
9448 catch(std::bad_alloc&)
9449 {
9450 return gl::error(GL_OUT_OF_MEMORY);
9451 }
9452}
9453
9454void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9455{
9456 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9457 buffer, drawbuffer, value);
9458
9459 try
9460 {
9461 gl::Context *context = gl::getNonLostContext();
9462
9463 if (context)
9464 {
9465 if (context->getClientVersion() < 3)
9466 {
9467 return gl::error(GL_INVALID_OPERATION);
9468 }
9469 }
9470
9471 UNIMPLEMENTED();
9472 }
9473 catch(std::bad_alloc&)
9474 {
9475 return gl::error(GL_OUT_OF_MEMORY);
9476 }
9477}
9478
9479void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9480{
9481 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9482 buffer, drawbuffer, depth, stencil);
9483
9484 try
9485 {
9486 gl::Context *context = gl::getNonLostContext();
9487
9488 if (context)
9489 {
9490 if (context->getClientVersion() < 3)
9491 {
9492 return gl::error(GL_INVALID_OPERATION);
9493 }
9494 }
9495
9496 UNIMPLEMENTED();
9497 }
9498 catch(std::bad_alloc&)
9499 {
9500 return gl::error(GL_OUT_OF_MEMORY);
9501 }
9502}
9503
9504const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9505{
9506 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9507
9508 try
9509 {
9510 gl::Context *context = gl::getNonLostContext();
9511
9512 if (context)
9513 {
9514 if (context->getClientVersion() < 3)
9515 {
9516 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9517 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009518
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009519 if (name != GL_EXTENSIONS)
9520 {
9521 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9522 }
9523
9524 if (index >= context->getNumExtensions())
9525 {
9526 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9527 }
9528
9529 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9530 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009531 }
9532 catch(std::bad_alloc&)
9533 {
9534 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9535 }
9536
9537 return NULL;
9538}
9539
9540void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9541{
9542 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9543 readTarget, writeTarget, readOffset, writeOffset, size);
9544
9545 try
9546 {
9547 gl::Context *context = gl::getNonLostContext();
9548
9549 if (context)
9550 {
9551 if (context->getClientVersion() < 3)
9552 {
9553 return gl::error(GL_INVALID_OPERATION);
9554 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009555
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009556 gl::Buffer *readBuffer = NULL;
9557 switch (readTarget)
9558 {
9559 case GL_ARRAY_BUFFER:
9560 readBuffer = context->getArrayBuffer();
9561 break;
9562 case GL_COPY_READ_BUFFER:
9563 readBuffer = context->getCopyReadBuffer();
9564 break;
9565 case GL_COPY_WRITE_BUFFER:
9566 readBuffer = context->getCopyWriteBuffer();
9567 break;
9568 case GL_ELEMENT_ARRAY_BUFFER:
9569 readBuffer = context->getElementArrayBuffer();
9570 break;
9571 case GL_PIXEL_PACK_BUFFER:
9572 readBuffer = context->getPixelPackBuffer();
9573 break;
9574 case GL_PIXEL_UNPACK_BUFFER:
9575 readBuffer = context->getPixelUnpackBuffer();
9576 break;
9577 case GL_TRANSFORM_FEEDBACK_BUFFER:
9578 readBuffer = context->getGenericTransformFeedbackBuffer();
9579 break;
9580 case GL_UNIFORM_BUFFER:
9581 readBuffer = context->getGenericUniformBuffer();
9582 break;
9583 default:
9584 return gl::error(GL_INVALID_ENUM);
9585 }
9586
9587 gl::Buffer *writeBuffer = NULL;
9588 switch (writeTarget)
9589 {
9590 case GL_ARRAY_BUFFER:
9591 writeBuffer = context->getArrayBuffer();
9592 break;
9593 case GL_COPY_READ_BUFFER:
9594 writeBuffer = context->getCopyReadBuffer();
9595 break;
9596 case GL_COPY_WRITE_BUFFER:
9597 writeBuffer = context->getCopyWriteBuffer();
9598 break;
9599 case GL_ELEMENT_ARRAY_BUFFER:
9600 writeBuffer = context->getElementArrayBuffer();
9601 break;
9602 case GL_PIXEL_PACK_BUFFER:
9603 writeBuffer = context->getPixelPackBuffer();
9604 break;
9605 case GL_PIXEL_UNPACK_BUFFER:
9606 writeBuffer = context->getPixelUnpackBuffer();
9607 break;
9608 case GL_TRANSFORM_FEEDBACK_BUFFER:
9609 writeBuffer = context->getGenericTransformFeedbackBuffer();
9610 break;
9611 case GL_UNIFORM_BUFFER:
9612 writeBuffer = context->getGenericUniformBuffer();
9613 break;
9614 default:
9615 return gl::error(GL_INVALID_ENUM);
9616 }
9617
9618 if (!readBuffer || !writeBuffer)
9619 {
9620 return gl::error(GL_INVALID_OPERATION);
9621 }
9622
9623 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9624 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9625 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9626 {
9627 return gl::error(GL_INVALID_VALUE);
9628 }
9629
9630 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9631 {
9632 return gl::error(GL_INVALID_VALUE);
9633 }
9634
9635 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9636
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009637 // if size is zero, the copy is a successful no-op
9638 if (size > 0)
9639 {
9640 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9641 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009642 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009643 }
9644 catch(std::bad_alloc&)
9645 {
9646 return gl::error(GL_OUT_OF_MEMORY);
9647 }
9648}
9649
9650void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9651{
9652 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9653 program, uniformCount, uniformNames, uniformIndices);
9654
9655 try
9656 {
9657 gl::Context *context = gl::getNonLostContext();
9658
9659 if (context)
9660 {
9661 if (context->getClientVersion() < 3)
9662 {
9663 return gl::error(GL_INVALID_OPERATION);
9664 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009665
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009666 if (uniformCount < 0)
9667 {
9668 return gl::error(GL_INVALID_VALUE);
9669 }
9670
9671 gl::Program *programObject = context->getProgram(program);
9672
9673 if (!programObject)
9674 {
9675 if (context->getShader(program))
9676 {
9677 return gl::error(GL_INVALID_OPERATION);
9678 }
9679 else
9680 {
9681 return gl::error(GL_INVALID_VALUE);
9682 }
9683 }
9684
9685 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9686 if (!programObject->isLinked() || !programBinary)
9687 {
9688 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9689 {
9690 uniformIndices[uniformId] = GL_INVALID_INDEX;
9691 }
9692 }
9693 else
9694 {
9695 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9696 {
9697 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9698 }
9699 }
9700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009701 }
9702 catch(std::bad_alloc&)
9703 {
9704 return gl::error(GL_OUT_OF_MEMORY);
9705 }
9706}
9707
9708void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9709{
9710 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9711 program, uniformCount, uniformIndices, pname, params);
9712
9713 try
9714 {
9715 gl::Context *context = gl::getNonLostContext();
9716
9717 if (context)
9718 {
9719 if (context->getClientVersion() < 3)
9720 {
9721 return gl::error(GL_INVALID_OPERATION);
9722 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009723
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009724 if (uniformCount < 0)
9725 {
9726 return gl::error(GL_INVALID_VALUE);
9727 }
9728
9729 gl::Program *programObject = context->getProgram(program);
9730
9731 if (!programObject)
9732 {
9733 if (context->getShader(program))
9734 {
9735 return gl::error(GL_INVALID_OPERATION);
9736 }
9737 else
9738 {
9739 return gl::error(GL_INVALID_VALUE);
9740 }
9741 }
9742
9743 switch (pname)
9744 {
9745 case GL_UNIFORM_TYPE:
9746 case GL_UNIFORM_SIZE:
9747 case GL_UNIFORM_NAME_LENGTH:
9748 case GL_UNIFORM_BLOCK_INDEX:
9749 case GL_UNIFORM_OFFSET:
9750 case GL_UNIFORM_ARRAY_STRIDE:
9751 case GL_UNIFORM_MATRIX_STRIDE:
9752 case GL_UNIFORM_IS_ROW_MAJOR:
9753 break;
9754 default:
9755 return gl::error(GL_INVALID_ENUM);
9756 }
9757
9758 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9759
9760 if (!programBinary && uniformCount > 0)
9761 {
9762 return gl::error(GL_INVALID_VALUE);
9763 }
9764
9765 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9766 {
9767 const GLuint index = uniformIndices[uniformId];
9768
9769 if (index >= (GLuint)programBinary->getActiveUniformCount())
9770 {
9771 return gl::error(GL_INVALID_VALUE);
9772 }
9773 }
9774
9775 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9776 {
9777 const GLuint index = uniformIndices[uniformId];
9778 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9779 }
9780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009781 }
9782 catch(std::bad_alloc&)
9783 {
9784 return gl::error(GL_OUT_OF_MEMORY);
9785 }
9786}
9787
9788GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9789{
9790 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9791
9792 try
9793 {
9794 gl::Context *context = gl::getNonLostContext();
9795
9796 if (context)
9797 {
9798 if (context->getClientVersion() < 3)
9799 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009800 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009802
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009803 gl::Program *programObject = context->getProgram(program);
9804
9805 if (!programObject)
9806 {
9807 if (context->getShader(program))
9808 {
9809 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9810 }
9811 else
9812 {
9813 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9814 }
9815 }
9816
9817 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9818 if (!programBinary)
9819 {
9820 return GL_INVALID_INDEX;
9821 }
9822
9823 return programBinary->getUniformBlockIndex(uniformBlockName);
9824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009825 }
9826 catch(std::bad_alloc&)
9827 {
9828 return gl::error(GL_OUT_OF_MEMORY, 0);
9829 }
9830
9831 return 0;
9832}
9833
9834void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9835{
9836 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9837 program, uniformBlockIndex, pname, params);
9838
9839 try
9840 {
9841 gl::Context *context = gl::getNonLostContext();
9842
9843 if (context)
9844 {
9845 if (context->getClientVersion() < 3)
9846 {
9847 return gl::error(GL_INVALID_OPERATION);
9848 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009849 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009850
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009851 if (!programObject)
9852 {
9853 if (context->getShader(program))
9854 {
9855 return gl::error(GL_INVALID_OPERATION);
9856 }
9857 else
9858 {
9859 return gl::error(GL_INVALID_VALUE);
9860 }
9861 }
9862
9863 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9864
9865 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9866 {
9867 return gl::error(GL_INVALID_VALUE);
9868 }
9869
9870 switch (pname)
9871 {
9872 case GL_UNIFORM_BLOCK_BINDING:
9873 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9874 break;
9875
9876 case GL_UNIFORM_BLOCK_DATA_SIZE:
9877 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9878 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9879 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9880 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9881 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9882 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9883 break;
9884
9885 default:
9886 return gl::error(GL_INVALID_ENUM);
9887 }
9888 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009889 }
9890 catch(std::bad_alloc&)
9891 {
9892 return gl::error(GL_OUT_OF_MEMORY);
9893 }
9894}
9895
9896void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9897{
9898 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9899 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9900
9901 try
9902 {
9903 gl::Context *context = gl::getNonLostContext();
9904
9905 if (context)
9906 {
9907 if (context->getClientVersion() < 3)
9908 {
9909 return gl::error(GL_INVALID_OPERATION);
9910 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009911
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009912 gl::Program *programObject = context->getProgram(program);
9913
9914 if (!programObject)
9915 {
9916 if (context->getShader(program))
9917 {
9918 return gl::error(GL_INVALID_OPERATION);
9919 }
9920 else
9921 {
9922 return gl::error(GL_INVALID_VALUE);
9923 }
9924 }
9925
9926 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9927
9928 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9929 {
9930 return gl::error(GL_INVALID_VALUE);
9931 }
9932
9933 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
9934 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009935 }
9936 catch(std::bad_alloc&)
9937 {
9938 return gl::error(GL_OUT_OF_MEMORY);
9939 }
9940}
9941
9942void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9943{
9944 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9945 program, uniformBlockIndex, uniformBlockBinding);
9946
9947 try
9948 {
9949 gl::Context *context = gl::getNonLostContext();
9950
9951 if (context)
9952 {
9953 if (context->getClientVersion() < 3)
9954 {
9955 return gl::error(GL_INVALID_OPERATION);
9956 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009957
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00009958 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
9959 {
9960 return gl::error(GL_INVALID_VALUE);
9961 }
9962
9963 gl::Program *programObject = context->getProgram(program);
9964
9965 if (!programObject)
9966 {
9967 if (context->getShader(program))
9968 {
9969 return gl::error(GL_INVALID_OPERATION);
9970 }
9971 else
9972 {
9973 return gl::error(GL_INVALID_VALUE);
9974 }
9975 }
9976
9977 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9978
9979 // if never linked, there won't be any uniform blocks
9980 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9981 {
9982 return gl::error(GL_INVALID_VALUE);
9983 }
9984
9985 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009987 }
9988 catch(std::bad_alloc&)
9989 {
9990 return gl::error(GL_OUT_OF_MEMORY);
9991 }
9992}
9993
9994void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9995{
9996 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9997 mode, first, count, instanceCount);
9998
9999 try
10000 {
10001 gl::Context *context = gl::getNonLostContext();
10002
10003 if (context)
10004 {
10005 if (context->getClientVersion() < 3)
10006 {
10007 return gl::error(GL_INVALID_OPERATION);
10008 }
10009 }
10010
10011 UNIMPLEMENTED();
10012 }
10013 catch(std::bad_alloc&)
10014 {
10015 return gl::error(GL_OUT_OF_MEMORY);
10016 }
10017}
10018
10019void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
10020{
10021 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
10022 mode, count, type, indices, instanceCount);
10023
10024 try
10025 {
10026 gl::Context *context = gl::getNonLostContext();
10027
10028 if (context)
10029 {
10030 if (context->getClientVersion() < 3)
10031 {
10032 return gl::error(GL_INVALID_OPERATION);
10033 }
10034 }
10035
10036 UNIMPLEMENTED();
10037 }
10038 catch(std::bad_alloc&)
10039 {
10040 return gl::error(GL_OUT_OF_MEMORY);
10041 }
10042}
10043
10044GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
10045{
10046 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
10047
10048 try
10049 {
10050 gl::Context *context = gl::getNonLostContext();
10051
10052 if (context)
10053 {
10054 if (context->getClientVersion() < 3)
10055 {
10056 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
10057 }
10058 }
10059
10060 UNIMPLEMENTED();
10061 }
10062 catch(std::bad_alloc&)
10063 {
10064 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
10065 }
10066
10067 return NULL;
10068}
10069
10070GLboolean __stdcall glIsSync(GLsync sync)
10071{
10072 EVENT("(GLsync sync = 0x%0.8p)", sync);
10073
10074 try
10075 {
10076 gl::Context *context = gl::getNonLostContext();
10077
10078 if (context)
10079 {
10080 if (context->getClientVersion() < 3)
10081 {
10082 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10083 }
10084 }
10085
10086 UNIMPLEMENTED();
10087 }
10088 catch(std::bad_alloc&)
10089 {
10090 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10091 }
10092
10093 return GL_FALSE;
10094}
10095
10096void __stdcall glDeleteSync(GLsync sync)
10097{
10098 EVENT("(GLsync sync = 0x%0.8p)", sync);
10099
10100 try
10101 {
10102 gl::Context *context = gl::getNonLostContext();
10103
10104 if (context)
10105 {
10106 if (context->getClientVersion() < 3)
10107 {
10108 return gl::error(GL_INVALID_OPERATION);
10109 }
10110 }
10111
10112 UNIMPLEMENTED();
10113 }
10114 catch(std::bad_alloc&)
10115 {
10116 return gl::error(GL_OUT_OF_MEMORY);
10117 }
10118}
10119
10120GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10121{
10122 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10123 sync, flags, timeout);
10124
10125 try
10126 {
10127 gl::Context *context = gl::getNonLostContext();
10128
10129 if (context)
10130 {
10131 if (context->getClientVersion() < 3)
10132 {
10133 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10134 }
10135 }
10136
10137 UNIMPLEMENTED();
10138 }
10139 catch(std::bad_alloc&)
10140 {
10141 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10142 }
10143
10144 return GL_FALSE;
10145}
10146
10147void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10148{
10149 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10150 sync, flags, timeout);
10151
10152 try
10153 {
10154 gl::Context *context = gl::getNonLostContext();
10155
10156 if (context)
10157 {
10158 if (context->getClientVersion() < 3)
10159 {
10160 return gl::error(GL_INVALID_OPERATION);
10161 }
10162 }
10163
10164 UNIMPLEMENTED();
10165 }
10166 catch(std::bad_alloc&)
10167 {
10168 return gl::error(GL_OUT_OF_MEMORY);
10169 }
10170}
10171
10172void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10173{
10174 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10175 pname, params);
10176
10177 try
10178 {
10179 gl::Context *context = gl::getNonLostContext();
10180
10181 if (context)
10182 {
10183 if (context->getClientVersion() < 3)
10184 {
10185 return gl::error(GL_INVALID_OPERATION);
10186 }
10187 }
10188
10189 UNIMPLEMENTED();
10190 }
10191 catch(std::bad_alloc&)
10192 {
10193 return gl::error(GL_OUT_OF_MEMORY);
10194 }
10195}
10196
10197void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10198{
10199 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10200 sync, pname, bufSize, length, values);
10201
10202 try
10203 {
10204 gl::Context *context = gl::getNonLostContext();
10205
10206 if (context)
10207 {
10208 if (context->getClientVersion() < 3)
10209 {
10210 return gl::error(GL_INVALID_OPERATION);
10211 }
10212 }
10213
10214 UNIMPLEMENTED();
10215 }
10216 catch(std::bad_alloc&)
10217 {
10218 return gl::error(GL_OUT_OF_MEMORY);
10219 }
10220}
10221
10222void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10223{
10224 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10225 target, index, data);
10226
10227 try
10228 {
10229 gl::Context *context = gl::getNonLostContext();
10230
10231 if (context)
10232 {
10233 if (context->getClientVersion() < 3)
10234 {
10235 return gl::error(GL_INVALID_OPERATION);
10236 }
10237 }
10238
10239 UNIMPLEMENTED();
10240 }
10241 catch(std::bad_alloc&)
10242 {
10243 return gl::error(GL_OUT_OF_MEMORY);
10244 }
10245}
10246
10247void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10248{
10249 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10250 target, pname, params);
10251
10252 try
10253 {
10254 gl::Context *context = gl::getNonLostContext();
10255
10256 if (context)
10257 {
10258 if (context->getClientVersion() < 3)
10259 {
10260 return gl::error(GL_INVALID_OPERATION);
10261 }
10262 }
10263
10264 UNIMPLEMENTED();
10265 }
10266 catch(std::bad_alloc&)
10267 {
10268 return gl::error(GL_OUT_OF_MEMORY);
10269 }
10270}
10271
10272void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10273{
10274 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10275
10276 try
10277 {
10278 gl::Context *context = gl::getNonLostContext();
10279
10280 if (context)
10281 {
10282 if (context->getClientVersion() < 3)
10283 {
10284 return gl::error(GL_INVALID_OPERATION);
10285 }
10286 }
10287
10288 UNIMPLEMENTED();
10289 }
10290 catch(std::bad_alloc&)
10291 {
10292 return gl::error(GL_OUT_OF_MEMORY);
10293 }
10294}
10295
10296void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10297{
10298 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10299
10300 try
10301 {
10302 gl::Context *context = gl::getNonLostContext();
10303
10304 if (context)
10305 {
10306 if (context->getClientVersion() < 3)
10307 {
10308 return gl::error(GL_INVALID_OPERATION);
10309 }
10310 }
10311
10312 UNIMPLEMENTED();
10313 }
10314 catch(std::bad_alloc&)
10315 {
10316 return gl::error(GL_OUT_OF_MEMORY);
10317 }
10318}
10319
10320GLboolean __stdcall glIsSampler(GLuint sampler)
10321{
10322 EVENT("(GLuint sampler = %u)", sampler);
10323
10324 try
10325 {
10326 gl::Context *context = gl::getNonLostContext();
10327
10328 if (context)
10329 {
10330 if (context->getClientVersion() < 3)
10331 {
10332 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10333 }
10334 }
10335
10336 UNIMPLEMENTED();
10337 }
10338 catch(std::bad_alloc&)
10339 {
10340 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10341 }
10342
10343 return GL_FALSE;
10344}
10345
10346void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10347{
10348 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10349
10350 try
10351 {
10352 gl::Context *context = gl::getNonLostContext();
10353
10354 if (context)
10355 {
10356 if (context->getClientVersion() < 3)
10357 {
10358 return gl::error(GL_INVALID_OPERATION);
10359 }
10360 }
10361
10362 UNIMPLEMENTED();
10363 }
10364 catch(std::bad_alloc&)
10365 {
10366 return gl::error(GL_OUT_OF_MEMORY);
10367 }
10368}
10369
10370void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10371{
10372 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10373
10374 try
10375 {
10376 gl::Context *context = gl::getNonLostContext();
10377
10378 if (context)
10379 {
10380 if (context->getClientVersion() < 3)
10381 {
10382 return gl::error(GL_INVALID_OPERATION);
10383 }
10384 }
10385
10386 UNIMPLEMENTED();
10387 }
10388 catch(std::bad_alloc&)
10389 {
10390 return gl::error(GL_OUT_OF_MEMORY);
10391 }
10392}
10393
10394void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10395{
10396 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10397 sampler, pname, param);
10398
10399 try
10400 {
10401 gl::Context *context = gl::getNonLostContext();
10402
10403 if (context)
10404 {
10405 if (context->getClientVersion() < 3)
10406 {
10407 return gl::error(GL_INVALID_OPERATION);
10408 }
10409 }
10410
10411 UNIMPLEMENTED();
10412 }
10413 catch(std::bad_alloc&)
10414 {
10415 return gl::error(GL_OUT_OF_MEMORY);
10416 }
10417}
10418
10419void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10420{
10421 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10422
10423 try
10424 {
10425 gl::Context *context = gl::getNonLostContext();
10426
10427 if (context)
10428 {
10429 if (context->getClientVersion() < 3)
10430 {
10431 return gl::error(GL_INVALID_OPERATION);
10432 }
10433 }
10434
10435 UNIMPLEMENTED();
10436 }
10437 catch(std::bad_alloc&)
10438 {
10439 return gl::error(GL_OUT_OF_MEMORY);
10440 }
10441}
10442
10443void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10444{
10445 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10446
10447 try
10448 {
10449 gl::Context *context = gl::getNonLostContext();
10450
10451 if (context)
10452 {
10453 if (context->getClientVersion() < 3)
10454 {
10455 return gl::error(GL_INVALID_OPERATION);
10456 }
10457 }
10458
10459 UNIMPLEMENTED();
10460 }
10461 catch(std::bad_alloc&)
10462 {
10463 return gl::error(GL_OUT_OF_MEMORY);
10464 }
10465}
10466
10467void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10468{
10469 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10470
10471 try
10472 {
10473 gl::Context *context = gl::getNonLostContext();
10474
10475 if (context)
10476 {
10477 if (context->getClientVersion() < 3)
10478 {
10479 return gl::error(GL_INVALID_OPERATION);
10480 }
10481 }
10482
10483 UNIMPLEMENTED();
10484 }
10485 catch(std::bad_alloc&)
10486 {
10487 return gl::error(GL_OUT_OF_MEMORY);
10488 }
10489}
10490
10491void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10492{
10493 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10494
10495 try
10496 {
10497 gl::Context *context = gl::getNonLostContext();
10498
10499 if (context)
10500 {
10501 if (context->getClientVersion() < 3)
10502 {
10503 return gl::error(GL_INVALID_OPERATION);
10504 }
10505 }
10506
10507 UNIMPLEMENTED();
10508 }
10509 catch(std::bad_alloc&)
10510 {
10511 return gl::error(GL_OUT_OF_MEMORY);
10512 }
10513}
10514
10515void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10516{
10517 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10518
10519 try
10520 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010521 if (index >= gl::MAX_VERTEX_ATTRIBS)
10522 {
10523 return gl::error(GL_INVALID_VALUE);
10524 }
10525
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010526 gl::Context *context = gl::getNonLostContext();
10527
10528 if (context)
10529 {
10530 if (context->getClientVersion() < 3)
10531 {
10532 return gl::error(GL_INVALID_OPERATION);
10533 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010534
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010535 context->setVertexAttribDivisor(index, divisor);
10536 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010537 }
10538 catch(std::bad_alloc&)
10539 {
10540 return gl::error(GL_OUT_OF_MEMORY);
10541 }
10542}
10543
10544void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10545{
10546 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10547
10548 try
10549 {
10550 gl::Context *context = gl::getNonLostContext();
10551
10552 if (context)
10553 {
10554 if (context->getClientVersion() < 3)
10555 {
10556 return gl::error(GL_INVALID_OPERATION);
10557 }
10558 }
10559
10560 UNIMPLEMENTED();
10561 }
10562 catch(std::bad_alloc&)
10563 {
10564 return gl::error(GL_OUT_OF_MEMORY);
10565 }
10566}
10567
10568void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10569{
10570 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10571
10572 try
10573 {
10574 gl::Context *context = gl::getNonLostContext();
10575
10576 if (context)
10577 {
10578 if (context->getClientVersion() < 3)
10579 {
10580 return gl::error(GL_INVALID_OPERATION);
10581 }
10582 }
10583
10584 UNIMPLEMENTED();
10585 }
10586 catch(std::bad_alloc&)
10587 {
10588 return gl::error(GL_OUT_OF_MEMORY);
10589 }
10590}
10591
10592void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10593{
10594 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10595
10596 try
10597 {
10598 gl::Context *context = gl::getNonLostContext();
10599
10600 if (context)
10601 {
10602 if (context->getClientVersion() < 3)
10603 {
10604 return gl::error(GL_INVALID_OPERATION);
10605 }
10606 }
10607
10608 UNIMPLEMENTED();
10609 }
10610 catch(std::bad_alloc&)
10611 {
10612 return gl::error(GL_OUT_OF_MEMORY);
10613 }
10614}
10615
10616GLboolean __stdcall glIsTransformFeedback(GLuint id)
10617{
10618 EVENT("(GLuint id = %u)", id);
10619
10620 try
10621 {
10622 gl::Context *context = gl::getNonLostContext();
10623
10624 if (context)
10625 {
10626 if (context->getClientVersion() < 3)
10627 {
10628 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10629 }
10630 }
10631
10632 UNIMPLEMENTED();
10633 }
10634 catch(std::bad_alloc&)
10635 {
10636 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10637 }
10638
10639 return GL_FALSE;
10640}
10641
10642void __stdcall glPauseTransformFeedback(void)
10643{
10644 EVENT("(void)");
10645
10646 try
10647 {
10648 gl::Context *context = gl::getNonLostContext();
10649
10650 if (context)
10651 {
10652 if (context->getClientVersion() < 3)
10653 {
10654 return gl::error(GL_INVALID_OPERATION);
10655 }
10656 }
10657
10658 UNIMPLEMENTED();
10659 }
10660 catch(std::bad_alloc&)
10661 {
10662 return gl::error(GL_OUT_OF_MEMORY);
10663 }
10664}
10665
10666void __stdcall glResumeTransformFeedback(void)
10667{
10668 EVENT("(void)");
10669
10670 try
10671 {
10672 gl::Context *context = gl::getNonLostContext();
10673
10674 if (context)
10675 {
10676 if (context->getClientVersion() < 3)
10677 {
10678 return gl::error(GL_INVALID_OPERATION);
10679 }
10680 }
10681
10682 UNIMPLEMENTED();
10683 }
10684 catch(std::bad_alloc&)
10685 {
10686 return gl::error(GL_OUT_OF_MEMORY);
10687 }
10688}
10689
10690void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10691{
10692 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10693 program, bufSize, length, binaryFormat, binary);
10694
10695 try
10696 {
10697 gl::Context *context = gl::getNonLostContext();
10698
10699 if (context)
10700 {
10701 if (context->getClientVersion() < 3)
10702 {
10703 return gl::error(GL_INVALID_OPERATION);
10704 }
10705 }
10706
10707 UNIMPLEMENTED();
10708 }
10709 catch(std::bad_alloc&)
10710 {
10711 return gl::error(GL_OUT_OF_MEMORY);
10712 }
10713}
10714
10715void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10716{
10717 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10718 program, binaryFormat, binary, length);
10719
10720 try
10721 {
10722 gl::Context *context = gl::getNonLostContext();
10723
10724 if (context)
10725 {
10726 if (context->getClientVersion() < 3)
10727 {
10728 return gl::error(GL_INVALID_OPERATION);
10729 }
10730 }
10731
10732 UNIMPLEMENTED();
10733 }
10734 catch(std::bad_alloc&)
10735 {
10736 return gl::error(GL_OUT_OF_MEMORY);
10737 }
10738}
10739
10740void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10741{
10742 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10743 program, pname, value);
10744
10745 try
10746 {
10747 gl::Context *context = gl::getNonLostContext();
10748
10749 if (context)
10750 {
10751 if (context->getClientVersion() < 3)
10752 {
10753 return gl::error(GL_INVALID_OPERATION);
10754 }
10755 }
10756
10757 UNIMPLEMENTED();
10758 }
10759 catch(std::bad_alloc&)
10760 {
10761 return gl::error(GL_OUT_OF_MEMORY);
10762 }
10763}
10764
10765void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10766{
10767 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10768 target, numAttachments, attachments);
10769
10770 try
10771 {
10772 gl::Context *context = gl::getNonLostContext();
10773
10774 if (context)
10775 {
10776 if (context->getClientVersion() < 3)
10777 {
10778 return gl::error(GL_INVALID_OPERATION);
10779 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010780
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010781 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10782 {
10783 return;
10784 }
10785
10786 int maxDimension = context->getMaximumRenderbufferDimension();
10787 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10788 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010789 }
10790 catch(std::bad_alloc&)
10791 {
10792 return gl::error(GL_OUT_OF_MEMORY);
10793 }
10794}
10795
10796void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10797{
10798 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10799 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10800 target, numAttachments, attachments, x, y, width, height);
10801
10802 try
10803 {
10804 gl::Context *context = gl::getNonLostContext();
10805
10806 if (context)
10807 {
10808 if (context->getClientVersion() < 3)
10809 {
10810 return gl::error(GL_INVALID_OPERATION);
10811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010812
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010813 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10814 {
10815 return;
10816 }
10817
10818 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10819 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010820 }
10821 catch(std::bad_alloc&)
10822 {
10823 return gl::error(GL_OUT_OF_MEMORY);
10824 }
10825}
10826
10827void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10828{
10829 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10830 target, levels, internalformat, width, height);
10831
10832 try
10833 {
10834 gl::Context *context = gl::getNonLostContext();
10835
10836 if (context)
10837 {
10838 if (context->getClientVersion() < 3)
10839 {
10840 return gl::error(GL_INVALID_OPERATION);
10841 }
10842 }
10843
10844 UNIMPLEMENTED();
10845 }
10846 catch(std::bad_alloc&)
10847 {
10848 return gl::error(GL_OUT_OF_MEMORY);
10849 }
10850}
10851
10852void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10853{
10854 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10855 "GLsizei height = %d, GLsizei depth = %d)",
10856 target, levels, internalformat, width, height, depth);
10857
10858 try
10859 {
10860 gl::Context *context = gl::getNonLostContext();
10861
10862 if (context)
10863 {
10864 if (context->getClientVersion() < 3)
10865 {
10866 return gl::error(GL_INVALID_OPERATION);
10867 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010868 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010869 }
10870 catch(std::bad_alloc&)
10871 {
10872 return gl::error(GL_OUT_OF_MEMORY);
10873 }
10874}
10875
10876void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10877{
10878 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10879 "GLint* params = 0x%0.8p)",
10880 target, internalformat, pname, bufSize, params);
10881
10882 try
10883 {
10884 gl::Context *context = gl::getNonLostContext();
10885
10886 if (context)
10887 {
10888 if (context->getClientVersion() < 3)
10889 {
10890 return gl::error(GL_INVALID_OPERATION);
10891 }
10892 }
10893
10894 UNIMPLEMENTED();
10895 }
10896 catch(std::bad_alloc&)
10897 {
10898 return gl::error(GL_OUT_OF_MEMORY);
10899 }
10900}
10901
10902// Extension functions
10903
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010904void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10905 GLbitfield mask, GLenum filter)
10906{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010907 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010908 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10909 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10910 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10911
10912 try
10913 {
10914 switch (filter)
10915 {
10916 case GL_NEAREST:
10917 break;
10918 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010919 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010920 }
10921
10922 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010924 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010925 }
10926
10927 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10928 {
10929 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010931 }
10932
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010934
10935 if (context)
10936 {
10937 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10938 {
10939 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010940 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010941 }
10942
10943 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10944 }
10945 }
10946 catch(std::bad_alloc&)
10947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010949 }
10950}
10951
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010952void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10953 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010955 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010956 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010957 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010958 target, level, internalformat, width, height, depth, border, format, type, pixels);
10959
10960 try
10961 {
10962 UNIMPLEMENTED(); // FIXME
10963 }
10964 catch(std::bad_alloc&)
10965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010967 }
10968}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010969
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010970void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10971 GLenum *binaryFormat, void *binary)
10972{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010973 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 +000010974 program, bufSize, length, binaryFormat, binary);
10975
10976 try
10977 {
10978 gl::Context *context = gl::getNonLostContext();
10979
10980 if (context)
10981 {
10982 gl::Program *programObject = context->getProgram(program);
10983
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010984 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010986 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010987 }
10988
10989 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10990
10991 if (!programBinary)
10992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010993 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010994 }
10995
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010996 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010998 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010999 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011000
11001 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011002 }
11003 }
11004 catch(std::bad_alloc&)
11005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011006 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011007 }
11008}
11009
11010void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
11011 const void *binary, GLint length)
11012{
11013 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
11014 program, binaryFormat, binary, length);
11015
11016 try
11017 {
11018 gl::Context *context = gl::getNonLostContext();
11019
11020 if (context)
11021 {
11022 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
11023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011024 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011025 }
11026
11027 gl::Program *programObject = context->getProgram(program);
11028
11029 if (!programObject)
11030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011031 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011032 }
11033
daniel@transgaming.com95d29422012-07-24 18:36:10 +000011034 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011035 }
11036 }
11037 catch(std::bad_alloc&)
11038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011039 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011040 }
11041}
11042
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011043void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
11044{
11045 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
11046
11047 try
11048 {
11049 gl::Context *context = gl::getNonLostContext();
11050
11051 if (context)
11052 {
11053 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
11054 {
11055 return gl::error(GL_INVALID_VALUE);
11056 }
11057
11058 if (context->getDrawFramebufferHandle() == 0)
11059 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011060 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011061 {
11062 return gl::error(GL_INVALID_OPERATION);
11063 }
11064
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011065 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011066 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011067 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011068 }
11069 }
11070 else
11071 {
11072 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11073 {
11074 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
11075 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
11076 {
11077 return gl::error(GL_INVALID_OPERATION);
11078 }
11079 }
11080 }
11081
11082 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
11083
11084 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11085 {
11086 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
11087 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011088
11089 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
11090 {
11091 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
11092 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011093 }
11094 }
11095 catch (std::bad_alloc&)
11096 {
11097 return gl::error(GL_OUT_OF_MEMORY);
11098 }
11099}
11100
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011101__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
11102{
11103 struct Extension
11104 {
11105 const char *name;
11106 __eglMustCastToProperFunctionPointerType address;
11107 };
11108
11109 static const Extension glExtensions[] =
11110 {
11111 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011112 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011113 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011114 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11115 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11116 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11117 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11118 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11119 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11120 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011121 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011122 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011123 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11124 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11125 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11126 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011127 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11128 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11129 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11130 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11131 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11132 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11133 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011134 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011135 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11136 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11137 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011138 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11139 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011140
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011141 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011142 {
11143 if (strcmp(procname, glExtensions[ext].name) == 0)
11144 {
11145 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11146 }
11147 }
11148
11149 return NULL;
11150}
11151
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011152// Non-public functions used by EGL
11153
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011154bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011155{
11156 EVENT("(egl::Surface* surface = 0x%0.8p)",
11157 surface);
11158
11159 try
11160 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011161 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011162
11163 if (context)
11164 {
11165 gl::Texture2D *textureObject = context->getTexture2D();
11166
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011167 if (textureObject->isImmutable())
11168 {
11169 return false;
11170 }
11171
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011172 if (textureObject)
11173 {
11174 textureObject->bindTexImage(surface);
11175 }
11176 }
11177 }
11178 catch(std::bad_alloc&)
11179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011180 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011181 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011182
11183 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011184}
11185
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011186}