blob: 7eb2d0b209401ca3a46a80fbd8f6137de592e259 [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
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +0000226bool validateES3TexImageParameters(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
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +0000467bool validateES3CopyTexImageParameters(gl::Context *context, GLenum target, GLint level, GLenum internalformat,
468 bool isSubImage, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
469 GLsizei width, GLsizei height, GLint border)
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000470{
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
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +0000486 if (border != 0)
487 {
488 return gl::error(GL_INVALID_VALUE, false);
489 }
490
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000491 if (level > context->getMaximumTextureLevel())
492 {
493 return gl::error(GL_INVALID_VALUE, false);
494 }
495
496 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
497
498 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
499 {
500 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
501 }
502
503 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
504 {
505 return gl::error(GL_INVALID_OPERATION, false);
506 }
507
508 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
509 GLenum colorbufferFormat = source->getInternalFormat();
510 gl::Texture *texture = NULL;
511 GLenum textureFormat = GL_RGBA;
512 bool textureCompressed = false;
513 GLint textureLevelWidth = 0;
514 GLint textureLevelHeight = 0;
515 GLint textureLevelDepth = 0;
516 switch (target)
517 {
518 case GL_TEXTURE_2D:
519 {
520 gl::Texture2D *texture2d = context->getTexture2D();
521 if (texture2d)
522 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000523 textureFormat = gl::GetFormat(texture2d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000524 textureCompressed = texture2d->isCompressed(level);
525 textureLevelWidth = texture2d->getWidth(level);
526 textureLevelHeight = texture2d->getHeight(level);
527 textureLevelDepth = 1;
528 texture = texture2d;
529 }
530 }
531 break;
532
533 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
534 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
535 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
536 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
537 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
538 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
539 {
540 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
541 if (textureCube)
542 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000543 textureFormat = gl::GetFormat(textureCube->getInternalFormat(target, level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000544 textureCompressed = textureCube->isCompressed(target, level);
545 textureLevelWidth = textureCube->getWidth(target, level);
546 textureLevelHeight = textureCube->getHeight(target, level);
547 textureLevelDepth = 1;
548 texture = textureCube;
549 }
550 }
551 break;
552
553 case GL_TEXTURE_3D:
554 {
555 gl::Texture3D *texture3d = context->getTexture3D();
556 if (texture3d)
557 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000558 textureFormat = gl::GetFormat(texture3d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000559 textureCompressed = texture3d->isCompressed(level);
560 textureLevelWidth = texture3d->getWidth(level);
561 textureLevelHeight = texture3d->getHeight(level);
562 textureLevelDepth = texture3d->getDepth(level);
563 texture = texture3d;
564 }
565 }
566 break;
567
568 default:
569 return gl::error(GL_INVALID_ENUM, false);
570 }
571
572 if (!texture)
573 {
574 return gl::error(GL_INVALID_OPERATION, false);
575 }
576
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +0000577 if (texture->isImmutable() && !isSubImage)
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000578 {
579 return gl::error(GL_INVALID_OPERATION, false);
580 }
581
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +0000582 if (textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000583 {
584 if ((width % 4 != 0 && width != textureLevelWidth) ||
585 (height % 4 != 0 && height != textureLevelHeight))
586 {
587 return gl::error(GL_INVALID_OPERATION, false);
588 }
589 }
590
591 if (xoffset + width > textureLevelWidth ||
592 yoffset + height > textureLevelHeight ||
593 zoffset >= textureLevelDepth)
594 {
595 return gl::error(GL_INVALID_VALUE, false);
596 }
597
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000598 if (!gl::IsValidCopyTexImageCombination(textureFormat, colorbufferFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000599 {
600 return gl::error(GL_INVALID_OPERATION, false);
601 }
602
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000603 return true;
604}
605
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000606// check for combinations of format and type that are valid for ReadPixels
607bool validReadFormatType(GLenum format, GLenum type)
608{
609 switch (format)
610 {
611 case GL_RGBA:
612 switch (type)
613 {
614 case GL_UNSIGNED_BYTE:
615 break;
616 default:
617 return false;
618 }
619 break;
620 case GL_BGRA_EXT:
621 switch (type)
622 {
623 case GL_UNSIGNED_BYTE:
624 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
625 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
626 break;
627 default:
628 return false;
629 }
630 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000631 default:
632 return false;
633 }
634 return true;
635}
636
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +0000637bool validateInvalidateFramebufferParameters(gl::Context *context, GLenum target, GLsizei numAttachments,
638 const GLenum* attachments)
639{
640 bool defaultFramebuffer = false;
641
642 switch (target)
643 {
644 case GL_DRAW_FRAMEBUFFER:
645 case GL_FRAMEBUFFER:
646 defaultFramebuffer = context->getDrawFramebufferHandle() == 0;
647 break;
648 case GL_READ_FRAMEBUFFER:
649 defaultFramebuffer = context->getReadFramebufferHandle() == 0;
650 break;
651 default:
652 return gl::error(GL_INVALID_ENUM, false);
653 }
654
655 for (int i = 0; i < numAttachments; ++i)
656 {
657 if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
658 {
659 if (defaultFramebuffer)
660 {
661 return gl::error(GL_INVALID_ENUM, false);
662 }
663
664 if (attachments[i] >= GL_COLOR_ATTACHMENT0 + context->getMaximumRenderTargets())
665 {
666 return gl::error(GL_INVALID_OPERATION, false);
667 }
668 }
669 else
670 {
671 switch (attachments[i])
672 {
673 case GL_DEPTH_ATTACHMENT:
674 case GL_STENCIL_ATTACHMENT:
675 case GL_DEPTH_STENCIL_ATTACHMENT:
676 if (defaultFramebuffer)
677 {
678 return gl::error(GL_INVALID_ENUM, false);
679 }
680 break;
681 case GL_COLOR:
682 case GL_DEPTH:
683 case GL_STENCIL:
684 if (!defaultFramebuffer)
685 {
686 return gl::error(GL_INVALID_ENUM, false);
687 }
688 break;
689 default:
690 return gl::error(GL_INVALID_ENUM, false);
691 }
692 }
693 }
694
695 return true;
696}
697
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698extern "C"
699{
700
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000701// OpenGL ES 2.0 functions
702
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703void __stdcall glActiveTexture(GLenum texture)
704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000705 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000706
707 try
708 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000710
711 if (context)
712 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000713 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000715 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000716 }
717
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000718 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000719 }
720 }
721 catch(std::bad_alloc&)
722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000723 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000724 }
725}
726
727void __stdcall glAttachShader(GLuint program, GLuint shader)
728{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000729 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000730
731 try
732 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000734
735 if (context)
736 {
737 gl::Program *programObject = context->getProgram(program);
738 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000739
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000740 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000741 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000742 if (context->getShader(program))
743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000744 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000745 }
746 else
747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000749 }
750 }
751
752 if (!shaderObject)
753 {
754 if (context->getProgram(shader))
755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000756 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000757 }
758 else
759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000761 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762 }
763
764 if (!programObject->attachShader(shaderObject))
765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767 }
768 }
769 }
770 catch(std::bad_alloc&)
771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000773 }
774}
775
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000776void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
777{
778 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
779
780 try
781 {
782 switch (target)
783 {
784 case GL_ANY_SAMPLES_PASSED_EXT:
785 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
786 break;
787 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000789 }
790
791 if (id == 0)
792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000793 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000794 }
795
796 gl::Context *context = gl::getNonLostContext();
797
798 if (context)
799 {
800 context->beginQuery(target, id);
801 }
802 }
803 catch(std::bad_alloc&)
804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000805 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000806 }
807}
808
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000809void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000810{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000811 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000812
813 try
814 {
815 if (index >= gl::MAX_VERTEX_ATTRIBS)
816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000818 }
819
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821
822 if (context)
823 {
824 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000825
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000826 if (!programObject)
827 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000828 if (context->getShader(program))
829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000830 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000831 }
832 else
833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000834 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000835 }
836 }
837
838 if (strncmp(name, "gl_", 3) == 0)
839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000841 }
842
843 programObject->bindAttributeLocation(index, name);
844 }
845 }
846 catch(std::bad_alloc&)
847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000848 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000849 }
850}
851
852void __stdcall glBindBuffer(GLenum target, GLuint buffer)
853{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000854 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000855
856 try
857 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000858 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000859
860 if (context)
861 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000862 // Check ES3 specific targets
863 switch (target)
864 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000865 case GL_COPY_READ_BUFFER:
866 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000867 case GL_PIXEL_PACK_BUFFER:
868 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000869 case GL_UNIFORM_BUFFER:
870 case GL_TRANSFORM_FEEDBACK_BUFFER:
871 if (context->getClientVersion() < 3)
872 {
873 return gl::error(GL_INVALID_ENUM);
874 }
875 }
876
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000877 switch (target)
878 {
879 case GL_ARRAY_BUFFER:
880 context->bindArrayBuffer(buffer);
881 return;
882 case GL_ELEMENT_ARRAY_BUFFER:
883 context->bindElementArrayBuffer(buffer);
884 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000885 case GL_COPY_READ_BUFFER:
886 context->bindCopyReadBuffer(buffer);
887 return;
888 case GL_COPY_WRITE_BUFFER:
889 context->bindCopyWriteBuffer(buffer);
890 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000891 case GL_PIXEL_PACK_BUFFER:
892 context->bindPixelPackBuffer(buffer);
893 return;
894 case GL_PIXEL_UNPACK_BUFFER:
895 context->bindPixelUnpackBuffer(buffer);
896 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000897 case GL_UNIFORM_BUFFER:
898 context->bindGenericUniformBuffer(buffer);
899 return;
900 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000901 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000902 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000903 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000904 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000905 }
906 }
907 }
908 catch(std::bad_alloc&)
909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000910 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911 }
912}
913
914void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
915{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000916 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000917
918 try
919 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000920 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000922 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000923 }
924
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000925 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000926
927 if (context)
928 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000929 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
930 {
931 context->bindReadFramebuffer(framebuffer);
932 }
933
934 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
935 {
936 context->bindDrawFramebuffer(framebuffer);
937 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000938 }
939 }
940 catch(std::bad_alloc&)
941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000943 }
944}
945
946void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000948 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000949
950 try
951 {
952 if (target != GL_RENDERBUFFER)
953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000954 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000955 }
956
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958
959 if (context)
960 {
961 context->bindRenderbuffer(renderbuffer);
962 }
963 }
964 catch(std::bad_alloc&)
965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967 }
968}
969
970void __stdcall glBindTexture(GLenum target, GLuint texture)
971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000972 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000973
974 try
975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000977
978 if (context)
979 {
980 gl::Texture *textureObject = context->getTexture(texture);
981
982 if (textureObject && textureObject->getTarget() != target && texture != 0)
983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000984 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000985 }
986
987 switch (target)
988 {
989 case GL_TEXTURE_2D:
990 context->bindTexture2D(texture);
991 return;
992 case GL_TEXTURE_CUBE_MAP:
993 context->bindTextureCubeMap(texture);
994 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000995 case GL_TEXTURE_3D:
996 if (context->getClientVersion() < 3)
997 {
998 return gl::error(GL_INVALID_ENUM);
999 }
1000 context->bindTexture3D(texture);
1001 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00001002 case GL_TEXTURE_2D_ARRAY:
1003 if (context->getClientVersion() < 3)
1004 {
1005 return gl::error(GL_INVALID_ENUM);
1006 }
1007 context->bindTexture2DArray(texture);
1008 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001011 }
1012 }
1013 }
1014 catch(std::bad_alloc&)
1015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001016 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017 }
1018}
1019
1020void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001022 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001023 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001024
1025 try
1026 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001027 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028
1029 if (context)
1030 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001031 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001032 }
1033 }
1034 catch(std::bad_alloc&)
1035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001036 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001037 }
1038}
1039
1040void __stdcall glBlendEquation(GLenum mode)
1041{
1042 glBlendEquationSeparate(mode, mode);
1043}
1044
1045void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
1046{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001047 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001048
1049 try
1050 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001051 gl::Context *context = gl::getNonLostContext();
1052
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001053 switch (modeRGB)
1054 {
1055 case GL_FUNC_ADD:
1056 case GL_FUNC_SUBTRACT:
1057 case GL_FUNC_REVERSE_SUBTRACT:
1058 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001059
1060 case GL_MIN:
1061 case GL_MAX:
1062 if (context && context->getClientVersion() < 3)
1063 {
1064 return gl::error(GL_INVALID_ENUM);
1065 }
1066 break;
1067
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001068 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001069 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001070 }
1071
1072 switch (modeAlpha)
1073 {
1074 case GL_FUNC_ADD:
1075 case GL_FUNC_SUBTRACT:
1076 case GL_FUNC_REVERSE_SUBTRACT:
1077 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001078
1079 case GL_MIN:
1080 case GL_MAX:
1081 if (context && context->getClientVersion() < 3)
1082 {
1083 return gl::error(GL_INVALID_ENUM);
1084 }
1085 break;
1086
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001087 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001088 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001089 }
1090
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001091 if (context)
1092 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001093 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001094 }
1095 }
1096 catch(std::bad_alloc&)
1097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001098 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001099 }
1100}
1101
1102void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1103{
1104 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1105}
1106
1107void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001109 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 +00001110 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111
1112 try
1113 {
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001114 gl::Context *context = gl::getNonLostContext();
1115
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001116 switch (srcRGB)
1117 {
1118 case GL_ZERO:
1119 case GL_ONE:
1120 case GL_SRC_COLOR:
1121 case GL_ONE_MINUS_SRC_COLOR:
1122 case GL_DST_COLOR:
1123 case GL_ONE_MINUS_DST_COLOR:
1124 case GL_SRC_ALPHA:
1125 case GL_ONE_MINUS_SRC_ALPHA:
1126 case GL_DST_ALPHA:
1127 case GL_ONE_MINUS_DST_ALPHA:
1128 case GL_CONSTANT_COLOR:
1129 case GL_ONE_MINUS_CONSTANT_COLOR:
1130 case GL_CONSTANT_ALPHA:
1131 case GL_ONE_MINUS_CONSTANT_ALPHA:
1132 case GL_SRC_ALPHA_SATURATE:
1133 break;
1134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001135 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001136 }
1137
1138 switch (dstRGB)
1139 {
1140 case GL_ZERO:
1141 case GL_ONE:
1142 case GL_SRC_COLOR:
1143 case GL_ONE_MINUS_SRC_COLOR:
1144 case GL_DST_COLOR:
1145 case GL_ONE_MINUS_DST_COLOR:
1146 case GL_SRC_ALPHA:
1147 case GL_ONE_MINUS_SRC_ALPHA:
1148 case GL_DST_ALPHA:
1149 case GL_ONE_MINUS_DST_ALPHA:
1150 case GL_CONSTANT_COLOR:
1151 case GL_ONE_MINUS_CONSTANT_COLOR:
1152 case GL_CONSTANT_ALPHA:
1153 case GL_ONE_MINUS_CONSTANT_ALPHA:
1154 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001155
1156 case GL_SRC_ALPHA_SATURATE:
1157 if (!context || context->getClientVersion() < 3)
1158 {
1159 return gl::error(GL_INVALID_ENUM);
1160 }
1161 break;
1162
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001164 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001165 }
1166
1167 switch (srcAlpha)
1168 {
1169 case GL_ZERO:
1170 case GL_ONE:
1171 case GL_SRC_COLOR:
1172 case GL_ONE_MINUS_SRC_COLOR:
1173 case GL_DST_COLOR:
1174 case GL_ONE_MINUS_DST_COLOR:
1175 case GL_SRC_ALPHA:
1176 case GL_ONE_MINUS_SRC_ALPHA:
1177 case GL_DST_ALPHA:
1178 case GL_ONE_MINUS_DST_ALPHA:
1179 case GL_CONSTANT_COLOR:
1180 case GL_ONE_MINUS_CONSTANT_COLOR:
1181 case GL_CONSTANT_ALPHA:
1182 case GL_ONE_MINUS_CONSTANT_ALPHA:
1183 case GL_SRC_ALPHA_SATURATE:
1184 break;
1185 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001186 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001187 }
1188
1189 switch (dstAlpha)
1190 {
1191 case GL_ZERO:
1192 case GL_ONE:
1193 case GL_SRC_COLOR:
1194 case GL_ONE_MINUS_SRC_COLOR:
1195 case GL_DST_COLOR:
1196 case GL_ONE_MINUS_DST_COLOR:
1197 case GL_SRC_ALPHA:
1198 case GL_ONE_MINUS_SRC_ALPHA:
1199 case GL_DST_ALPHA:
1200 case GL_ONE_MINUS_DST_ALPHA:
1201 case GL_CONSTANT_COLOR:
1202 case GL_ONE_MINUS_CONSTANT_COLOR:
1203 case GL_CONSTANT_ALPHA:
1204 case GL_ONE_MINUS_CONSTANT_ALPHA:
1205 break;
shannonwoods@chromium.org48ae0252013-05-30 00:13:22 +00001206
1207 case GL_SRC_ALPHA_SATURATE:
1208 if (!context || context->getClientVersion() < 3)
1209 {
1210 return gl::error(GL_INVALID_ENUM);
1211 }
1212 break;
1213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001214 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001215 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001216 }
1217
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001218 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1219 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1220
1221 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1222 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1223
1224 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001225 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001226 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 +00001227 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001228 }
1229
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001230 if (context)
1231 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001232 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233 }
1234 }
1235 catch(std::bad_alloc&)
1236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001237 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001238 }
1239}
1240
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001241void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001243 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 +00001244 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001245
1246 try
1247 {
1248 if (size < 0)
1249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001251 }
1252
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001253 gl::Context *context = gl::getNonLostContext();
1254
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001255 switch (usage)
1256 {
1257 case GL_STREAM_DRAW:
1258 case GL_STATIC_DRAW:
1259 case GL_DYNAMIC_DRAW:
1260 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001261
1262 case GL_STREAM_READ:
1263 case GL_STREAM_COPY:
1264 case GL_STATIC_READ:
1265 case GL_STATIC_COPY:
1266 case GL_DYNAMIC_READ:
1267 case GL_DYNAMIC_COPY:
1268 if (context && context->getClientVersion() < 3)
1269 {
1270 return gl::error(GL_INVALID_ENUM);
1271 }
1272 break;
1273
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001274 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001275 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001276 }
1277
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001278 if (context)
1279 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001280 // Check ES3 specific targets
1281 switch (target)
1282 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001283 case GL_COPY_READ_BUFFER:
1284 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001285 case GL_PIXEL_PACK_BUFFER:
1286 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001287 case GL_UNIFORM_BUFFER:
1288 case GL_TRANSFORM_FEEDBACK_BUFFER:
1289 if (context->getClientVersion() < 3)
1290 {
1291 return gl::error(GL_INVALID_ENUM);
1292 }
1293 }
1294
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001295 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001296
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001297 switch (target)
1298 {
1299 case GL_ARRAY_BUFFER:
1300 buffer = context->getArrayBuffer();
1301 break;
1302 case GL_ELEMENT_ARRAY_BUFFER:
1303 buffer = context->getElementArrayBuffer();
1304 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001305 case GL_COPY_READ_BUFFER:
1306 buffer = context->getCopyReadBuffer();
1307 break;
1308 case GL_COPY_WRITE_BUFFER:
1309 buffer = context->getCopyWriteBuffer();
1310 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001311 case GL_PIXEL_PACK_BUFFER:
1312 buffer = context->getPixelPackBuffer();
1313 break;
1314 case GL_PIXEL_UNPACK_BUFFER:
1315 buffer = context->getPixelUnpackBuffer();
1316 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001317 case GL_TRANSFORM_FEEDBACK_BUFFER:
1318 buffer = context->getGenericTransformFeedbackBuffer();
1319 break;
1320 case GL_UNIFORM_BUFFER:
1321 buffer = context->getGenericUniformBuffer();
1322 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001325 }
1326
1327 if (!buffer)
1328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001329 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001330 }
1331
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001332 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001333 }
1334 }
1335 catch(std::bad_alloc&)
1336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001337 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338 }
1339}
1340
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001341void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001343 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 +00001344 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001345
1346 try
1347 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001348 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001350 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001351 }
1352
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001353 if (data == NULL)
1354 {
1355 return;
1356 }
1357
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001358 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001359
1360 if (context)
1361 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001362 // Check ES3 specific targets
1363 switch (target)
1364 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001365 case GL_COPY_READ_BUFFER:
1366 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001367 case GL_PIXEL_PACK_BUFFER:
1368 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001369 case GL_UNIFORM_BUFFER:
1370 case GL_TRANSFORM_FEEDBACK_BUFFER:
1371 if (context->getClientVersion() < 3)
1372 {
1373 return gl::error(GL_INVALID_ENUM);
1374 }
1375 }
1376
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001377 gl::Buffer *buffer;
1378
1379 switch (target)
1380 {
1381 case GL_ARRAY_BUFFER:
1382 buffer = context->getArrayBuffer();
1383 break;
1384 case GL_ELEMENT_ARRAY_BUFFER:
1385 buffer = context->getElementArrayBuffer();
1386 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001387 case GL_COPY_READ_BUFFER:
1388 buffer = context->getCopyReadBuffer();
1389 break;
1390 case GL_COPY_WRITE_BUFFER:
1391 buffer = context->getCopyWriteBuffer();
1392 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001393 case GL_PIXEL_PACK_BUFFER:
1394 buffer = context->getPixelPackBuffer();
1395 break;
1396 case GL_PIXEL_UNPACK_BUFFER:
1397 buffer = context->getPixelUnpackBuffer();
1398 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001399 case GL_TRANSFORM_FEEDBACK_BUFFER:
1400 buffer = context->getGenericTransformFeedbackBuffer();
1401 break;
1402 case GL_UNIFORM_BUFFER:
1403 buffer = context->getGenericUniformBuffer();
1404 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001405 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001406 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001407 }
1408
1409 if (!buffer)
1410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001411 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001412 }
1413
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001414 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001416 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001417 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001418
1419 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001420 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001421 }
1422 catch(std::bad_alloc&)
1423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001424 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001425 }
1426}
1427
1428GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001430 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001431
1432 try
1433 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001434 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001436 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437 }
1438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440
1441 if (context)
1442 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001443 gl::Framebuffer *framebuffer = NULL;
1444 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1445 {
1446 framebuffer = context->getReadFramebuffer();
1447 }
1448 else
1449 {
1450 framebuffer = context->getDrawFramebuffer();
1451 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001452
1453 return framebuffer->completeness();
1454 }
1455 }
1456 catch(std::bad_alloc&)
1457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001458 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459 }
1460
1461 return 0;
1462}
1463
1464void __stdcall glClear(GLbitfield mask)
1465{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001466 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467
1468 try
1469 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001470 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001471
1472 if (context)
1473 {
1474 context->clear(mask);
1475 }
1476 }
1477 catch(std::bad_alloc&)
1478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001479 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001480 }
1481}
1482
1483void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1484{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001485 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001486 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001487
1488 try
1489 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001490 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001491
1492 if (context)
1493 {
1494 context->setClearColor(red, green, blue, alpha);
1495 }
1496 }
1497 catch(std::bad_alloc&)
1498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001499 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001500 }
1501}
1502
1503void __stdcall glClearDepthf(GLclampf depth)
1504{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001505 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001506
1507 try
1508 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001509 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001510
1511 if (context)
1512 {
1513 context->setClearDepth(depth);
1514 }
1515 }
1516 catch(std::bad_alloc&)
1517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001518 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001519 }
1520}
1521
1522void __stdcall glClearStencil(GLint s)
1523{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001524 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001525
1526 try
1527 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001528 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001529
1530 if (context)
1531 {
1532 context->setClearStencil(s);
1533 }
1534 }
1535 catch(std::bad_alloc&)
1536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001537 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538 }
1539}
1540
1541void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1542{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001543 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001544 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001545
1546 try
1547 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001548 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001549
1550 if (context)
1551 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001552 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553 }
1554 }
1555 catch(std::bad_alloc&)
1556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001557 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558 }
1559}
1560
1561void __stdcall glCompileShader(GLuint shader)
1562{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001563 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001564
1565 try
1566 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001567 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568
1569 if (context)
1570 {
1571 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001572
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573 if (!shaderObject)
1574 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001575 if (context->getProgram(shader))
1576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001577 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001578 }
1579 else
1580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001582 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583 }
1584
1585 shaderObject->compile();
1586 }
1587 }
1588 catch(std::bad_alloc&)
1589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001590 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591 }
1592}
1593
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001594void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1595 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001597 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001598 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001599 target, level, internalformat, width, height, border, imageSize, data);
1600
1601 try
1602 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001603 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001606 }
1607
daniel@transgaming.com01868132010-08-24 19:21:17 +00001608 switch (internalformat)
1609 {
1610 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1611 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001612 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1613 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001614 break;
1615 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001616 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001617 }
1618
1619 if (border != 0)
1620 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001621 return gl::error(GL_INVALID_OPERATION);
1622 }
1623
1624 if (width != 1 && width != 2 && width % 4 != 0)
1625 {
1626 return gl::error(GL_INVALID_OPERATION);
1627 }
1628
1629 if (height != 1 && height != 2 && height % 4 != 0)
1630 {
1631 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001632 }
1633
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001634 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001635
1636 if (context)
1637 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001638 if (level > context->getMaximumTextureLevel())
1639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001640 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001641 }
1642
1643 switch (target)
1644 {
1645 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001646 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1647 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001650 }
1651 break;
1652 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1653 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1654 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1655 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1656 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1657 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1658 if (width != height)
1659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001660 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001661 }
1662
1663 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1664 height > (context->getMaximumCubeTextureDimension() >> level))
1665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001667 }
1668 break;
1669 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001671 }
1672
gman@chromium.org50c526d2011-08-10 05:19:44 +00001673 switch (internalformat) {
1674 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1675 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1676 if (!context->supportsDXT1Textures())
1677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001678 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 +00001679 }
1680 break;
1681 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1682 if (!context->supportsDXT3Textures())
1683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001684 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 +00001685 }
1686 break;
1687 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1688 if (!context->supportsDXT5Textures())
1689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001690 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 +00001691 }
1692 break;
1693 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001694 }
1695
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001696 if (imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001698 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001699 }
1700
1701 if (target == GL_TEXTURE_2D)
1702 {
1703 gl::Texture2D *texture = context->getTexture2D();
1704
1705 if (!texture)
1706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001707 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001708 }
1709
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001710 if (texture->isImmutable())
1711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001712 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001713 }
1714
daniel@transgaming.com01868132010-08-24 19:21:17 +00001715 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1716 }
1717 else
1718 {
1719 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1720
1721 if (!texture)
1722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001723 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001724 }
1725
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001726 if (texture->isImmutable())
1727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001728 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001729 }
1730
daniel@transgaming.com01868132010-08-24 19:21:17 +00001731 switch (target)
1732 {
1733 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1734 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1735 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1736 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1737 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1738 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1739 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1740 break;
1741 default: UNREACHABLE();
1742 }
1743 }
1744 }
1745
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001746 }
1747 catch(std::bad_alloc&)
1748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001749 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750 }
1751}
1752
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001753void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1754 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001755{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001756 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001757 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001758 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1760
1761 try
1762 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001763 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001765 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001766 }
1767
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001768 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001770 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001771 }
1772
daniel@transgaming.com01868132010-08-24 19:21:17 +00001773 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001774 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001775 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1776 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001777 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1778 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001779 break;
1780 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001781 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001782 }
1783
daniel@transgaming.com01868132010-08-24 19:21:17 +00001784 if (width == 0 || height == 0 || data == NULL)
1785 {
1786 return;
1787 }
1788
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001790
1791 if (context)
1792 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001793 if (level > context->getMaximumTextureLevel())
1794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001795 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001796 }
1797
gman@chromium.org50c526d2011-08-10 05:19:44 +00001798 switch (format) {
1799 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1800 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1801 if (!context->supportsDXT1Textures())
1802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001803 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 +00001804 }
1805 break;
1806 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1807 if (!context->supportsDXT3Textures())
1808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001809 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 +00001810 }
1811 break;
1812 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1813 if (!context->supportsDXT5Textures())
1814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001815 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 +00001816 }
1817 break;
1818 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001819 }
1820
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001821 if (imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001823 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001824 }
1825
1826 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001828 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 +00001829 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001830 }
1831
1832 if (target == GL_TEXTURE_2D)
1833 {
1834 gl::Texture2D *texture = context->getTexture2D();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001835 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001836 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001837 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001838 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001839 }
1840 else if (gl::IsCubemapTextureTarget(target))
1841 {
1842 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001843 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001844 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001845 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001846 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001847 }
1848 else
1849 {
1850 UNREACHABLE();
1851 }
1852 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001853 }
1854 catch(std::bad_alloc&)
1855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001856 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001857 }
1858}
1859
1860void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1861{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001862 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001863 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864 target, level, internalformat, x, y, width, height, border);
1865
1866 try
1867 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001868 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001869 {
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.comb8c28ed2010-04-13 03:26:32 +00001873 if (border != 0)
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001876 }
1877
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001878 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001879
1880 if (context)
1881 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001882 if (level > context->getMaximumTextureLevel())
1883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001884 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001885 }
1886
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001887 switch (target)
1888 {
1889 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001890 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1891 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001893 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001894 }
1895 break;
1896 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1897 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1898 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1899 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1900 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1901 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1902 if (width != height)
1903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001904 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001905 }
1906
1907 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1908 height > (context->getMaximumCubeTextureDimension() >> level))
1909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001911 }
1912 break;
1913 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001915 }
1916
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001917 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001918
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001919 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001921 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001922 }
1923
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001924 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001926 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001927 }
1928
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001929 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001930 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001931
1932 // [OpenGL ES 2.0.24] table 3.9
1933 switch (internalformat)
1934 {
1935 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001936 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001937 colorbufferFormat != GL_RGBA4 &&
1938 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001939 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001940 colorbufferFormat != GL_RGBA8_OES)
1941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001942 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001943 }
1944 break;
1945 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001946 case GL_RGB:
1947 if (colorbufferFormat != GL_RGB565 &&
1948 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001949 colorbufferFormat != GL_RGBA4 &&
1950 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001951 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001952 colorbufferFormat != GL_RGBA8_OES)
1953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001954 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001955 }
1956 break;
1957 case GL_LUMINANCE_ALPHA:
1958 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001959 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001960 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001961 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001962 colorbufferFormat != GL_RGBA8_OES)
1963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001964 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001965 }
1966 break;
1967 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1968 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001969 if (context->supportsDXT1Textures())
1970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001971 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001972 }
1973 else
1974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001975 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001976 }
1977 break;
1978 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1979 if (context->supportsDXT3Textures())
1980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001981 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001982 }
1983 else
1984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001985 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001986 }
1987 break;
1988 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1989 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001991 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001992 }
1993 else
1994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001995 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001996 }
1997 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001998 case GL_DEPTH_COMPONENT:
1999 case GL_DEPTH_COMPONENT16:
2000 case GL_DEPTH_COMPONENT32_OES:
2001 case GL_DEPTH_STENCIL_OES:
2002 case GL_DEPTH24_STENCIL8_OES:
2003 if (context->supportsDepthTextures())
2004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002005 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002006 }
2007 else
2008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002010 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002011 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002013 }
2014
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002015 if (target == GL_TEXTURE_2D)
2016 {
2017 gl::Texture2D *texture = context->getTexture2D();
2018
2019 if (!texture)
2020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002021 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002022 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00002023
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002024 if (texture->isImmutable())
2025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002026 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002027 }
2028
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00002029 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002030 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002031 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002032 {
2033 gl::TextureCubeMap *texture = context->getTextureCubeMap();
2034
2035 if (!texture)
2036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002037 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002038 }
2039
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002040 if (texture->isImmutable())
2041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002042 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00002043 }
2044
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00002045 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002046 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002047 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002048 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002049 }
2050 catch(std::bad_alloc&)
2051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002052 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054}
2055
2056void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
2057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002058 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002059 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002060 target, level, xoffset, yoffset, x, y, width, height);
2061
2062 try
2063 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00002064 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002067 }
2068
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002069 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002070 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002071 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072 }
2073
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002074 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
2075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002076 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002077 }
2078
2079 if (width == 0 || height == 0)
2080 {
2081 return;
2082 }
2083
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002084 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002085
2086 if (context)
2087 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002088 if (level > context->getMaximumTextureLevel())
2089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002091 }
2092
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002093 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002094
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002095 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
2096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002097 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002098 }
2099
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002100 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002102 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002103 }
2104
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002105 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00002106 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002107 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002108 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002109
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002110 if (target == GL_TEXTURE_2D)
2111 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002112 gl::Texture2D *tex2d = context->getTexture2D();
2113
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002114 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002115 {
2116 return; // error already registered by validateSubImageParams
2117 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002118 textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002119 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002120 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002121 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002122 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002123 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2124
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002125 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002126 {
2127 return; // error already registered by validateSubImageParams
2128 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002129 textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002130 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002131 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002132 else UNREACHABLE();
2133
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002134 // [OpenGL ES 2.0.24] table 3.9
2135 switch (textureFormat)
2136 {
2137 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002138 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002139 colorbufferFormat != GL_RGBA4 &&
2140 colorbufferFormat != GL_RGB5_A1 &&
2141 colorbufferFormat != GL_RGBA8_OES)
2142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002144 }
2145 break;
2146 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002147 case GL_RGB:
2148 if (colorbufferFormat != GL_RGB565 &&
2149 colorbufferFormat != GL_RGB8_OES &&
2150 colorbufferFormat != GL_RGBA4 &&
2151 colorbufferFormat != GL_RGB5_A1 &&
2152 colorbufferFormat != GL_RGBA8_OES)
2153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002154 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002155 }
2156 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002157 case GL_LUMINANCE_ALPHA:
2158 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002159 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002160 colorbufferFormat != GL_RGB5_A1 &&
2161 colorbufferFormat != GL_RGBA8_OES)
2162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002164 }
2165 break;
2166 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2167 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002168 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2169 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002171 case GL_DEPTH_COMPONENT:
2172 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002173 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002174 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002175 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002176 }
2177
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002178 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002179 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002180 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002181
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 catch(std::bad_alloc&)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 }
2186}
2187
2188GLuint __stdcall glCreateProgram(void)
2189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002190 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002191
2192 try
2193 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002194 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195
2196 if (context)
2197 {
2198 return context->createProgram();
2199 }
2200 }
2201 catch(std::bad_alloc&)
2202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002203 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002204 }
2205
2206 return 0;
2207}
2208
2209GLuint __stdcall glCreateShader(GLenum type)
2210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002211 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002212
2213 try
2214 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216
2217 if (context)
2218 {
2219 switch (type)
2220 {
2221 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002222 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002223 return context->createShader(type);
2224 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002225 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002226 }
2227 }
2228 }
2229 catch(std::bad_alloc&)
2230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002231 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 }
2233
2234 return 0;
2235}
2236
2237void __stdcall glCullFace(GLenum mode)
2238{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002239 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240
2241 try
2242 {
2243 switch (mode)
2244 {
2245 case GL_FRONT:
2246 case GL_BACK:
2247 case GL_FRONT_AND_BACK:
2248 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002249 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002250
2251 if (context)
2252 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002253 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002254 }
2255 }
2256 break;
2257 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 }
2260 }
2261 catch(std::bad_alloc&)
2262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002264 }
2265}
2266
2267void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2268{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002269 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270
2271 try
2272 {
2273 if (n < 0)
2274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002276 }
2277
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002278 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002279
2280 if (context)
2281 {
2282 for (int i = 0; i < n; i++)
2283 {
2284 context->deleteBuffer(buffers[i]);
2285 }
2286 }
2287 }
2288 catch(std::bad_alloc&)
2289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002290 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002291 }
2292}
2293
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002294void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2295{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002296 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002297
2298 try
2299 {
2300 if (n < 0)
2301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002302 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002303 }
2304
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002305 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002306
2307 if (context)
2308 {
2309 for (int i = 0; i < n; i++)
2310 {
2311 context->deleteFence(fences[i]);
2312 }
2313 }
2314 }
2315 catch(std::bad_alloc&)
2316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002317 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002318 }
2319}
2320
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002323 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002324
2325 try
2326 {
2327 if (n < 0)
2328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002330 }
2331
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002332 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002333
2334 if (context)
2335 {
2336 for (int i = 0; i < n; i++)
2337 {
2338 if (framebuffers[i] != 0)
2339 {
2340 context->deleteFramebuffer(framebuffers[i]);
2341 }
2342 }
2343 }
2344 }
2345 catch(std::bad_alloc&)
2346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002347 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348 }
2349}
2350
2351void __stdcall glDeleteProgram(GLuint program)
2352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002353 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354
2355 try
2356 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002357 if (program == 0)
2358 {
2359 return;
2360 }
2361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 if (context)
2365 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002366 if (!context->getProgram(program))
2367 {
2368 if(context->getShader(program))
2369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002370 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002371 }
2372 else
2373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002374 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002375 }
2376 }
2377
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002378 context->deleteProgram(program);
2379 }
2380 }
2381 catch(std::bad_alloc&)
2382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002384 }
2385}
2386
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002387void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2388{
2389 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2390
2391 try
2392 {
2393 if (n < 0)
2394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002395 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002396 }
2397
2398 gl::Context *context = gl::getNonLostContext();
2399
2400 if (context)
2401 {
2402 for (int i = 0; i < n; i++)
2403 {
2404 context->deleteQuery(ids[i]);
2405 }
2406 }
2407 }
2408 catch(std::bad_alloc&)
2409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002411 }
2412}
2413
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002414void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002416 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417
2418 try
2419 {
2420 if (n < 0)
2421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002422 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426
2427 if (context)
2428 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002429 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 {
2431 context->deleteRenderbuffer(renderbuffers[i]);
2432 }
2433 }
2434 }
2435 catch(std::bad_alloc&)
2436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002437 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002438 }
2439}
2440
2441void __stdcall glDeleteShader(GLuint shader)
2442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002443 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444
2445 try
2446 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002447 if (shader == 0)
2448 {
2449 return;
2450 }
2451
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002452 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002453
2454 if (context)
2455 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002456 if (!context->getShader(shader))
2457 {
2458 if(context->getProgram(shader))
2459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002460 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002461 }
2462 else
2463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002465 }
2466 }
2467
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 context->deleteShader(shader);
2469 }
2470 }
2471 catch(std::bad_alloc&)
2472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 }
2475}
2476
2477void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002479 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480
2481 try
2482 {
2483 if (n < 0)
2484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002485 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002486 }
2487
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489
2490 if (context)
2491 {
2492 for (int i = 0; i < n; i++)
2493 {
2494 if (textures[i] != 0)
2495 {
2496 context->deleteTexture(textures[i]);
2497 }
2498 }
2499 }
2500 }
2501 catch(std::bad_alloc&)
2502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002503 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504 }
2505}
2506
2507void __stdcall glDepthFunc(GLenum func)
2508{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002509 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002510
2511 try
2512 {
2513 switch (func)
2514 {
2515 case GL_NEVER:
2516 case GL_ALWAYS:
2517 case GL_LESS:
2518 case GL_LEQUAL:
2519 case GL_EQUAL:
2520 case GL_GREATER:
2521 case GL_GEQUAL:
2522 case GL_NOTEQUAL:
2523 break;
2524 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002525 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002528 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529
2530 if (context)
2531 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002532 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002533 }
2534 }
2535 catch(std::bad_alloc&)
2536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002537 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538 }
2539}
2540
2541void __stdcall glDepthMask(GLboolean flag)
2542{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002543 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002544
2545 try
2546 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002547 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548
2549 if (context)
2550 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002551 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002552 }
2553 }
2554 catch(std::bad_alloc&)
2555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002556 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002557 }
2558}
2559
2560void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2561{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002562 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002563
2564 try
2565 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567
2568 if (context)
2569 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002570 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 }
2572 }
2573 catch(std::bad_alloc&)
2574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002575 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576 }
2577}
2578
2579void __stdcall glDetachShader(GLuint program, GLuint shader)
2580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002581 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002582
2583 try
2584 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586
2587 if (context)
2588 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590 gl::Program *programObject = context->getProgram(program);
2591 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002592
2593 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002594 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002595 gl::Shader *shaderByProgramHandle;
2596 shaderByProgramHandle = context->getShader(program);
2597 if (!shaderByProgramHandle)
2598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002599 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002600 }
2601 else
2602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002603 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002604 }
2605 }
2606
2607 if (!shaderObject)
2608 {
2609 gl::Program *programByShaderHandle = context->getProgram(shader);
2610 if (!programByShaderHandle)
2611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002612 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002613 }
2614 else
2615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002616 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002617 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002618 }
2619
2620 if (!programObject->detachShader(shaderObject))
2621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002623 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002624 }
2625 }
2626 catch(std::bad_alloc&)
2627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002628 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002629 }
2630}
2631
2632void __stdcall glDisable(GLenum cap)
2633{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002634 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635
2636 try
2637 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002639
2640 if (context)
2641 {
2642 switch (cap)
2643 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002644 case GL_CULL_FACE: context->setCullFace(false); break;
2645 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2646 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2647 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2648 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2649 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2650 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2651 case GL_BLEND: context->setBlend(false); break;
2652 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002653 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002654 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002655 }
2656 }
2657 }
2658 catch(std::bad_alloc&)
2659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002661 }
2662}
2663
2664void __stdcall glDisableVertexAttribArray(GLuint index)
2665{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002666 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002667
2668 try
2669 {
2670 if (index >= gl::MAX_VERTEX_ATTRIBS)
2671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002673 }
2674
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002675 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002676
2677 if (context)
2678 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002679 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680 }
2681 }
2682 catch(std::bad_alloc&)
2683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002684 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002685 }
2686}
2687
2688void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2689{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002690 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002691
2692 try
2693 {
2694 if (count < 0 || first < 0)
2695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002696 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002697 }
2698
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002699 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002700
2701 if (context)
2702 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002703 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002704 }
2705 }
2706 catch(std::bad_alloc&)
2707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002708 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002709 }
2710}
2711
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002712void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2713{
2714 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2715
2716 try
2717 {
2718 if (count < 0 || first < 0 || primcount < 0)
2719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002720 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002721 }
2722
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002723 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002724 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002725 gl::Context *context = gl::getNonLostContext();
2726
2727 if (context)
2728 {
2729 context->drawArrays(mode, first, count, primcount);
2730 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002731 }
2732 }
2733 catch(std::bad_alloc&)
2734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002735 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002736 }
2737}
2738
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002739void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002741 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 +00002742 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743
2744 try
2745 {
2746 if (count < 0)
2747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002748 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002749 }
2750
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002751 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752
2753 if (context)
2754 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002755 switch (type)
2756 {
2757 case GL_UNSIGNED_BYTE:
2758 case GL_UNSIGNED_SHORT:
2759 break;
2760 case GL_UNSIGNED_INT:
2761 if (!context->supports32bitIndices())
2762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002763 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002764 }
2765 break;
2766 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002767 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002768 }
2769
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002770 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002771 }
2772 }
2773 catch(std::bad_alloc&)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002776 }
2777}
2778
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002779void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2780{
2781 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2782 mode, count, type, indices, primcount);
2783
2784 try
2785 {
2786 if (count < 0 || primcount < 0)
2787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002788 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002789 }
2790
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002791 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002792 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002793 gl::Context *context = gl::getNonLostContext();
2794
2795 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002796 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002797 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002798 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002799 case GL_UNSIGNED_BYTE:
2800 case GL_UNSIGNED_SHORT:
2801 break;
2802 case GL_UNSIGNED_INT:
2803 if (!context->supports32bitIndices())
2804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002805 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002806 }
2807 break;
2808 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002810 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002811
2812 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002813 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002814 }
2815 }
2816 catch(std::bad_alloc&)
2817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002818 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002819 }
2820}
2821
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822void __stdcall glEnable(GLenum cap)
2823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002824 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825
2826 try
2827 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002828 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002829
2830 if (context)
2831 {
2832 switch (cap)
2833 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002834 case GL_CULL_FACE: context->setCullFace(true); break;
2835 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2836 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2837 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2838 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2839 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2840 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2841 case GL_BLEND: context->setBlend(true); break;
2842 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002843 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002844 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002845 }
2846 }
2847 }
2848 catch(std::bad_alloc&)
2849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002850 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002851 }
2852}
2853
2854void __stdcall glEnableVertexAttribArray(GLuint index)
2855{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002856 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857
2858 try
2859 {
2860 if (index >= gl::MAX_VERTEX_ATTRIBS)
2861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002862 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002863 }
2864
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002865 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866
2867 if (context)
2868 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002869 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870 }
2871 }
2872 catch(std::bad_alloc&)
2873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002875 }
2876}
2877
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002878void __stdcall glEndQueryEXT(GLenum target)
2879{
2880 EVENT("GLenum target = 0x%X)", target);
2881
2882 try
2883 {
2884 switch (target)
2885 {
2886 case GL_ANY_SAMPLES_PASSED_EXT:
2887 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2888 break;
2889 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002890 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002891 }
2892
2893 gl::Context *context = gl::getNonLostContext();
2894
2895 if (context)
2896 {
2897 context->endQuery(target);
2898 }
2899 }
2900 catch(std::bad_alloc&)
2901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002902 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002903 }
2904}
2905
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002906void __stdcall glFinishFenceNV(GLuint fence)
2907{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002908 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002909
2910 try
2911 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002912 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002913
2914 if (context)
2915 {
2916 gl::Fence* fenceObject = context->getFence(fence);
2917
2918 if (fenceObject == NULL)
2919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002920 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002921 }
2922
2923 fenceObject->finishFence();
2924 }
2925 }
2926 catch(std::bad_alloc&)
2927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002928 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002929 }
2930}
2931
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002932void __stdcall glFinish(void)
2933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002934 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002935
2936 try
2937 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002938 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939
2940 if (context)
2941 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002942 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002943 }
2944 }
2945 catch(std::bad_alloc&)
2946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948 }
2949}
2950
2951void __stdcall glFlush(void)
2952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002953 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954
2955 try
2956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958
2959 if (context)
2960 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002961 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 }
2963 }
2964 catch(std::bad_alloc&)
2965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002967 }
2968}
2969
2970void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002972 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002973 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002974
2975 try
2976 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002977 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002978 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002980 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981 }
2982
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002984
2985 if (context)
2986 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002987 gl::Framebuffer *framebuffer = NULL;
2988 GLuint framebufferHandle = 0;
2989 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2990 {
2991 framebuffer = context->getReadFramebuffer();
2992 framebufferHandle = context->getReadFramebufferHandle();
2993 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002994 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002995 {
2996 framebuffer = context->getDrawFramebuffer();
2997 framebufferHandle = context->getDrawFramebufferHandle();
2998 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00003000 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003002 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003003 }
3004
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003005 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003006 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003007 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3008
3009 if (colorAttachment >= context->getMaximumRenderTargets())
3010 {
3011 return gl::error(GL_INVALID_VALUE);
3012 }
3013
3014 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
3015 }
3016 else
3017 {
3018 switch (attachment)
3019 {
3020 case GL_DEPTH_ATTACHMENT:
3021 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
3022 break;
3023 case GL_STENCIL_ATTACHMENT:
3024 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
3025 break;
3026 default:
3027 return gl::error(GL_INVALID_ENUM);
3028 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003029 }
3030 }
3031 }
3032 catch(std::bad_alloc&)
3033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003034 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003035 }
3036}
3037
3038void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
3039{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003040 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003041 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003042
3043 try
3044 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003045 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003047 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003048 }
3049
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003050 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051
3052 if (context)
3053 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003054 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
3055 {
3056 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3057
3058 if (colorAttachment >= context->getMaximumRenderTargets())
3059 {
3060 return gl::error(GL_INVALID_VALUE);
3061 }
3062 }
3063 else
3064 {
3065 switch (attachment)
3066 {
3067 case GL_DEPTH_ATTACHMENT:
3068 case GL_STENCIL_ATTACHMENT:
3069 break;
3070 default:
3071 return gl::error(GL_INVALID_ENUM);
3072 }
3073 }
3074
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003075 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003076 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003077 textarget = GL_NONE;
3078 }
3079 else
3080 {
3081 gl::Texture *tex = context->getTexture(texture);
3082
3083 if (tex == NULL)
3084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003085 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003086 }
3087
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088 switch (textarget)
3089 {
3090 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003091 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003092 if (tex->getTarget() != GL_TEXTURE_2D)
3093 {
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 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003097 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003099 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003100 }
3101 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003103
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003106 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003107 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003109 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003110 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003111 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3112 {
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 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003116 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003118 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003119 }
3120 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003121 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003122
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003123 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003124 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003125 }
3126
3127 if (level != 0)
3128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003129 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003130 }
3131 }
3132
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003133 gl::Framebuffer *framebuffer = NULL;
3134 GLuint framebufferHandle = 0;
3135 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3136 {
3137 framebuffer = context->getReadFramebuffer();
3138 framebufferHandle = context->getReadFramebufferHandle();
3139 }
3140 else
3141 {
3142 framebuffer = context->getDrawFramebuffer();
3143 framebufferHandle = context->getDrawFramebufferHandle();
3144 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003145
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003146 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003148 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149 }
3150
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003151 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003152 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003153 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3154
3155 if (colorAttachment >= context->getMaximumRenderTargets())
3156 {
3157 return gl::error(GL_INVALID_VALUE);
3158 }
3159
3160 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3161 }
3162 else
3163 {
3164 switch (attachment)
3165 {
3166 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3167 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3168 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003169 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003170 }
3171 }
3172 catch(std::bad_alloc&)
3173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003174 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003175 }
3176}
3177
3178void __stdcall glFrontFace(GLenum mode)
3179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003180 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181
3182 try
3183 {
3184 switch (mode)
3185 {
3186 case GL_CW:
3187 case GL_CCW:
3188 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003190
3191 if (context)
3192 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003193 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003194 }
3195 }
3196 break;
3197 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003199 }
3200 }
3201 catch(std::bad_alloc&)
3202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003203 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003204 }
3205}
3206
3207void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3208{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003209 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003210
3211 try
3212 {
3213 if (n < 0)
3214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003216 }
3217
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003218 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003219
3220 if (context)
3221 {
3222 for (int i = 0; i < n; i++)
3223 {
3224 buffers[i] = context->createBuffer();
3225 }
3226 }
3227 }
3228 catch(std::bad_alloc&)
3229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003230 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003231 }
3232}
3233
3234void __stdcall glGenerateMipmap(GLenum target)
3235{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003236 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003237
3238 try
3239 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003241
3242 if (context)
3243 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003244 switch (target)
3245 {
3246 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003247 {
3248 gl::Texture2D *tex2d = context->getTexture2D();
3249
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003250 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003252 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003253 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003254 if (tex2d->isDepth(0))
3255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003256 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003257 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003258
3259 tex2d->generateMipmaps();
3260 break;
3261 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003262
3263 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003264 {
3265 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3266
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003267 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003269 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003270 }
3271
3272 texcube->generateMipmaps();
3273 break;
3274 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003275
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003276 case GL_TEXTURE_3D:
3277 {
3278 if (context->getClientVersion() < 3)
3279 {
3280 return gl::error(GL_INVALID_ENUM);
3281 }
3282
3283 gl::Texture3D *tex3D = context->getTexture3D();
3284 if (tex3D->isCompressed(0))
3285 {
3286 return gl::error(GL_INVALID_OPERATION);
3287 }
3288
3289 tex3D->generateMipmaps();
3290 break;
3291 }
3292
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003293 case GL_TEXTURE_2D_ARRAY:
3294 {
3295 if (context->getClientVersion() < 3)
3296 {
3297 return gl::error(GL_INVALID_ENUM);
3298 }
3299
3300 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3301 if (tex2darr->isCompressed(0))
3302 {
3303 return gl::error(GL_INVALID_OPERATION);
3304 }
3305
3306 tex2darr->generateMipmaps();
3307 break;
3308 }
3309
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003310 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003311 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003312 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003313 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003314 }
3315 catch(std::bad_alloc&)
3316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003317 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318 }
3319}
3320
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003321void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003323 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003324
3325 try
3326 {
3327 if (n < 0)
3328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003329 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003330 }
3331
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003332 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003333
3334 if (context)
3335 {
3336 for (int i = 0; i < n; i++)
3337 {
3338 fences[i] = context->createFence();
3339 }
3340 }
3341 }
3342 catch(std::bad_alloc&)
3343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003344 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003345 }
3346}
3347
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3349{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003350 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351
3352 try
3353 {
3354 if (n < 0)
3355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003356 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 }
3358
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003359 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360
3361 if (context)
3362 {
3363 for (int i = 0; i < n; i++)
3364 {
3365 framebuffers[i] = context->createFramebuffer();
3366 }
3367 }
3368 }
3369 catch(std::bad_alloc&)
3370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003371 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003372 }
3373}
3374
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003375void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3376{
3377 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3378
3379 try
3380 {
3381 if (n < 0)
3382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003383 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003384 }
3385
3386 gl::Context *context = gl::getNonLostContext();
3387
3388 if (context)
3389 {
3390 for (int i = 0; i < n; i++)
3391 {
3392 ids[i] = context->createQuery();
3393 }
3394 }
3395 }
3396 catch(std::bad_alloc&)
3397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003398 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003399 }
3400}
3401
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003402void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3403{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003404 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405
3406 try
3407 {
3408 if (n < 0)
3409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411 }
3412
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003413 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003414
3415 if (context)
3416 {
3417 for (int i = 0; i < n; i++)
3418 {
3419 renderbuffers[i] = context->createRenderbuffer();
3420 }
3421 }
3422 }
3423 catch(std::bad_alloc&)
3424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003425 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426 }
3427}
3428
3429void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3430{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003431 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432
3433 try
3434 {
3435 if (n < 0)
3436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003437 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438 }
3439
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003440 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441
3442 if (context)
3443 {
3444 for (int i = 0; i < n; i++)
3445 {
3446 textures[i] = context->createTexture();
3447 }
3448 }
3449 }
3450 catch(std::bad_alloc&)
3451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453 }
3454}
3455
daniel@transgaming.com85423182010-04-22 13:35:27 +00003456void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003458 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003459 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 program, index, bufsize, length, size, type, name);
3461
3462 try
3463 {
3464 if (bufsize < 0)
3465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003466 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003467 }
3468
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003470
3471 if (context)
3472 {
3473 gl::Program *programObject = context->getProgram(program);
3474
3475 if (!programObject)
3476 {
3477 if (context->getShader(program))
3478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003479 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003480 }
3481 else
3482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003484 }
3485 }
3486
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003487 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003489 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003490 }
3491
3492 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3493 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003494 }
3495 catch(std::bad_alloc&)
3496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003497 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003498 }
3499}
3500
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003501void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003503 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003504 "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 +00003505 program, index, bufsize, length, size, type, name);
3506
3507 try
3508 {
3509 if (bufsize < 0)
3510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003511 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003512 }
3513
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003514 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003515
3516 if (context)
3517 {
3518 gl::Program *programObject = context->getProgram(program);
3519
3520 if (!programObject)
3521 {
3522 if (context->getShader(program))
3523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003525 }
3526 else
3527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003528 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003529 }
3530 }
3531
3532 if (index >= (GLuint)programObject->getActiveUniformCount())
3533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003534 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003535 }
3536
3537 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003539 }
3540 catch(std::bad_alloc&)
3541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543 }
3544}
3545
3546void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003548 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 +00003549 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003550
3551 try
3552 {
3553 if (maxcount < 0)
3554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003556 }
3557
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003559
3560 if (context)
3561 {
3562 gl::Program *programObject = context->getProgram(program);
3563
3564 if (!programObject)
3565 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003566 if (context->getShader(program))
3567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003568 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003569 }
3570 else
3571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003572 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003573 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003574 }
3575
3576 return programObject->getAttachedShaders(maxcount, count, shaders);
3577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003578 }
3579 catch(std::bad_alloc&)
3580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003581 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003582 }
3583}
3584
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003585int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003587 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588
3589 try
3590 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592
3593 if (context)
3594 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003595
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003596 gl::Program *programObject = context->getProgram(program);
3597
3598 if (!programObject)
3599 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003600 if (context->getShader(program))
3601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003602 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003603 }
3604 else
3605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003606 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003607 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608 }
3609
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003610 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003611 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003613 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003614 }
3615
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003616 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617 }
3618 }
3619 catch(std::bad_alloc&)
3620 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622 }
3623
3624 return -1;
3625}
3626
3627void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3628{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003629 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630
3631 try
3632 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003633 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003634
3635 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003636 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003637 if (!(context->getBooleanv(pname, params)))
3638 {
3639 GLenum nativeType;
3640 unsigned int numParams = 0;
3641 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003643
3644 if (numParams == 0)
3645 return; // it is known that the pname is valid, but there are no parameters to return
3646
3647 if (nativeType == GL_FLOAT)
3648 {
3649 GLfloat *floatParams = NULL;
3650 floatParams = new GLfloat[numParams];
3651
3652 context->getFloatv(pname, floatParams);
3653
3654 for (unsigned int i = 0; i < numParams; ++i)
3655 {
3656 if (floatParams[i] == 0.0f)
3657 params[i] = GL_FALSE;
3658 else
3659 params[i] = GL_TRUE;
3660 }
3661
3662 delete [] floatParams;
3663 }
3664 else if (nativeType == GL_INT)
3665 {
3666 GLint *intParams = NULL;
3667 intParams = new GLint[numParams];
3668
3669 context->getIntegerv(pname, intParams);
3670
3671 for (unsigned int i = 0; i < numParams; ++i)
3672 {
3673 if (intParams[i] == 0)
3674 params[i] = GL_FALSE;
3675 else
3676 params[i] = GL_TRUE;
3677 }
3678
3679 delete [] intParams;
3680 }
3681 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003682 }
3683 }
3684 catch(std::bad_alloc&)
3685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003687 }
3688}
3689
3690void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003692 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 +00003693
3694 try
3695 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003696 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003697
3698 if (context)
3699 {
3700 gl::Buffer *buffer;
3701
3702 switch (target)
3703 {
3704 case GL_ARRAY_BUFFER:
3705 buffer = context->getArrayBuffer();
3706 break;
3707 case GL_ELEMENT_ARRAY_BUFFER:
3708 buffer = context->getElementArrayBuffer();
3709 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003710 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003711 }
3712
3713 if (!buffer)
3714 {
3715 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003716 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003717 }
3718
3719 switch (pname)
3720 {
3721 case GL_BUFFER_USAGE:
3722 *params = buffer->usage();
3723 break;
3724 case GL_BUFFER_SIZE:
3725 *params = buffer->size();
3726 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003727 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003728 }
3729 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003730 }
3731 catch(std::bad_alloc&)
3732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003733 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003734 }
3735}
3736
3737GLenum __stdcall glGetError(void)
3738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003739 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003740
3741 gl::Context *context = gl::getContext();
3742
3743 if (context)
3744 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003745 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003746 }
3747
3748 return GL_NO_ERROR;
3749}
3750
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003751void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3752{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003753 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003754
3755 try
3756 {
3757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003758 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003759
3760 if (context)
3761 {
3762 gl::Fence *fenceObject = context->getFence(fence);
3763
3764 if (fenceObject == NULL)
3765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003766 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003767 }
3768
3769 fenceObject->getFenceiv(pname, params);
3770 }
3771 }
3772 catch(std::bad_alloc&)
3773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003774 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003775 }
3776}
3777
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003780 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003781
3782 try
3783 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003784 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003785
3786 if (context)
3787 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003788 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003789 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003790 GLenum nativeType;
3791 unsigned int numParams = 0;
3792 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003793 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003794
3795 if (numParams == 0)
3796 return; // it is known that the pname is valid, but that there are no parameters to return.
3797
3798 if (nativeType == GL_BOOL)
3799 {
3800 GLboolean *boolParams = NULL;
3801 boolParams = new GLboolean[numParams];
3802
3803 context->getBooleanv(pname, boolParams);
3804
3805 for (unsigned int i = 0; i < numParams; ++i)
3806 {
3807 if (boolParams[i] == GL_FALSE)
3808 params[i] = 0.0f;
3809 else
3810 params[i] = 1.0f;
3811 }
3812
3813 delete [] boolParams;
3814 }
3815 else if (nativeType == GL_INT)
3816 {
3817 GLint *intParams = NULL;
3818 intParams = new GLint[numParams];
3819
3820 context->getIntegerv(pname, intParams);
3821
3822 for (unsigned int i = 0; i < numParams; ++i)
3823 {
3824 params[i] = (GLfloat)intParams[i];
3825 }
3826
3827 delete [] intParams;
3828 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003829 }
3830 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003831 }
3832 catch(std::bad_alloc&)
3833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003834 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835 }
3836}
3837
3838void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3839{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003840 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 +00003841 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003842
3843 try
3844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003845 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003846
3847 if (context)
3848 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003849 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003851 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003852 }
3853
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003854 gl::Framebuffer *framebuffer = NULL;
3855 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3856 {
3857 if(context->getReadFramebufferHandle() == 0)
3858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003859 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003860 }
3861
3862 framebuffer = context->getReadFramebuffer();
3863 }
3864 else
3865 {
3866 if (context->getDrawFramebufferHandle() == 0)
3867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003868 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003869 }
3870
3871 framebuffer = context->getDrawFramebuffer();
3872 }
3873
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003874 GLenum attachmentType;
3875 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003876
3877 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003878 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003879 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3880
3881 if (colorAttachment >= context->getMaximumRenderTargets())
3882 {
3883 return gl::error(GL_INVALID_ENUM);
3884 }
3885
3886 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3887 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3888 }
3889 else
3890 {
3891 switch (attachment)
3892 {
3893 case GL_DEPTH_ATTACHMENT:
3894 attachmentType = framebuffer->getDepthbufferType();
3895 attachmentHandle = framebuffer->getDepthbufferHandle();
3896 break;
3897 case GL_STENCIL_ATTACHMENT:
3898 attachmentType = framebuffer->getStencilbufferType();
3899 attachmentHandle = framebuffer->getStencilbufferHandle();
3900 break;
3901 default: return gl::error(GL_INVALID_ENUM);
3902 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003903 }
3904
3905 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003906 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003907 {
3908 attachmentObjectType = attachmentType;
3909 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003910 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003911 {
3912 attachmentObjectType = GL_TEXTURE;
3913 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003914 else
3915 {
3916 UNREACHABLE();
3917 return;
3918 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003919
3920 switch (pname)
3921 {
3922 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3923 *params = attachmentObjectType;
3924 break;
3925 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3926 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3927 {
3928 *params = attachmentHandle;
3929 }
3930 else
3931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003932 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003933 }
3934 break;
3935 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3936 if (attachmentObjectType == GL_TEXTURE)
3937 {
3938 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3939 }
3940 else
3941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003942 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003943 }
3944 break;
3945 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3946 if (attachmentObjectType == GL_TEXTURE)
3947 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003948 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003949 {
3950 *params = attachmentType;
3951 }
3952 else
3953 {
3954 *params = 0;
3955 }
3956 }
3957 else
3958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003959 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003960 }
3961 break;
3962 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003964 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965 }
3966 }
3967 catch(std::bad_alloc&)
3968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003970 }
3971}
3972
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003973GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3974{
3975 EVENT("()");
3976
3977 try
3978 {
3979 gl::Context *context = gl::getContext();
3980
3981 if (context)
3982 {
3983 return context->getResetStatus();
3984 }
3985
3986 return GL_NO_ERROR;
3987 }
3988 catch(std::bad_alloc&)
3989 {
3990 return GL_OUT_OF_MEMORY;
3991 }
3992}
3993
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003996 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997
3998 try
3999 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004000 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001
4002 if (context)
4003 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004004 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004005 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004006 GLenum nativeType;
4007 unsigned int numParams = 0;
4008 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004011 if (numParams == 0)
4012 return; // it is known that pname is valid, but there are no parameters to return
4013
4014 if (nativeType == GL_BOOL)
4015 {
4016 GLboolean *boolParams = NULL;
4017 boolParams = new GLboolean[numParams];
4018
4019 context->getBooleanv(pname, boolParams);
4020
4021 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004023 if (boolParams[i] == GL_FALSE)
4024 params[i] = 0;
4025 else
4026 params[i] = 1;
4027 }
4028
4029 delete [] boolParams;
4030 }
4031 else if (nativeType == GL_FLOAT)
4032 {
4033 GLfloat *floatParams = NULL;
4034 floatParams = new GLfloat[numParams];
4035
4036 context->getFloatv(pname, floatParams);
4037
4038 for (unsigned int i = 0; i < numParams; ++i)
4039 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00004040 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 +00004041 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004042 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004044 else
4045 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 +00004046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047
daniel@transgaming.com777f2672010-04-07 03:25:16 +00004048 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004049 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004050 }
4051 }
4052 }
4053 catch(std::bad_alloc&)
4054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004056 }
4057}
4058
4059void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
4060{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004061 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004062
4063 try
4064 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004066
4067 if (context)
4068 {
4069 gl::Program *programObject = context->getProgram(program);
4070
4071 if (!programObject)
4072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074 }
4075
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004076 if (context->getClientVersion() < 3)
4077 {
4078 switch (pname)
4079 {
4080 case GL_ACTIVE_UNIFORM_BLOCKS:
4081 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4082 return gl::error(GL_INVALID_ENUM);
4083 }
4084 }
4085
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004086 switch (pname)
4087 {
4088 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004089 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004090 return;
4091 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004092 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004093 return;
4094 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004095 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004096 return;
4097 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004098 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004099 return;
4100 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004101 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004102 return;
4103 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004104 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105 return;
4106 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004107 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108 return;
4109 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004110 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111 return;
4112 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004113 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004114 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004115 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004116 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004117 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004118 case GL_ACTIVE_UNIFORM_BLOCKS:
4119 *params = programObject->getActiveUniformBlockCount();
4120 return;
4121 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4122 *params = programObject->getActiveUniformBlockMaxLength();
4123 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004124 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004126 }
4127 }
4128 }
4129 catch(std::bad_alloc&)
4130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004132 }
4133}
4134
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004135void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004137 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 +00004138 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004139
4140 try
4141 {
4142 if (bufsize < 0)
4143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004144 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145 }
4146
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004148
4149 if (context)
4150 {
4151 gl::Program *programObject = context->getProgram(program);
4152
4153 if (!programObject)
4154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004155 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004156 }
4157
4158 programObject->getInfoLog(bufsize, length, infolog);
4159 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004160 }
4161 catch(std::bad_alloc&)
4162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004163 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164 }
4165}
4166
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004167void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4168{
4169 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4170
4171 try
4172 {
4173 switch (pname)
4174 {
4175 case GL_CURRENT_QUERY_EXT:
4176 break;
4177 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004178 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004179 }
4180
4181 gl::Context *context = gl::getNonLostContext();
4182
4183 if (context)
4184 {
4185 params[0] = context->getActiveQuery(target);
4186 }
4187 }
4188 catch(std::bad_alloc&)
4189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004191 }
4192}
4193
4194void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4195{
4196 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4197
4198 try
4199 {
4200 switch (pname)
4201 {
4202 case GL_QUERY_RESULT_EXT:
4203 case GL_QUERY_RESULT_AVAILABLE_EXT:
4204 break;
4205 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004206 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004207 }
4208 gl::Context *context = gl::getNonLostContext();
4209
4210 if (context)
4211 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004212 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4213
4214 if (!queryObject)
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 if (context->getActiveQuery(queryObject->getType()) == id)
4220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004221 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004222 }
4223
4224 switch(pname)
4225 {
4226 case GL_QUERY_RESULT_EXT:
4227 params[0] = queryObject->getResult();
4228 break;
4229 case GL_QUERY_RESULT_AVAILABLE_EXT:
4230 params[0] = queryObject->isResultAvailable();
4231 break;
4232 default:
4233 ASSERT(false);
4234 }
4235 }
4236 }
4237 catch(std::bad_alloc&)
4238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004240 }
4241}
4242
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004243void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004245 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 +00004246
4247 try
4248 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004249 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004250
4251 if (context)
4252 {
4253 if (target != GL_RENDERBUFFER)
4254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004255 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004256 }
4257
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004258 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004261 }
4262
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004263 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004264
4265 switch (pname)
4266 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004267 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4268 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4269 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4270 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4271 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4272 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4273 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4274 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4275 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004276 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004277 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004278 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004279 *params = renderbuffer->getSamples();
4280 }
4281 else
4282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004283 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004284 }
4285 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004286 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004287 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004288 }
4289 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004290 }
4291 catch(std::bad_alloc&)
4292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004293 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004294 }
4295}
4296
4297void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4298{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004299 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004300
4301 try
4302 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004303 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004304
4305 if (context)
4306 {
4307 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004308
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004309 if (!shaderObject)
4310 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004311 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004312 }
4313
4314 switch (pname)
4315 {
4316 case GL_SHADER_TYPE:
4317 *params = shaderObject->getType();
4318 return;
4319 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004320 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 return;
4322 case GL_COMPILE_STATUS:
4323 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4324 return;
4325 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004326 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 return;
4328 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004329 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004331 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4332 *params = shaderObject->getTranslatedSourceLength();
4333 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004335 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004336 }
4337 }
4338 }
4339 catch(std::bad_alloc&)
4340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004341 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 }
4343}
4344
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004345void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004346{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004347 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 +00004348 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349
4350 try
4351 {
4352 if (bufsize < 0)
4353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004354 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004355 }
4356
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004358
4359 if (context)
4360 {
4361 gl::Shader *shaderObject = context->getShader(shader);
4362
4363 if (!shaderObject)
4364 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004365 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004366 }
4367
4368 shaderObject->getInfoLog(bufsize, length, infolog);
4369 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004370 }
4371 catch(std::bad_alloc&)
4372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004373 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374 }
4375}
4376
4377void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4378{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004379 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 +00004380 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381
4382 try
4383 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004384 switch (shadertype)
4385 {
4386 case GL_VERTEX_SHADER:
4387 case GL_FRAGMENT_SHADER:
4388 break;
4389 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004390 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004391 }
4392
4393 switch (precisiontype)
4394 {
4395 case GL_LOW_FLOAT:
4396 case GL_MEDIUM_FLOAT:
4397 case GL_HIGH_FLOAT:
4398 // Assume IEEE 754 precision
4399 range[0] = 127;
4400 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004401 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004402 break;
4403 case GL_LOW_INT:
4404 case GL_MEDIUM_INT:
4405 case GL_HIGH_INT:
4406 // Some (most) hardware only supports single-precision floating-point numbers,
4407 // which can accurately represent integers up to +/-16777216
4408 range[0] = 24;
4409 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004410 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004411 break;
4412 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004413 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004414 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415 }
4416 catch(std::bad_alloc&)
4417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004418 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004419 }
4420}
4421
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004422void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004424 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 +00004425 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004426
4427 try
4428 {
4429 if (bufsize < 0)
4430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004431 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004432 }
4433
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004434 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004435
4436 if (context)
4437 {
4438 gl::Shader *shaderObject = context->getShader(shader);
4439
4440 if (!shaderObject)
4441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004442 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004443 }
4444
4445 shaderObject->getSource(bufsize, length, source);
4446 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004447 }
4448 catch(std::bad_alloc&)
4449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004450 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451 }
4452}
4453
zmo@google.coma574f782011-10-03 21:45:23 +00004454void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4455{
4456 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4457 shader, bufsize, length, source);
4458
4459 try
4460 {
4461 if (bufsize < 0)
4462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004463 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004464 }
4465
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004466 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004467
4468 if (context)
4469 {
4470 gl::Shader *shaderObject = context->getShader(shader);
4471
4472 if (!shaderObject)
4473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004474 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004475 }
4476
4477 shaderObject->getTranslatedSource(bufsize, length, source);
4478 }
4479 }
4480 catch(std::bad_alloc&)
4481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004482 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004483 }
4484}
4485
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004486const GLubyte* __stdcall glGetString(GLenum name)
4487{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004488 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004489
4490 try
4491 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004493
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494 switch (name)
4495 {
4496 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004497 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004499 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004500 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004501 if (context->getClientVersion() == 2)
4502 {
4503 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4504 }
4505 else
4506 {
4507 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004509 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004510 if (context->getClientVersion() == 2)
4511 {
4512 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4513 }
4514 else
4515 {
4516 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004518 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004519 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004521 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 }
4523 }
4524 catch(std::bad_alloc&)
4525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004526 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528}
4529
4530void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004532 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 +00004533
4534 try
4535 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004537
4538 if (context)
4539 {
4540 gl::Texture *texture;
4541
4542 switch (target)
4543 {
4544 case GL_TEXTURE_2D:
4545 texture = context->getTexture2D();
4546 break;
4547 case GL_TEXTURE_CUBE_MAP:
4548 texture = context->getTextureCubeMap();
4549 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004550 case GL_TEXTURE_3D:
4551 if (context->getClientVersion() < 3)
4552 {
4553 return gl::error(GL_INVALID_ENUM);
4554 }
4555 texture = context->getTexture3D();
4556 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004557 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004558 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004559 }
4560
4561 switch (pname)
4562 {
4563 case GL_TEXTURE_MAG_FILTER:
4564 *params = (GLfloat)texture->getMagFilter();
4565 break;
4566 case GL_TEXTURE_MIN_FILTER:
4567 *params = (GLfloat)texture->getMinFilter();
4568 break;
4569 case GL_TEXTURE_WRAP_S:
4570 *params = (GLfloat)texture->getWrapS();
4571 break;
4572 case GL_TEXTURE_WRAP_T:
4573 *params = (GLfloat)texture->getWrapT();
4574 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004575 case GL_TEXTURE_WRAP_R:
4576 if (context->getClientVersion() < 3)
4577 {
4578 return gl::error(GL_INVALID_ENUM);
4579 }
4580 *params = (GLfloat)texture->getWrapR();
4581 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004582 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4583 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4584 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004585 case GL_TEXTURE_USAGE_ANGLE:
4586 *params = (GLfloat)texture->getUsage();
4587 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004588 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4589 if (!context->supportsTextureFilterAnisotropy())
4590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004591 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004592 }
4593 *params = (GLfloat)texture->getMaxAnisotropy();
4594 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004595 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004596 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004597 }
4598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004599 }
4600 catch(std::bad_alloc&)
4601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603 }
4604}
4605
4606void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004608 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 +00004609
4610 try
4611 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004613
4614 if (context)
4615 {
4616 gl::Texture *texture;
4617
4618 switch (target)
4619 {
4620 case GL_TEXTURE_2D:
4621 texture = context->getTexture2D();
4622 break;
4623 case GL_TEXTURE_CUBE_MAP:
4624 texture = context->getTextureCubeMap();
4625 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004626 case GL_TEXTURE_3D:
4627 if (context->getClientVersion() < 3)
4628 {
4629 return gl::error(GL_INVALID_ENUM);
4630 }
4631 texture = context->getTexture3D();
4632 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004633 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004635 }
4636
4637 switch (pname)
4638 {
4639 case GL_TEXTURE_MAG_FILTER:
4640 *params = texture->getMagFilter();
4641 break;
4642 case GL_TEXTURE_MIN_FILTER:
4643 *params = texture->getMinFilter();
4644 break;
4645 case GL_TEXTURE_WRAP_S:
4646 *params = texture->getWrapS();
4647 break;
4648 case GL_TEXTURE_WRAP_T:
4649 *params = texture->getWrapT();
4650 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004651 case GL_TEXTURE_WRAP_R:
4652 if (context->getClientVersion() < 3)
4653 {
4654 return gl::error(GL_INVALID_ENUM);
4655 }
4656 *params = texture->getWrapR();
4657 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004658 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4659 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4660 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004661 case GL_TEXTURE_USAGE_ANGLE:
4662 *params = texture->getUsage();
4663 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004664 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4665 if (!context->supportsTextureFilterAnisotropy())
4666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004667 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004668 }
4669 *params = (GLint)texture->getMaxAnisotropy();
4670 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004671 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004672 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004673 }
4674 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675 }
4676 catch(std::bad_alloc&)
4677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004678 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679 }
4680}
4681
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004682void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4683{
4684 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4685 program, location, bufSize, params);
4686
4687 try
4688 {
4689 if (bufSize < 0)
4690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004691 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004692 }
4693
4694 gl::Context *context = gl::getNonLostContext();
4695
4696 if (context)
4697 {
4698 if (program == 0)
4699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004701 }
4702
4703 gl::Program *programObject = context->getProgram(program);
4704
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004705 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004707 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004708 }
4709
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004710 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4711 if (!programBinary)
4712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004713 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004714 }
4715
4716 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004718 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004719 }
4720 }
4721 }
4722 catch(std::bad_alloc&)
4723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004724 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004725 }
4726}
4727
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4729{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004730 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004731
4732 try
4733 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004734 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004735
4736 if (context)
4737 {
4738 if (program == 0)
4739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004740 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004741 }
4742
4743 gl::Program *programObject = context->getProgram(program);
4744
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004745 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004747 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004748 }
4749
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004750 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4751 if (!programBinary)
4752 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004753 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004754 }
4755
4756 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004758 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004759 }
4760 }
4761 }
4762 catch(std::bad_alloc&)
4763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004764 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004765 }
4766}
4767
4768void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4769{
4770 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4771 program, location, bufSize, params);
4772
4773 try
4774 {
4775 if (bufSize < 0)
4776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004777 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004778 }
4779
4780 gl::Context *context = gl::getNonLostContext();
4781
4782 if (context)
4783 {
4784 if (program == 0)
4785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004787 }
4788
4789 gl::Program *programObject = context->getProgram(program);
4790
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004791 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004793 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004794 }
4795
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004796 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4797 if (!programBinary)
4798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004799 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004800 }
4801
4802 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004804 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004805 }
4806 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004807 }
4808 catch(std::bad_alloc&)
4809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004810 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811 }
4812}
4813
4814void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004816 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817
4818 try
4819 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004821
4822 if (context)
4823 {
4824 if (program == 0)
4825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004826 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004827 }
4828
4829 gl::Program *programObject = context->getProgram(program);
4830
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004831 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004833 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004834 }
4835
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004836 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4837 if (!programBinary)
4838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004839 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004840 }
4841
4842 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004844 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004845 }
4846 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847 }
4848 catch(std::bad_alloc&)
4849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004850 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004851 }
4852}
4853
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004854int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004856 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857
4858 try
4859 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861
4862 if (strstr(name, "gl_") == name)
4863 {
4864 return -1;
4865 }
4866
4867 if (context)
4868 {
4869 gl::Program *programObject = context->getProgram(program);
4870
4871 if (!programObject)
4872 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004873 if (context->getShader(program))
4874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004875 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004876 }
4877 else
4878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004879 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004880 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881 }
4882
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004883 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004884 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004886 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004887 }
4888
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004889 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004890 }
4891 }
4892 catch(std::bad_alloc&)
4893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004894 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004895 }
4896
4897 return -1;
4898}
4899
4900void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4901{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004902 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004903
4904 try
4905 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004906 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004907
daniel@transgaming.come0078962010-04-15 20:45:08 +00004908 if (context)
4909 {
4910 if (index >= gl::MAX_VERTEX_ATTRIBS)
4911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004912 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004913 }
4914
daniel@transgaming.com83921382011-01-08 05:46:00 +00004915 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004916
daniel@transgaming.come0078962010-04-15 20:45:08 +00004917 switch (pname)
4918 {
4919 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004920 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004921 break;
4922 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004923 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004924 break;
4925 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004926 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004927 break;
4928 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004929 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004930 break;
4931 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004932 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004933 break;
4934 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004935 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004936 break;
4937 case GL_CURRENT_VERTEX_ATTRIB:
4938 for (int i = 0; i < 4; ++i)
4939 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004940 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004941 }
4942 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004943 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4944 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4945 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004946 *params = (GLfloat)attribState.mDivisor;
4947 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004948 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004949 }
4950 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951 }
4952 catch(std::bad_alloc&)
4953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004954 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
4956}
4957
4958void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4959{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004960 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004961
4962 try
4963 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004964 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004965
daniel@transgaming.come0078962010-04-15 20:45:08 +00004966 if (context)
4967 {
4968 if (index >= gl::MAX_VERTEX_ATTRIBS)
4969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004970 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004971 }
4972
daniel@transgaming.com83921382011-01-08 05:46:00 +00004973 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004974
daniel@transgaming.come0078962010-04-15 20:45:08 +00004975 switch (pname)
4976 {
4977 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004978 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004979 break;
4980 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004981 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004982 break;
4983 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004984 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004985 break;
4986 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004987 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004988 break;
4989 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004990 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004991 break;
4992 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004993 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004994 break;
4995 case GL_CURRENT_VERTEX_ATTRIB:
4996 for (int i = 0; i < 4; ++i)
4997 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004998 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004999 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
5000 }
5001 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00005002 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
5003 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
5004 // the same constant.
5005 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00005006 *params = (GLint)attribState.mDivisor;
5007 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005008 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005009 }
5010 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011 }
5012 catch(std::bad_alloc&)
5013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005015 }
5016}
5017
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005018void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005020 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005021
5022 try
5023 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005024 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025
daniel@transgaming.come0078962010-04-15 20:45:08 +00005026 if (context)
5027 {
5028 if (index >= gl::MAX_VERTEX_ATTRIBS)
5029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005031 }
5032
5033 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
5034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00005036 }
5037
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005038 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00005039 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040 }
5041 catch(std::bad_alloc&)
5042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005043 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005044 }
5045}
5046
5047void __stdcall glHint(GLenum target, GLenum mode)
5048{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005049 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005050
5051 try
5052 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005053 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005054 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005055 case GL_FASTEST:
5056 case GL_NICEST:
5057 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005058 break;
5059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005061 }
5062
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005063 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005064 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005065 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00005066 case GL_GENERATE_MIPMAP_HINT:
5067 if (context) context->setGenerateMipmapHint(mode);
5068 break;
5069 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
5070 if (context) context->setFragmentShaderDerivativeHint(mode);
5071 break;
5072 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00005074 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005075 }
5076 catch(std::bad_alloc&)
5077 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005078 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005079 }
5080}
5081
5082GLboolean __stdcall glIsBuffer(GLuint buffer)
5083{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005084 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085
5086 try
5087 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005089
5090 if (context && buffer)
5091 {
5092 gl::Buffer *bufferObject = context->getBuffer(buffer);
5093
5094 if (bufferObject)
5095 {
5096 return GL_TRUE;
5097 }
5098 }
5099 }
5100 catch(std::bad_alloc&)
5101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005102 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103 }
5104
5105 return GL_FALSE;
5106}
5107
5108GLboolean __stdcall glIsEnabled(GLenum cap)
5109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005110 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005111
5112 try
5113 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005114 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005115
5116 if (context)
5117 {
5118 switch (cap)
5119 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005120 case GL_CULL_FACE: return context->isCullFaceEnabled();
5121 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5122 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5123 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5124 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5125 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5126 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5127 case GL_BLEND: return context->isBlendEnabled();
5128 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005129 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005130 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005131 }
5132 }
5133 }
5134 catch(std::bad_alloc&)
5135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005136 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005137 }
5138
5139 return false;
5140}
5141
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005142GLboolean __stdcall glIsFenceNV(GLuint fence)
5143{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005144 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005145
5146 try
5147 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005148 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005149
5150 if (context)
5151 {
5152 gl::Fence *fenceObject = context->getFence(fence);
5153
5154 if (fenceObject == NULL)
5155 {
5156 return GL_FALSE;
5157 }
5158
5159 return fenceObject->isFence();
5160 }
5161 }
5162 catch(std::bad_alloc&)
5163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005164 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005165 }
5166
5167 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005168}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005169
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5171{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005172 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005173
5174 try
5175 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005176 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177
5178 if (context && framebuffer)
5179 {
5180 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5181
5182 if (framebufferObject)
5183 {
5184 return GL_TRUE;
5185 }
5186 }
5187 }
5188 catch(std::bad_alloc&)
5189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005190 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005191 }
5192
5193 return GL_FALSE;
5194}
5195
5196GLboolean __stdcall glIsProgram(GLuint program)
5197{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005198 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005199
5200 try
5201 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005202 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203
5204 if (context && program)
5205 {
5206 gl::Program *programObject = context->getProgram(program);
5207
5208 if (programObject)
5209 {
5210 return GL_TRUE;
5211 }
5212 }
5213 }
5214 catch(std::bad_alloc&)
5215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005216 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217 }
5218
5219 return GL_FALSE;
5220}
5221
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005222GLboolean __stdcall glIsQueryEXT(GLuint id)
5223{
5224 EVENT("(GLuint id = %d)", id);
5225
5226 try
5227 {
5228 if (id == 0)
5229 {
5230 return GL_FALSE;
5231 }
5232
5233 gl::Context *context = gl::getNonLostContext();
5234
5235 if (context)
5236 {
5237 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5238
5239 if (queryObject)
5240 {
5241 return GL_TRUE;
5242 }
5243 }
5244 }
5245 catch(std::bad_alloc&)
5246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005248 }
5249
5250 return GL_FALSE;
5251}
5252
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5254{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005255 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256
5257 try
5258 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005259 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005260
5261 if (context && renderbuffer)
5262 {
5263 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5264
5265 if (renderbufferObject)
5266 {
5267 return GL_TRUE;
5268 }
5269 }
5270 }
5271 catch(std::bad_alloc&)
5272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005273 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 }
5275
5276 return GL_FALSE;
5277}
5278
5279GLboolean __stdcall glIsShader(GLuint shader)
5280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005281 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005282
5283 try
5284 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286
5287 if (context && shader)
5288 {
5289 gl::Shader *shaderObject = context->getShader(shader);
5290
5291 if (shaderObject)
5292 {
5293 return GL_TRUE;
5294 }
5295 }
5296 }
5297 catch(std::bad_alloc&)
5298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005299 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005300 }
5301
5302 return GL_FALSE;
5303}
5304
5305GLboolean __stdcall glIsTexture(GLuint texture)
5306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005307 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308
5309 try
5310 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005312
5313 if (context && texture)
5314 {
5315 gl::Texture *textureObject = context->getTexture(texture);
5316
5317 if (textureObject)
5318 {
5319 return GL_TRUE;
5320 }
5321 }
5322 }
5323 catch(std::bad_alloc&)
5324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005325 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 }
5327
5328 return GL_FALSE;
5329}
5330
5331void __stdcall glLineWidth(GLfloat width)
5332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005333 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005334
5335 try
5336 {
5337 if (width <= 0.0f)
5338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005340 }
5341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005343
5344 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005345 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005346 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347 }
5348 }
5349 catch(std::bad_alloc&)
5350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005351 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005352 }
5353}
5354
5355void __stdcall glLinkProgram(GLuint program)
5356{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005357 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005358
5359 try
5360 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005361 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005362
5363 if (context)
5364 {
5365 gl::Program *programObject = context->getProgram(program);
5366
5367 if (!programObject)
5368 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005369 if (context->getShader(program))
5370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005371 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005372 }
5373 else
5374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005376 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005377 }
5378
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005379 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381 }
5382 catch(std::bad_alloc&)
5383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005385 }
5386}
5387
5388void __stdcall glPixelStorei(GLenum pname, GLint param)
5389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005390 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005391
5392 try
5393 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005394 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005395
5396 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005397 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005398 switch (pname)
5399 {
5400 case GL_UNPACK_ALIGNMENT:
5401 if (param != 1 && param != 2 && param != 4 && param != 8)
5402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005404 }
5405
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005406 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005407 break;
5408
5409 case GL_PACK_ALIGNMENT:
5410 if (param != 1 && param != 2 && param != 4 && param != 8)
5411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005412 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005413 }
5414
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005415 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005416 break;
5417
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005418 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5419 context->setPackReverseRowOrder(param != 0);
5420 break;
5421
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005422 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426 }
5427 catch(std::bad_alloc&)
5428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005430 }
5431}
5432
5433void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005435 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436
5437 try
5438 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005440
5441 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005443 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005444 }
5445 }
5446 catch(std::bad_alloc&)
5447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005449 }
5450}
5451
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005452void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5453 GLenum format, GLenum type, GLsizei bufSize,
5454 GLvoid *data)
5455{
5456 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5457 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5458 x, y, width, height, format, type, bufSize, data);
5459
5460 try
5461 {
5462 if (width < 0 || height < 0 || bufSize < 0)
5463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005465 }
5466
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005467 gl::Context *context = gl::getNonLostContext();
5468
5469 if (context)
5470 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005471 GLenum currentFormat, currentType;
5472
5473 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5474 // and attempting to read back if that's the case is an error. The error will be registered
5475 // by getCurrentReadFormat.
5476 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5477 return;
5478
5479 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005482 }
5483
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005484 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5485 }
5486 }
5487 catch(std::bad_alloc&)
5488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005490 }
5491}
5492
5493void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5494 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005495{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005496 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005497 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005498 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499
5500 try
5501 {
5502 if (width < 0 || height < 0)
5503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005504 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005505 }
5506
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005508
5509 if (context)
5510 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005511 GLenum currentFormat, currentType;
5512
5513 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5514 // and attempting to read back if that's the case is an error. The error will be registered
5515 // by getCurrentReadFormat.
5516 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5517 return;
5518
5519 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005522 }
5523
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005524 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 }
5526 }
5527 catch(std::bad_alloc&)
5528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 }
5531}
5532
5533void __stdcall glReleaseShaderCompiler(void)
5534{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005535 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536
5537 try
5538 {
5539 gl::Shader::releaseCompiler();
5540 }
5541 catch(std::bad_alloc&)
5542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005544 }
5545}
5546
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005547void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005549 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 +00005550 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005551
5552 try
5553 {
5554 switch (target)
5555 {
5556 case GL_RENDERBUFFER:
5557 break;
5558 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005559 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005560 }
5561
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005562 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005564 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005565 }
5566
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005567 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005568
5569 if (context)
5570 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005571 if (!gl::IsValidInternalFormat(internalformat, context))
5572 {
5573 return gl::error(GL_INVALID_ENUM);
5574 }
5575
5576 if (!gl::IsColorRenderingSupported(internalformat, context) &&
5577 !gl::IsDepthRenderingSupported(internalformat, context) &&
5578 !gl::IsStencilRenderingSupported(internalformat, context))
5579 {
5580 return gl::error(GL_INVALID_ENUM);
5581 }
5582
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005583 if (width > context->getMaximumRenderbufferDimension() ||
5584 height > context->getMaximumRenderbufferDimension() ||
5585 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005587 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005588 }
5589
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005590 GLuint handle = context->getRenderbufferHandle();
5591 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005594 }
5595
5596 switch (internalformat)
5597 {
5598 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005599 case GL_RGBA4:
5600 case GL_RGB5_A1:
5601 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005602 case GL_RGB8_OES:
5603 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005605 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005606 break;
5607 case GL_SRGB8_ALPHA8:
5608 case GL_RGB10_A2:
5609 case GL_RG8:
5610 case GL_R8:
5611 if (context->getClientVersion() < 3)
5612 {
5613 return gl::error(GL_INVALID_ENUM);
5614 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005615 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005616 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005619
5620 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 }
5622 }
5623 catch(std::bad_alloc&)
5624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626 }
5627}
5628
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005629void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5630{
5631 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5632}
5633
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005634void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5635{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005636 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637
5638 try
5639 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005640 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005641
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642 if (context)
5643 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005644 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005645 }
5646 }
5647 catch(std::bad_alloc&)
5648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005649 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650 }
5651}
5652
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005653void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5654{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005655 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005656
5657 try
5658 {
5659 if (condition != GL_ALL_COMPLETED_NV)
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005662 }
5663
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005664 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005665
5666 if (context)
5667 {
5668 gl::Fence *fenceObject = context->getFence(fence);
5669
5670 if (fenceObject == NULL)
5671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005672 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005673 }
5674
5675 fenceObject->setFence(condition);
5676 }
5677 }
5678 catch(std::bad_alloc&)
5679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005681 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005682}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005683
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005684void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5685{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005686 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 +00005687
5688 try
5689 {
5690 if (width < 0 || height < 0)
5691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005692 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005693 }
5694
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005695 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005696
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005697 if (context)
5698 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005699 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 }
5702 catch(std::bad_alloc&)
5703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005704 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005705 }
5706}
5707
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005708void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005709{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005710 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005711 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005712 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005713
5714 try
5715 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005716 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005717 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005718 }
5719 catch(std::bad_alloc&)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723}
5724
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005725void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005727 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 +00005728 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005729
5730 try
5731 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005732 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005735 }
5736
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005737 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005738
5739 if (context)
5740 {
5741 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005742
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005743 if (!shaderObject)
5744 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005745 if (context->getProgram(shader))
5746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005747 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005748 }
5749 else
5750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005752 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753 }
5754
5755 shaderObject->setSource(count, string, length);
5756 }
5757 }
5758 catch(std::bad_alloc&)
5759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005760 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005761 }
5762}
5763
5764void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5765{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005766 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005767}
5768
5769void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5770{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005771 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 +00005772
5773 try
5774 {
5775 switch (face)
5776 {
5777 case GL_FRONT:
5778 case GL_BACK:
5779 case GL_FRONT_AND_BACK:
5780 break;
5781 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005782 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005783 }
5784
5785 switch (func)
5786 {
5787 case GL_NEVER:
5788 case GL_ALWAYS:
5789 case GL_LESS:
5790 case GL_LEQUAL:
5791 case GL_EQUAL:
5792 case GL_GEQUAL:
5793 case GL_GREATER:
5794 case GL_NOTEQUAL:
5795 break;
5796 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005798 }
5799
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005800 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801
5802 if (context)
5803 {
5804 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5805 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005806 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005807 }
5808
5809 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5810 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005811 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005812 }
5813 }
5814 }
5815 catch(std::bad_alloc&)
5816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005818 }
5819}
5820
5821void __stdcall glStencilMask(GLuint mask)
5822{
5823 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5824}
5825
5826void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5827{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005828 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005829
5830 try
5831 {
5832 switch (face)
5833 {
5834 case GL_FRONT:
5835 case GL_BACK:
5836 case GL_FRONT_AND_BACK:
5837 break;
5838 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005840 }
5841
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005842 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843
5844 if (context)
5845 {
5846 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5847 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005848 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849 }
5850
5851 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5852 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005853 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005854 }
5855 }
5856 }
5857 catch(std::bad_alloc&)
5858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 }
5861}
5862
5863void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5864{
5865 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5866}
5867
5868void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005870 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 +00005871 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005872
5873 try
5874 {
5875 switch (face)
5876 {
5877 case GL_FRONT:
5878 case GL_BACK:
5879 case GL_FRONT_AND_BACK:
5880 break;
5881 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005882 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005883 }
5884
5885 switch (fail)
5886 {
5887 case GL_ZERO:
5888 case GL_KEEP:
5889 case GL_REPLACE:
5890 case GL_INCR:
5891 case GL_DECR:
5892 case GL_INVERT:
5893 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005894 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005895 break;
5896 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005897 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005898 }
5899
5900 switch (zfail)
5901 {
5902 case GL_ZERO:
5903 case GL_KEEP:
5904 case GL_REPLACE:
5905 case GL_INCR:
5906 case GL_DECR:
5907 case GL_INVERT:
5908 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005909 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005910 break;
5911 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005912 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005913 }
5914
5915 switch (zpass)
5916 {
5917 case GL_ZERO:
5918 case GL_KEEP:
5919 case GL_REPLACE:
5920 case GL_INCR:
5921 case GL_DECR:
5922 case GL_INVERT:
5923 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005924 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005925 break;
5926 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928 }
5929
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931
5932 if (context)
5933 {
5934 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5935 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005936 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 }
5938
5939 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5940 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005941 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005942 }
5943 }
5944 }
5945 catch(std::bad_alloc&)
5946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005947 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005948 }
5949}
5950
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005951GLboolean __stdcall glTestFenceNV(GLuint fence)
5952{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005953 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005954
5955 try
5956 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005957 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005958
5959 if (context)
5960 {
5961 gl::Fence *fenceObject = context->getFence(fence);
5962
5963 if (fenceObject == NULL)
5964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005966 }
5967
5968 return fenceObject->testFence();
5969 }
5970 }
5971 catch(std::bad_alloc&)
5972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005974 }
5975
5976 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005977}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005978
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005979void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5980 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005982 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 +00005983 "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 +00005984 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005985
5986 try
5987 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005988 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005990 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005991 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005992
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005993 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005995 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005996 }
5997
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005998 // validate <type> by itself (used as secondary key below)
5999 switch (type)
6000 {
6001 case GL_UNSIGNED_BYTE:
6002 case GL_UNSIGNED_SHORT_5_6_5:
6003 case GL_UNSIGNED_SHORT_4_4_4_4:
6004 case GL_UNSIGNED_SHORT_5_5_5_1:
6005 case GL_UNSIGNED_SHORT:
6006 case GL_UNSIGNED_INT:
6007 case GL_UNSIGNED_INT_24_8_OES:
6008 case GL_HALF_FLOAT_OES:
6009 case GL_FLOAT:
6010 break;
6011 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00006013 }
6014
6015 // validate <format> + <type> combinations
6016 // - invalid <format> -> sets INVALID_ENUM
6017 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006018 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 {
6020 case GL_ALPHA:
6021 case GL_LUMINANCE:
6022 case GL_LUMINANCE_ALPHA:
6023 switch (type)
6024 {
6025 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006026 case GL_FLOAT:
6027 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006028 break;
6029 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006030 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006031 }
6032 break;
6033 case GL_RGB:
6034 switch (type)
6035 {
6036 case GL_UNSIGNED_BYTE:
6037 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006038 case GL_FLOAT:
6039 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006040 break;
6041 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006042 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006043 }
6044 break;
6045 case GL_RGBA:
6046 switch (type)
6047 {
6048 case GL_UNSIGNED_BYTE:
6049 case GL_UNSIGNED_SHORT_4_4_4_4:
6050 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006051 case GL_FLOAT:
6052 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006053 break;
6054 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006056 }
6057 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00006058 case GL_BGRA_EXT:
6059 switch (type)
6060 {
6061 case GL_UNSIGNED_BYTE:
6062 break;
6063 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006064 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00006065 }
6066 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006067 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
6068 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00006069 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6070 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00006071 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006072 case GL_DEPTH_COMPONENT:
6073 switch (type)
6074 {
6075 case GL_UNSIGNED_SHORT:
6076 case GL_UNSIGNED_INT:
6077 break;
6078 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006079 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006080 }
6081 break;
6082 case GL_DEPTH_STENCIL_OES:
6083 switch (type)
6084 {
6085 case GL_UNSIGNED_INT_24_8_OES:
6086 break;
6087 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006088 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006089 }
6090 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006091 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006092 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006093 }
6094
6095 if (border != 0)
6096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006097 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006098 }
6099
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006100 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006101
6102 if (context)
6103 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006104 if (level > context->getMaximumTextureLevel())
6105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006106 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006107 }
6108
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006109 switch (target)
6110 {
6111 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006112 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6113 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006115 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006116 }
6117 break;
6118 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6119 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6120 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6121 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6122 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6123 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6124 if (width != height)
6125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006126 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006127 }
6128
6129 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6130 height > (context->getMaximumCubeTextureDimension() >> level))
6131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006132 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006133 }
6134 break;
6135 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006136 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006137 }
6138
gman@chromium.org50c526d2011-08-10 05:19:44 +00006139 switch (format) {
6140 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6141 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6142 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006144 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006145 }
6146 else
6147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006148 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006149 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006150 break;
6151 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6152 if (context->supportsDXT3Textures())
6153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006154 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006155 }
6156 else
6157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006158 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006159 }
6160 break;
6161 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6162 if (context->supportsDXT5Textures())
6163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006164 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006165 }
6166 else
6167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006168 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006169 }
6170 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006171 case GL_DEPTH_COMPONENT:
6172 case GL_DEPTH_STENCIL_OES:
6173 if (!context->supportsDepthTextures())
6174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006176 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006177 if (target != GL_TEXTURE_2D)
6178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006179 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006180 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006181 // OES_depth_texture supports loading depth data and multiple levels,
6182 // but ANGLE_depth_texture does not
6183 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006185 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006186 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006187 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006188 default:
6189 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006190 }
6191
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006192 if (type == GL_FLOAT)
6193 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006194 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006196 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006197 }
6198 }
6199 else if (type == GL_HALF_FLOAT_OES)
6200 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006201 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006203 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006204 }
6205 }
6206
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006207 if (target == GL_TEXTURE_2D)
6208 {
6209 gl::Texture2D *texture = context->getTexture2D();
6210
6211 if (!texture)
6212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006213 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006214 }
6215
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006216 if (texture->isImmutable())
6217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006218 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006219 }
6220
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006221 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006222 }
6223 else
6224 {
6225 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6226
6227 if (!texture)
6228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006229 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006230 }
6231
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006232 if (texture->isImmutable())
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006235 }
6236
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006237 switch (target)
6238 {
6239 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006240 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241 break;
6242 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006243 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006244 break;
6245 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006246 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006247 break;
6248 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006249 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006250 break;
6251 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006252 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006253 break;
6254 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006255 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006256 break;
6257 default: UNREACHABLE();
6258 }
6259 }
6260 }
6261 }
6262 catch(std::bad_alloc&)
6263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006265 }
6266}
6267
6268void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6269{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006270 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6271
6272 try
6273 {
6274 gl::Context *context = gl::getNonLostContext();
6275
6276 if (context)
6277 {
6278 gl::Texture *texture;
6279
6280 switch (target)
6281 {
6282 case GL_TEXTURE_2D:
6283 texture = context->getTexture2D();
6284 break;
6285 case GL_TEXTURE_CUBE_MAP:
6286 texture = context->getTextureCubeMap();
6287 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006288 case GL_TEXTURE_3D:
6289 if (context->getClientVersion() < 3)
6290 {
6291 return gl::error(GL_INVALID_ENUM);
6292 }
6293 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006294 case GL_TEXTURE_2D_ARRAY:
6295 if (context->getClientVersion() < 3)
6296 {
6297 return gl::error(GL_INVALID_ENUM);
6298 }
6299 texture = context->getTexture2DArray();
6300 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006301 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006302 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006303 }
6304
6305 switch (pname)
6306 {
6307 case GL_TEXTURE_WRAP_S:
6308 if (!texture->setWrapS((GLenum)param))
6309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006310 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006311 }
6312 break;
6313 case GL_TEXTURE_WRAP_T:
6314 if (!texture->setWrapT((GLenum)param))
6315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006316 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006317 }
6318 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006319 case GL_TEXTURE_WRAP_R:
6320 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6321 {
6322 return gl::error(GL_INVALID_ENUM);
6323 }
6324 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006325 case GL_TEXTURE_MIN_FILTER:
6326 if (!texture->setMinFilter((GLenum)param))
6327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006328 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006329 }
6330 break;
6331 case GL_TEXTURE_MAG_FILTER:
6332 if (!texture->setMagFilter((GLenum)param))
6333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006334 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006335 }
6336 break;
6337 case GL_TEXTURE_USAGE_ANGLE:
6338 if (!texture->setUsage((GLenum)param))
6339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006341 }
6342 break;
6343 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6344 if (!context->supportsTextureFilterAnisotropy())
6345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006347 }
6348 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006350 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006351 }
6352 break;
6353 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006355 }
6356 }
6357 }
6358 catch(std::bad_alloc&)
6359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006361 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006362}
6363
6364void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6365{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006366 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006367}
6368
6369void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6370{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006371 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006372
6373 try
6374 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006376
6377 if (context)
6378 {
6379 gl::Texture *texture;
6380
6381 switch (target)
6382 {
6383 case GL_TEXTURE_2D:
6384 texture = context->getTexture2D();
6385 break;
6386 case GL_TEXTURE_CUBE_MAP:
6387 texture = context->getTextureCubeMap();
6388 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006389 case GL_TEXTURE_3D:
6390 if (context->getClientVersion() < 3)
6391 {
6392 return gl::error(GL_INVALID_ENUM);
6393 }
6394 texture = context->getTexture3D();
6395 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006396 case GL_TEXTURE_2D_ARRAY:
6397 if (context->getClientVersion() < 3)
6398 {
6399 return gl::error(GL_INVALID_ENUM);
6400 }
6401 texture = context->getTexture2DArray();
6402 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006403 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006404 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006405 }
6406
6407 switch (pname)
6408 {
6409 case GL_TEXTURE_WRAP_S:
6410 if (!texture->setWrapS((GLenum)param))
6411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006412 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006413 }
6414 break;
6415 case GL_TEXTURE_WRAP_T:
6416 if (!texture->setWrapT((GLenum)param))
6417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006419 }
6420 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006421 case GL_TEXTURE_WRAP_R:
6422 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6423 {
6424 return gl::error(GL_INVALID_ENUM);
6425 }
6426 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006427 case GL_TEXTURE_MIN_FILTER:
6428 if (!texture->setMinFilter((GLenum)param))
6429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006430 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006431 }
6432 break;
6433 case GL_TEXTURE_MAG_FILTER:
6434 if (!texture->setMagFilter((GLenum)param))
6435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006436 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006437 }
6438 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006439 case GL_TEXTURE_USAGE_ANGLE:
6440 if (!texture->setUsage((GLenum)param))
6441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006442 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006443 }
6444 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006445 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6446 if (!context->supportsTextureFilterAnisotropy())
6447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006448 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006449 }
6450 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006452 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006453 }
6454 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006455 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006456 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006457 }
6458 }
6459 }
6460 catch(std::bad_alloc&)
6461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006462 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006463 }
6464}
6465
6466void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6467{
6468 glTexParameteri(target, pname, *params);
6469}
6470
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006471void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6472{
6473 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6474 target, levels, internalformat, width, height);
6475
6476 try
6477 {
6478 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006480 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006481 }
6482
6483 if (width < 1 || height < 1 || levels < 1)
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
6488 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006490 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006491 }
6492
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006493 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006495 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006496 }
6497
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006498 gl::Context *context = gl::getNonLostContext();
6499
6500 if (context)
6501 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006502 if (!gl::IsValidInternalFormat(internalformat, context))
6503 {
6504 return gl::error(GL_INVALID_ENUM);
6505 }
6506
6507 GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
6508 GLenum type = gl::GetType(internalformat, context->getClientVersion());
6509
6510 if (format == GL_NONE || type == GL_NONE)
6511 {
6512 return gl::error(GL_INVALID_ENUM);
6513 }
6514
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006515 switch (target)
6516 {
6517 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006518 if (width > context->getMaximum2DTextureDimension() ||
6519 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006521 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006522 }
6523 break;
6524 case GL_TEXTURE_CUBE_MAP:
6525 if (width > context->getMaximumCubeTextureDimension() ||
6526 height > context->getMaximumCubeTextureDimension())
6527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006528 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006529 }
6530 break;
6531 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006532 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006533 }
6534
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006535 if (levels != 1 && !context->supportsNonPower2Texture())
6536 {
6537 if (!gl::isPow2(width) || !gl::isPow2(height))
6538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006539 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006540 }
6541 }
6542
daniel@transgaming.come1077362011-11-11 04:16:50 +00006543 switch (internalformat)
6544 {
6545 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6546 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6547 if (!context->supportsDXT1Textures())
6548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006549 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006550 }
6551 break;
6552 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6553 if (!context->supportsDXT3Textures())
6554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006556 }
6557 break;
6558 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6559 if (!context->supportsDXT5Textures())
6560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006562 }
6563 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006564 case GL_RGBA32F_EXT:
6565 case GL_RGB32F_EXT:
6566 case GL_ALPHA32F_EXT:
6567 case GL_LUMINANCE32F_EXT:
6568 case GL_LUMINANCE_ALPHA32F_EXT:
6569 if (!context->supportsFloat32Textures())
6570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006571 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006572 }
6573 break;
6574 case GL_RGBA16F_EXT:
6575 case GL_RGB16F_EXT:
6576 case GL_ALPHA16F_EXT:
6577 case GL_LUMINANCE16F_EXT:
6578 case GL_LUMINANCE_ALPHA16F_EXT:
6579 if (!context->supportsFloat16Textures())
6580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006582 }
6583 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006584 case GL_DEPTH_COMPONENT16:
6585 case GL_DEPTH_COMPONENT32_OES:
6586 case GL_DEPTH24_STENCIL8_OES:
6587 if (!context->supportsDepthTextures())
6588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006589 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006590 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006591 if (target != GL_TEXTURE_2D)
6592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006594 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006595 // ANGLE_depth_texture only supports 1-level textures
6596 if (levels != 1)
6597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006598 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006599 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006600 break;
6601 default:
6602 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006603 }
6604
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006605 if (target == GL_TEXTURE_2D)
6606 {
6607 gl::Texture2D *texture = context->getTexture2D();
6608
6609 if (!texture || texture->id() == 0)
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 if (texture->isImmutable())
6615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006616 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006617 }
6618
6619 texture->storage(levels, internalformat, width, height);
6620 }
6621 else if (target == GL_TEXTURE_CUBE_MAP)
6622 {
6623 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6624
6625 if (!texture || texture->id() == 0)
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 if (texture->isImmutable())
6631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006632 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006633 }
6634
6635 texture->storage(levels, internalformat, width);
6636 }
6637 else UNREACHABLE();
6638 }
6639 }
6640 catch(std::bad_alloc&)
6641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006643 }
6644}
6645
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006646void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6647 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006648{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006649 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006650 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006651 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006652 target, level, xoffset, yoffset, width, height, format, type, pixels);
6653
6654 try
6655 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006656 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006658 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006659 }
6660
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006661 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006664 }
6665
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006666 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006668 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006669 }
6670
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006671 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006672 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006673 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006674 }
6675
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006676 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006677
6678 if (context)
6679 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006680 if (level > context->getMaximumTextureLevel())
6681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006683 }
6684
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006685 if (type == GL_FLOAT)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006686 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006687 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006689 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006690 }
6691 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006692 else if (type == GL_HALF_FLOAT_OES)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006693 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006694 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006696 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006697 }
6698 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006699
6700 if (format == GL_DEPTH_COMPONENT)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006701 {
6702 if (!context->supportsDepthTextures())
6703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006705 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006706 if (target != GL_TEXTURE_2D)
6707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006708 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006709 }
6710 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006711 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006712 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006713
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006714 if (width == 0 || height == 0 || pixels == NULL)
6715 {
6716 return;
6717 }
6718
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006719 if (target == GL_TEXTURE_2D)
6720 {
6721 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006722 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006723 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006724 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006725 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006726 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006727 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006728 {
6729 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006730 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006731 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006732 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006733 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006734 }
6735 else
6736 {
6737 UNREACHABLE();
6738 }
6739 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740 }
6741 catch(std::bad_alloc&)
6742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744 }
6745}
6746
6747void __stdcall glUniform1f(GLint location, GLfloat x)
6748{
6749 glUniform1fv(location, 1, &x);
6750}
6751
6752void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6753{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006754 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006755
6756 try
6757 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006758 if (count < 0)
6759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006761 }
6762
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006763 if (location == -1)
6764 {
6765 return;
6766 }
6767
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006768 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006769
6770 if (context)
6771 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006772 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006773 if (!programBinary)
6774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006775 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006776 }
6777
6778 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006780 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006781 }
6782 }
6783 }
6784 catch(std::bad_alloc&)
6785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006786 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006787 }
6788}
6789
6790void __stdcall glUniform1i(GLint location, GLint x)
6791{
6792 glUniform1iv(location, 1, &x);
6793}
6794
6795void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006797 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006798
6799 try
6800 {
6801 if (count < 0)
6802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006804 }
6805
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006806 if (location == -1)
6807 {
6808 return;
6809 }
6810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006812
6813 if (context)
6814 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006815 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006816 if (!programBinary)
6817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006818 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006819 }
6820
6821 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006823 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006824 }
6825 }
6826 }
6827 catch(std::bad_alloc&)
6828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006830 }
6831}
6832
6833void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6834{
6835 GLfloat xy[2] = {x, y};
6836
6837 glUniform2fv(location, 1, (GLfloat*)&xy);
6838}
6839
6840void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6841{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006842 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006843
6844 try
6845 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006846 if (count < 0)
6847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006848 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006849 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006850
6851 if (location == -1)
6852 {
6853 return;
6854 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006855
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006857
6858 if (context)
6859 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006860 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006861 if (!programBinary)
6862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006863 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006864 }
6865
6866 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006868 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006869 }
6870 }
6871 }
6872 catch(std::bad_alloc&)
6873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006875 }
6876}
6877
6878void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6879{
6880 GLint xy[4] = {x, y};
6881
6882 glUniform2iv(location, 1, (GLint*)&xy);
6883}
6884
6885void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006887 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006888
6889 try
6890 {
6891 if (count < 0)
6892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006893 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006894 }
6895
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006896 if (location == -1)
6897 {
6898 return;
6899 }
6900
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006902
6903 if (context)
6904 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006905 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006906 if (!programBinary)
6907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006908 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006909 }
6910
6911 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006913 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006914 }
6915 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006916 }
6917 catch(std::bad_alloc&)
6918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006919 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006920 }
6921}
6922
6923void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6924{
6925 GLfloat xyz[3] = {x, y, z};
6926
6927 glUniform3fv(location, 1, (GLfloat*)&xyz);
6928}
6929
6930void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006932 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006933
6934 try
6935 {
6936 if (count < 0)
6937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006938 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006939 }
6940
6941 if (location == -1)
6942 {
6943 return;
6944 }
6945
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006946 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006947
6948 if (context)
6949 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006950 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006951 if (!programBinary)
6952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006953 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006954 }
6955
6956 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006958 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006959 }
6960 }
6961 }
6962 catch(std::bad_alloc&)
6963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006964 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006965 }
6966}
6967
6968void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6969{
6970 GLint xyz[3] = {x, y, z};
6971
6972 glUniform3iv(location, 1, (GLint*)&xyz);
6973}
6974
6975void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006977 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006978
6979 try
6980 {
6981 if (count < 0)
6982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006983 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006984 }
6985
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006986 if (location == -1)
6987 {
6988 return;
6989 }
6990
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006991 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006992
6993 if (context)
6994 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006995 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006996 if (!programBinary)
6997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006998 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006999 }
7000
7001 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007003 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007004 }
7005 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007006 }
7007 catch(std::bad_alloc&)
7008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007010 }
7011}
7012
7013void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7014{
7015 GLfloat xyzw[4] = {x, y, z, w};
7016
7017 glUniform4fv(location, 1, (GLfloat*)&xyzw);
7018}
7019
7020void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
7021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007022 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007023
7024 try
7025 {
7026 if (count < 0)
7027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007029 }
7030
7031 if (location == -1)
7032 {
7033 return;
7034 }
7035
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007037
7038 if (context)
7039 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007040 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007041 if (!programBinary)
7042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007043 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007044 }
7045
7046 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007048 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007049 }
7050 }
7051 }
7052 catch(std::bad_alloc&)
7053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007054 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007055 }
7056}
7057
7058void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
7059{
7060 GLint xyzw[4] = {x, y, z, w};
7061
7062 glUniform4iv(location, 1, (GLint*)&xyzw);
7063}
7064
7065void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
7066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007067 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007068
7069 try
7070 {
7071 if (count < 0)
7072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007073 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007074 }
7075
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007076 if (location == -1)
7077 {
7078 return;
7079 }
7080
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007082
7083 if (context)
7084 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007085 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007086 if (!programBinary)
7087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007088 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007089 }
7090
7091 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007094 }
7095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007096 }
7097 catch(std::bad_alloc&)
7098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007099 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007100 }
7101}
7102
7103void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7104{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007105 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007106 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007107
7108 try
7109 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007110 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007112 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007113 }
7114
7115 if (location == -1)
7116 {
7117 return;
7118 }
7119
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007121
7122 if (context)
7123 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007124 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7125 {
7126 return gl::error(GL_INVALID_VALUE);
7127 }
7128
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007129 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007130 if (!programBinary)
7131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007132 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007133 }
7134
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007135 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007137 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007138 }
7139 }
7140 }
7141 catch(std::bad_alloc&)
7142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007143 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144 }
7145}
7146
7147void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7148{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007149 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007150 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007151
7152 try
7153 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007154 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007156 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007157 }
7158
7159 if (location == -1)
7160 {
7161 return;
7162 }
7163
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007165
7166 if (context)
7167 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007168 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7169 {
7170 return gl::error(GL_INVALID_VALUE);
7171 }
7172
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007173 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007174 if (!programBinary)
7175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007176 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007177 }
7178
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007179 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007181 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007182 }
7183 }
7184 }
7185 catch(std::bad_alloc&)
7186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007187 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007188 }
7189}
7190
7191void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7192{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007193 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007194 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007195
7196 try
7197 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007198 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007200 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007201 }
7202
7203 if (location == -1)
7204 {
7205 return;
7206 }
7207
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007208 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007209
7210 if (context)
7211 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007212 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7213 {
7214 return gl::error(GL_INVALID_VALUE);
7215 }
7216
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007217 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007218 if (!programBinary)
7219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007220 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007221 }
7222
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007223 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007225 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007226 }
7227 }
7228 }
7229 catch(std::bad_alloc&)
7230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007231 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007232 }
7233}
7234
7235void __stdcall glUseProgram(GLuint program)
7236{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007237 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007238
7239 try
7240 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007241 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007242
7243 if (context)
7244 {
7245 gl::Program *programObject = context->getProgram(program);
7246
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007247 if (!programObject && program != 0)
7248 {
7249 if (context->getShader(program))
7250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007251 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007252 }
7253 else
7254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007255 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007256 }
7257 }
7258
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007259 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007261 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007262 }
7263
7264 context->useProgram(program);
7265 }
7266 }
7267 catch(std::bad_alloc&)
7268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007270 }
7271}
7272
7273void __stdcall glValidateProgram(GLuint program)
7274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007275 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007276
7277 try
7278 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007280
7281 if (context)
7282 {
7283 gl::Program *programObject = context->getProgram(program);
7284
7285 if (!programObject)
7286 {
7287 if (context->getShader(program))
7288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007289 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007290 }
7291 else
7292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007294 }
7295 }
7296
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007297 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007298 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007299 }
7300 catch(std::bad_alloc&)
7301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007303 }
7304}
7305
7306void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007308 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007309
7310 try
7311 {
7312 if (index >= gl::MAX_VERTEX_ATTRIBS)
7313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007315 }
7316
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007317 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007318
7319 if (context)
7320 {
7321 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007322 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007323 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007324 }
7325 catch(std::bad_alloc&)
7326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007327 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007328 }
7329}
7330
7331void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007333 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007334
7335 try
7336 {
7337 if (index >= gl::MAX_VERTEX_ATTRIBS)
7338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007339 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007340 }
7341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007343
7344 if (context)
7345 {
7346 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007347 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007348 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007349 }
7350 catch(std::bad_alloc&)
7351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007353 }
7354}
7355
7356void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007358 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007359
7360 try
7361 {
7362 if (index >= gl::MAX_VERTEX_ATTRIBS)
7363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007364 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007365 }
7366
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007367 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007368
7369 if (context)
7370 {
7371 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007372 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007373 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007374 }
7375 catch(std::bad_alloc&)
7376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007378 }
7379}
7380
7381void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007383 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007384
7385 try
7386 {
7387 if (index >= gl::MAX_VERTEX_ATTRIBS)
7388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007389 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007390 }
7391
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007392 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007393
7394 if (context)
7395 {
7396 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007397 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007398 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007399 }
7400 catch(std::bad_alloc&)
7401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007403 }
7404}
7405
7406void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7407{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007408 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 +00007409
7410 try
7411 {
7412 if (index >= gl::MAX_VERTEX_ATTRIBS)
7413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007414 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007415 }
7416
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007417 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007418
7419 if (context)
7420 {
7421 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007422 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007423 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007424 }
7425 catch(std::bad_alloc&)
7426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007427 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007428 }
7429}
7430
7431void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7432{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007433 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007434
7435 try
7436 {
7437 if (index >= gl::MAX_VERTEX_ATTRIBS)
7438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007440 }
7441
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007443
7444 if (context)
7445 {
7446 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007447 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007448 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007449 }
7450 catch(std::bad_alloc&)
7451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007453 }
7454}
7455
7456void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7457{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007458 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 +00007459
7460 try
7461 {
7462 if (index >= gl::MAX_VERTEX_ATTRIBS)
7463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007465 }
7466
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007468
7469 if (context)
7470 {
7471 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007472 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007473 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007474 }
7475 catch(std::bad_alloc&)
7476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007477 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007478 }
7479}
7480
7481void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007483 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007484
7485 try
7486 {
7487 if (index >= gl::MAX_VERTEX_ATTRIBS)
7488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007489 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007490 }
7491
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007493
7494 if (context)
7495 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007496 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007497 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007498 }
7499 catch(std::bad_alloc&)
7500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007501 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007502 }
7503}
7504
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007505void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7506{
7507 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7508
7509 try
7510 {
7511 if (index >= gl::MAX_VERTEX_ATTRIBS)
7512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007513 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007514 }
7515
7516 gl::Context *context = gl::getNonLostContext();
7517
7518 if (context)
7519 {
7520 context->setVertexAttribDivisor(index, divisor);
7521 }
7522 }
7523 catch(std::bad_alloc&)
7524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007526 }
7527}
7528
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007529void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007531 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007532 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007533 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007534
7535 try
7536 {
7537 if (index >= gl::MAX_VERTEX_ATTRIBS)
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
7542 if (size < 1 || size > 4)
7543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007544 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007545 }
7546
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007547 gl::Context *context = gl::getNonLostContext();
7548
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007549 switch (type)
7550 {
7551 case GL_BYTE:
7552 case GL_UNSIGNED_BYTE:
7553 case GL_SHORT:
7554 case GL_UNSIGNED_SHORT:
7555 case GL_FIXED:
7556 case GL_FLOAT:
7557 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007558 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007559 case GL_INT:
7560 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007561 case GL_INT_2_10_10_10_REV:
7562 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007563 if (context && context->getClientVersion() < 3)
7564 {
7565 return gl::error(GL_INVALID_ENUM);
7566 }
7567 else
7568 {
7569 break;
7570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007571 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007572 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007573 }
7574
7575 if (stride < 0)
7576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007578 }
7579
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007580 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7581 {
7582 return gl::error(GL_INVALID_OPERATION);
7583 }
7584
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007585 if (context)
7586 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007587 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7588 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007589 }
7590 }
7591 catch(std::bad_alloc&)
7592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007593 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007594 }
7595}
7596
7597void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007599 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 +00007600
7601 try
7602 {
7603 if (width < 0 || height < 0)
7604 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007605 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007606 }
7607
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007608 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007609
7610 if (context)
7611 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007612 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007613 }
7614 }
7615 catch(std::bad_alloc&)
7616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007617 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007618 }
7619}
7620
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007621// OpenGL ES 3.0 functions
7622
7623void __stdcall glReadBuffer(GLenum mode)
7624{
7625 EVENT("(GLenum mode = 0x%X)", mode);
7626
7627 try
7628 {
7629 gl::Context *context = gl::getNonLostContext();
7630
7631 if (context)
7632 {
7633 if (context->getClientVersion() < 3)
7634 {
7635 return gl::error(GL_INVALID_OPERATION);
7636 }
7637 }
7638
7639 UNIMPLEMENTED();
7640 }
7641 catch(std::bad_alloc&)
7642 {
7643 return gl::error(GL_OUT_OF_MEMORY);
7644 }
7645}
7646
7647void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7648{
7649 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7650 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7651
7652 try
7653 {
7654 gl::Context *context = gl::getNonLostContext();
7655
7656 if (context)
7657 {
7658 if (context->getClientVersion() < 3)
7659 {
7660 return gl::error(GL_INVALID_OPERATION);
7661 }
7662 }
7663
7664 UNIMPLEMENTED();
7665 }
7666 catch(std::bad_alloc&)
7667 {
7668 return gl::error(GL_OUT_OF_MEMORY);
7669 }
7670}
7671
7672void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7673{
7674 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7675 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7676 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7677 target, level, internalformat, width, height, depth, border, format, type, pixels);
7678
7679 try
7680 {
7681 gl::Context *context = gl::getNonLostContext();
7682
7683 if (context)
7684 {
7685 if (context->getClientVersion() < 3)
7686 {
7687 return gl::error(GL_INVALID_OPERATION);
7688 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007689
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007690 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007691 if (!validateES3TexImageParameters(context, target, level, internalformat, false, false,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007692 0, 0, 0, width, height, depth, border, format, type))
7693 {
7694 return;
7695 }
7696
7697 switch(target)
7698 {
7699 case GL_TEXTURE_3D:
7700 {
7701 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007702 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007703 }
7704 break;
7705
7706 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007707 {
7708 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007709 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007710 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007711 break;
7712
7713 default:
7714 return gl::error(GL_INVALID_ENUM);
7715 }
7716 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007717 }
7718 catch(std::bad_alloc&)
7719 {
7720 return gl::error(GL_OUT_OF_MEMORY);
7721 }
7722}
7723
7724void __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)
7725{
7726 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7727 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7728 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7729 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7730
7731 try
7732 {
7733 gl::Context *context = gl::getNonLostContext();
7734
7735 if (context)
7736 {
7737 if (context->getClientVersion() < 3)
7738 {
7739 return gl::error(GL_INVALID_OPERATION);
7740 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007741
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007742 if (!pixels)
7743 {
7744 return gl::error(GL_INVALID_VALUE);
7745 }
7746
7747 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007748 if (!validateES3TexImageParameters(context, target, level, GL_NONE, false, true,
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007749 xoffset, yoffset, zoffset, width, height, depth, 0,
7750 format, type))
7751 {
7752 return;
7753 }
7754
7755 switch(target)
7756 {
7757 case GL_TEXTURE_3D:
7758 {
7759 gl::Texture3D *texture = context->getTexture3D();
7760 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7761 }
7762 break;
7763
7764 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007765 {
7766 gl::Texture2DArray *texture = context->getTexture2DArray();
7767 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7768 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007769 break;
7770
7771 default:
7772 return gl::error(GL_INVALID_ENUM);
7773 }
7774 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007775 }
7776 catch(std::bad_alloc&)
7777 {
7778 return gl::error(GL_OUT_OF_MEMORY);
7779 }
7780}
7781
7782void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7783{
7784 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7785 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7786 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7787
7788 try
7789 {
7790 gl::Context *context = gl::getNonLostContext();
7791
7792 if (context)
7793 {
7794 if (context->getClientVersion() < 3)
7795 {
7796 return gl::error(GL_INVALID_OPERATION);
7797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007798
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007799 if (!validateES3CopyTexImageParameters(context, target, level, GL_NONE, false, xoffset, yoffset, zoffset,
7800 x, y, width, height, 0))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007801 {
7802 return;
7803 }
7804
7805 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7806 gl::Texture *texture = NULL;
7807 switch (target)
7808 {
7809 case GL_TEXTURE_3D:
7810 texture = context->getTexture3D();
7811 break;
7812
7813 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007814 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007815 break;
7816
7817 default:
7818 return gl::error(GL_INVALID_ENUM);
7819 }
7820
7821 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7822 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007823 }
7824 catch(std::bad_alloc&)
7825 {
7826 return gl::error(GL_OUT_OF_MEMORY);
7827 }
7828}
7829
7830void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7831{
7832 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7833 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7834 "const GLvoid* data = 0x%0.8p)",
7835 target, level, internalformat, width, height, depth, border, imageSize, data);
7836
7837 try
7838 {
7839 gl::Context *context = gl::getNonLostContext();
7840
7841 if (context)
7842 {
7843 if (context->getClientVersion() < 3)
7844 {
7845 return gl::error(GL_INVALID_OPERATION);
7846 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007847
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007848 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 +00007849 {
7850 return gl::error(GL_INVALID_VALUE);
7851 }
7852
7853 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007854 if (!validateES3TexImageParameters(context, target, level, internalformat, true, false,
7855 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007856 {
7857 return;
7858 }
7859
7860 switch(target)
7861 {
7862 case GL_TEXTURE_3D:
7863 {
7864 gl::Texture3D *texture = context->getTexture3D();
7865 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7866 }
7867 break;
7868
7869 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007870 {
7871 gl::Texture2DArray *texture = context->getTexture2DArray();
7872 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7873 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007874 break;
7875
7876 default:
7877 return gl::error(GL_INVALID_ENUM);
7878 }
7879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007880 }
7881 catch(std::bad_alloc&)
7882 {
7883 return gl::error(GL_OUT_OF_MEMORY);
7884 }
7885}
7886
7887void __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)
7888{
7889 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7890 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7891 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7892 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7893
7894 try
7895 {
7896 gl::Context *context = gl::getNonLostContext();
7897
7898 if (context)
7899 {
7900 if (context->getClientVersion() < 3)
7901 {
7902 return gl::error(GL_INVALID_OPERATION);
7903 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007904
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007905 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 +00007906 {
7907 return gl::error(GL_INVALID_VALUE);
7908 }
7909
7910 if (!data)
7911 {
7912 return gl::error(GL_INVALID_VALUE);
7913 }
7914
7915 // validateES3TexImageFormat sets the error code if there is an error
shannonwoods@chromium.org6cf2b0e2013-05-30 00:13:36 +00007916 if (!validateES3TexImageParameters(context, target, level, GL_NONE, true, true,
7917 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007918 {
7919 return;
7920 }
7921
7922 switch(target)
7923 {
7924 case GL_TEXTURE_3D:
7925 {
7926 gl::Texture3D *texture = context->getTexture3D();
7927 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7928 format, imageSize, data);
7929 }
7930 break;
7931
7932 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007933 {
7934 gl::Texture2DArray *texture = context->getTexture2DArray();
7935 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7936 format, imageSize, data);
7937 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007938 break;
7939
7940 default:
7941 return gl::error(GL_INVALID_ENUM);
7942 }
7943 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007944 }
7945 catch(std::bad_alloc&)
7946 {
7947 return gl::error(GL_OUT_OF_MEMORY);
7948 }
7949}
7950
7951void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7952{
7953 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7954
7955 try
7956 {
7957 gl::Context *context = gl::getNonLostContext();
7958
7959 if (context)
7960 {
7961 if (context->getClientVersion() < 3)
7962 {
7963 return gl::error(GL_INVALID_OPERATION);
7964 }
7965 }
7966
7967 UNIMPLEMENTED();
7968 }
7969 catch(std::bad_alloc&)
7970 {
7971 return gl::error(GL_OUT_OF_MEMORY);
7972 }
7973}
7974
7975void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7976{
7977 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7978
7979 try
7980 {
7981 gl::Context *context = gl::getNonLostContext();
7982
7983 if (context)
7984 {
7985 if (context->getClientVersion() < 3)
7986 {
7987 return gl::error(GL_INVALID_OPERATION);
7988 }
7989 }
7990
7991 UNIMPLEMENTED();
7992 }
7993 catch(std::bad_alloc&)
7994 {
7995 return gl::error(GL_OUT_OF_MEMORY);
7996 }
7997}
7998
7999GLboolean __stdcall glIsQuery(GLuint id)
8000{
8001 EVENT("(GLuint id = %u)", id);
8002
8003 try
8004 {
8005 gl::Context *context = gl::getNonLostContext();
8006
8007 if (context)
8008 {
8009 if (context->getClientVersion() < 3)
8010 {
8011 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8012 }
8013 }
8014
8015 UNIMPLEMENTED();
8016 }
8017 catch(std::bad_alloc&)
8018 {
8019 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8020 }
8021
8022 return GL_FALSE;
8023}
8024
8025void __stdcall glBeginQuery(GLenum target, GLuint id)
8026{
8027 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
8028
8029 try
8030 {
8031 gl::Context *context = gl::getNonLostContext();
8032
8033 if (context)
8034 {
8035 if (context->getClientVersion() < 3)
8036 {
8037 return gl::error(GL_INVALID_OPERATION);
8038 }
8039 }
8040
8041 UNIMPLEMENTED();
8042 }
8043 catch(std::bad_alloc&)
8044 {
8045 return gl::error(GL_OUT_OF_MEMORY);
8046 }
8047}
8048
8049void __stdcall glEndQuery(GLenum target)
8050{
8051 EVENT("(GLenum target = 0x%X)", target);
8052
8053 try
8054 {
8055 gl::Context *context = gl::getNonLostContext();
8056
8057 if (context)
8058 {
8059 if (context->getClientVersion() < 3)
8060 {
8061 return gl::error(GL_INVALID_OPERATION);
8062 }
8063 }
8064
8065 UNIMPLEMENTED();
8066 }
8067 catch(std::bad_alloc&)
8068 {
8069 return gl::error(GL_OUT_OF_MEMORY);
8070 }
8071}
8072
8073void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
8074{
8075 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
8076
8077 try
8078 {
8079 gl::Context *context = gl::getNonLostContext();
8080
8081 if (context)
8082 {
8083 if (context->getClientVersion() < 3)
8084 {
8085 return gl::error(GL_INVALID_OPERATION);
8086 }
8087 }
8088
8089 UNIMPLEMENTED();
8090 }
8091 catch(std::bad_alloc&)
8092 {
8093 return gl::error(GL_OUT_OF_MEMORY);
8094 }
8095}
8096
8097void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
8098{
8099 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
8100
8101 try
8102 {
8103 gl::Context *context = gl::getNonLostContext();
8104
8105 if (context)
8106 {
8107 if (context->getClientVersion() < 3)
8108 {
8109 return gl::error(GL_INVALID_OPERATION);
8110 }
8111 }
8112
8113 UNIMPLEMENTED();
8114 }
8115 catch(std::bad_alloc&)
8116 {
8117 return gl::error(GL_OUT_OF_MEMORY);
8118 }
8119}
8120
8121GLboolean __stdcall glUnmapBuffer(GLenum target)
8122{
8123 EVENT("(GLenum target = 0x%X)", target);
8124
8125 try
8126 {
8127 gl::Context *context = gl::getNonLostContext();
8128
8129 if (context)
8130 {
8131 if (context->getClientVersion() < 3)
8132 {
8133 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8134 }
8135 }
8136
8137 UNIMPLEMENTED();
8138 }
8139 catch(std::bad_alloc&)
8140 {
8141 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8142 }
8143
8144 return GL_FALSE;
8145}
8146
8147void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8148{
8149 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8150
8151 try
8152 {
8153 gl::Context *context = gl::getNonLostContext();
8154
8155 if (context)
8156 {
8157 if (context->getClientVersion() < 3)
8158 {
8159 return gl::error(GL_INVALID_OPERATION);
8160 }
8161 }
8162
8163 UNIMPLEMENTED();
8164 }
8165 catch(std::bad_alloc&)
8166 {
8167 return gl::error(GL_OUT_OF_MEMORY);
8168 }
8169}
8170
8171void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8172{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008173 try
8174 {
8175 gl::Context *context = gl::getNonLostContext();
8176
8177 if (context)
8178 {
8179 if (context->getClientVersion() < 3)
8180 {
8181 return gl::error(GL_INVALID_OPERATION);
8182 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008183
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008184 glDrawBuffersEXT(n, bufs);
8185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008186 }
8187 catch(std::bad_alloc&)
8188 {
8189 return gl::error(GL_OUT_OF_MEMORY);
8190 }
8191}
8192
8193void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8194{
8195 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8196 location, count, transpose, value);
8197
8198 try
8199 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008200 if (count < 0)
8201 {
8202 return gl::error(GL_INVALID_VALUE);
8203 }
8204
8205 if (location == -1)
8206 {
8207 return;
8208 }
8209
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008210 gl::Context *context = gl::getNonLostContext();
8211
8212 if (context)
8213 {
8214 if (context->getClientVersion() < 3)
8215 {
8216 return gl::error(GL_INVALID_OPERATION);
8217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008218
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008219 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8220 if (!programBinary)
8221 {
8222 return gl::error(GL_INVALID_OPERATION);
8223 }
8224
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008225 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008226 {
8227 return gl::error(GL_INVALID_OPERATION);
8228 }
8229 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008230 }
8231 catch(std::bad_alloc&)
8232 {
8233 return gl::error(GL_OUT_OF_MEMORY);
8234 }
8235}
8236
8237void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8238{
8239 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8240 location, count, transpose, value);
8241
8242 try
8243 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008244 if (count < 0)
8245 {
8246 return gl::error(GL_INVALID_VALUE);
8247 }
8248
8249 if (location == -1)
8250 {
8251 return;
8252 }
8253
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008254 gl::Context *context = gl::getNonLostContext();
8255
8256 if (context)
8257 {
8258 if (context->getClientVersion() < 3)
8259 {
8260 return gl::error(GL_INVALID_OPERATION);
8261 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008262
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008263 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8264 if (!programBinary)
8265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
8268
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008269 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008270 {
8271 return gl::error(GL_INVALID_OPERATION);
8272 }
8273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008274 }
8275 catch(std::bad_alloc&)
8276 {
8277 return gl::error(GL_OUT_OF_MEMORY);
8278 }
8279}
8280
8281void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8282{
8283 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8284 location, count, transpose, value);
8285
8286 try
8287 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008288 if (count < 0)
8289 {
8290 return gl::error(GL_INVALID_VALUE);
8291 }
8292
8293 if (location == -1)
8294 {
8295 return;
8296 }
8297
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008298 gl::Context *context = gl::getNonLostContext();
8299
8300 if (context)
8301 {
8302 if (context->getClientVersion() < 3)
8303 {
8304 return gl::error(GL_INVALID_OPERATION);
8305 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008306
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008307 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8308 if (!programBinary)
8309 {
8310 return gl::error(GL_INVALID_OPERATION);
8311 }
8312
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008313 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008314 {
8315 return gl::error(GL_INVALID_OPERATION);
8316 }
8317 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008318 }
8319 catch(std::bad_alloc&)
8320 {
8321 return gl::error(GL_OUT_OF_MEMORY);
8322 }
8323}
8324
8325void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8326{
8327 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8328 location, count, transpose, value);
8329
8330 try
8331 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008332 if (count < 0)
8333 {
8334 return gl::error(GL_INVALID_VALUE);
8335 }
8336
8337 if (location == -1)
8338 {
8339 return;
8340 }
8341
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008342 gl::Context *context = gl::getNonLostContext();
8343
8344 if (context)
8345 {
8346 if (context->getClientVersion() < 3)
8347 {
8348 return gl::error(GL_INVALID_OPERATION);
8349 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008350
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008351 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8352 if (!programBinary)
8353 {
8354 return gl::error(GL_INVALID_OPERATION);
8355 }
8356
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008357 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008358 {
8359 return gl::error(GL_INVALID_OPERATION);
8360 }
8361 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008362 }
8363 catch(std::bad_alloc&)
8364 {
8365 return gl::error(GL_OUT_OF_MEMORY);
8366 }
8367}
8368
8369void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8370{
8371 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8372 location, count, transpose, value);
8373
8374 try
8375 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008376 if (count < 0)
8377 {
8378 return gl::error(GL_INVALID_VALUE);
8379 }
8380
8381 if (location == -1)
8382 {
8383 return;
8384 }
8385
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008386 gl::Context *context = gl::getNonLostContext();
8387
8388 if (context)
8389 {
8390 if (context->getClientVersion() < 3)
8391 {
8392 return gl::error(GL_INVALID_OPERATION);
8393 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008394
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008395 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8396 if (!programBinary)
8397 {
8398 return gl::error(GL_INVALID_OPERATION);
8399 }
8400
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008401 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008402 {
8403 return gl::error(GL_INVALID_OPERATION);
8404 }
8405 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008406 }
8407 catch(std::bad_alloc&)
8408 {
8409 return gl::error(GL_OUT_OF_MEMORY);
8410 }
8411}
8412
8413void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8414{
8415 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8416 location, count, transpose, value);
8417
8418 try
8419 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008420 if (count < 0)
8421 {
8422 return gl::error(GL_INVALID_VALUE);
8423 }
8424
8425 if (location == -1)
8426 {
8427 return;
8428 }
8429
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008430 gl::Context *context = gl::getNonLostContext();
8431
8432 if (context)
8433 {
8434 if (context->getClientVersion() < 3)
8435 {
8436 return gl::error(GL_INVALID_OPERATION);
8437 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008438
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008439 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8440 if (!programBinary)
8441 {
8442 return gl::error(GL_INVALID_OPERATION);
8443 }
8444
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008445 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008446 {
8447 return gl::error(GL_INVALID_OPERATION);
8448 }
8449 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008450 }
8451 catch(std::bad_alloc&)
8452 {
8453 return gl::error(GL_OUT_OF_MEMORY);
8454 }
8455}
8456
8457void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8458{
8459 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8460 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8461 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8462
8463 try
8464 {
8465 gl::Context *context = gl::getNonLostContext();
8466
8467 if (context)
8468 {
8469 if (context->getClientVersion() < 3)
8470 {
8471 return gl::error(GL_INVALID_OPERATION);
8472 }
8473 }
8474
8475 UNIMPLEMENTED();
8476 }
8477 catch(std::bad_alloc&)
8478 {
8479 return gl::error(GL_OUT_OF_MEMORY);
8480 }
8481}
8482
8483void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8484{
8485 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8486 target, samples, internalformat, width, height);
8487
8488 try
8489 {
8490 gl::Context *context = gl::getNonLostContext();
8491
8492 if (context)
8493 {
8494 if (context->getClientVersion() < 3)
8495 {
8496 return gl::error(GL_INVALID_OPERATION);
8497 }
8498 }
8499
8500 UNIMPLEMENTED();
8501 }
8502 catch(std::bad_alloc&)
8503 {
8504 return gl::error(GL_OUT_OF_MEMORY);
8505 }
8506}
8507
8508void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8509{
8510 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8511 target, attachment, texture, level, layer);
8512
8513 try
8514 {
8515 gl::Context *context = gl::getNonLostContext();
8516
8517 if (context)
8518 {
8519 if (context->getClientVersion() < 3)
8520 {
8521 return gl::error(GL_INVALID_OPERATION);
8522 }
8523 }
8524
8525 UNIMPLEMENTED();
8526 }
8527 catch(std::bad_alloc&)
8528 {
8529 return gl::error(GL_OUT_OF_MEMORY);
8530 }
8531}
8532
8533GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8534{
8535 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8536 target, offset, length, access);
8537
8538 try
8539 {
8540 gl::Context *context = gl::getNonLostContext();
8541
8542 if (context)
8543 {
8544 if (context->getClientVersion() < 3)
8545 {
8546 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8547 }
8548 }
8549
8550 UNIMPLEMENTED();
8551 }
8552 catch(std::bad_alloc&)
8553 {
8554 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8555 }
8556
8557 return NULL;
8558}
8559
8560void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8561{
8562 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8563
8564 try
8565 {
8566 gl::Context *context = gl::getNonLostContext();
8567
8568 if (context)
8569 {
8570 if (context->getClientVersion() < 3)
8571 {
8572 return gl::error(GL_INVALID_OPERATION);
8573 }
8574 }
8575
8576 UNIMPLEMENTED();
8577 }
8578 catch(std::bad_alloc&)
8579 {
8580 return gl::error(GL_OUT_OF_MEMORY);
8581 }
8582}
8583
8584void __stdcall glBindVertexArray(GLuint array)
8585{
8586 EVENT("(GLuint array = %u)", array);
8587
8588 try
8589 {
8590 gl::Context *context = gl::getNonLostContext();
8591
8592 if (context)
8593 {
8594 if (context->getClientVersion() < 3)
8595 {
8596 return gl::error(GL_INVALID_OPERATION);
8597 }
8598 }
8599
8600 UNIMPLEMENTED();
8601 }
8602 catch(std::bad_alloc&)
8603 {
8604 return gl::error(GL_OUT_OF_MEMORY);
8605 }
8606}
8607
8608void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8609{
8610 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8611
8612 try
8613 {
8614 gl::Context *context = gl::getNonLostContext();
8615
8616 if (context)
8617 {
8618 if (context->getClientVersion() < 3)
8619 {
8620 return gl::error(GL_INVALID_OPERATION);
8621 }
8622 }
8623
8624 UNIMPLEMENTED();
8625 }
8626 catch(std::bad_alloc&)
8627 {
8628 return gl::error(GL_OUT_OF_MEMORY);
8629 }
8630}
8631
8632void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8633{
8634 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8635
8636 try
8637 {
8638 gl::Context *context = gl::getNonLostContext();
8639
8640 if (context)
8641 {
8642 if (context->getClientVersion() < 3)
8643 {
8644 return gl::error(GL_INVALID_OPERATION);
8645 }
8646 }
8647
8648 UNIMPLEMENTED();
8649 }
8650 catch(std::bad_alloc&)
8651 {
8652 return gl::error(GL_OUT_OF_MEMORY);
8653 }
8654}
8655
8656GLboolean __stdcall glIsVertexArray(GLuint array)
8657{
8658 EVENT("(GLuint array = %u)", array);
8659
8660 try
8661 {
8662 gl::Context *context = gl::getNonLostContext();
8663
8664 if (context)
8665 {
8666 if (context->getClientVersion() < 3)
8667 {
8668 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8669 }
8670 }
8671
8672 UNIMPLEMENTED();
8673 }
8674 catch(std::bad_alloc&)
8675 {
8676 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8677 }
8678
8679 return GL_FALSE;
8680}
8681
8682void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8683{
8684 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8685 target, index, data);
8686
8687 try
8688 {
8689 gl::Context *context = gl::getNonLostContext();
8690
8691 if (context)
8692 {
8693 if (context->getClientVersion() < 3)
8694 {
8695 return gl::error(GL_INVALID_OPERATION);
8696 }
8697 }
8698
8699 UNIMPLEMENTED();
8700 }
8701 catch(std::bad_alloc&)
8702 {
8703 return gl::error(GL_OUT_OF_MEMORY);
8704 }
8705}
8706
8707void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8708{
8709 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8710
8711 try
8712 {
8713 gl::Context *context = gl::getNonLostContext();
8714
8715 if (context)
8716 {
8717 if (context->getClientVersion() < 3)
8718 {
8719 return gl::error(GL_INVALID_OPERATION);
8720 }
8721 }
8722
8723 UNIMPLEMENTED();
8724 }
8725 catch(std::bad_alloc&)
8726 {
8727 return gl::error(GL_OUT_OF_MEMORY);
8728 }
8729}
8730
8731void __stdcall glEndTransformFeedback(void)
8732{
8733 EVENT("(void)");
8734
8735 try
8736 {
8737 gl::Context *context = gl::getNonLostContext();
8738
8739 if (context)
8740 {
8741 if (context->getClientVersion() < 3)
8742 {
8743 return gl::error(GL_INVALID_OPERATION);
8744 }
8745 }
8746
8747 UNIMPLEMENTED();
8748 }
8749 catch(std::bad_alloc&)
8750 {
8751 return gl::error(GL_OUT_OF_MEMORY);
8752 }
8753}
8754
8755void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8756{
8757 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8758 target, index, buffer, offset, size);
8759
8760 try
8761 {
8762 gl::Context *context = gl::getNonLostContext();
8763
8764 if (context)
8765 {
8766 if (context->getClientVersion() < 3)
8767 {
8768 return gl::error(GL_INVALID_OPERATION);
8769 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008770
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008771 switch (target)
8772 {
8773 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008774 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008775 {
8776 return gl::error(GL_INVALID_VALUE);
8777 }
8778 break;
8779
8780 case GL_UNIFORM_BUFFER:
8781 if (index >= context->getMaximumCombinedUniformBufferBindings())
8782 {
8783 return gl::error(GL_INVALID_VALUE);
8784 }
8785 break;
8786
8787 default:
8788 return gl::error(GL_INVALID_ENUM);
8789 }
8790
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008791 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008792 {
8793 return gl::error(GL_INVALID_VALUE);
8794 }
8795
8796 switch (target)
8797 {
8798 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008799
8800 // size and offset must be a multiple of 4
8801 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8802 {
8803 return gl::error(GL_INVALID_VALUE);
8804 }
8805
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008806 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8807 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008808 break;
8809
8810 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008811
8812 // it is an error to bind an offset not a multiple of the alignment
8813 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8814 {
8815 return gl::error(GL_INVALID_VALUE);
8816 }
8817
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008818 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8819 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008820 break;
8821
8822 default:
8823 UNREACHABLE();
8824 }
8825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008826 }
8827 catch(std::bad_alloc&)
8828 {
8829 return gl::error(GL_OUT_OF_MEMORY);
8830 }
8831}
8832
8833void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8834{
8835 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8836 target, index, buffer);
8837
8838 try
8839 {
8840 gl::Context *context = gl::getNonLostContext();
8841
8842 if (context)
8843 {
8844 if (context->getClientVersion() < 3)
8845 {
8846 return gl::error(GL_INVALID_OPERATION);
8847 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008848
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008849 switch (target)
8850 {
8851 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008852 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008853 {
8854 return gl::error(GL_INVALID_VALUE);
8855 }
8856 break;
8857
8858 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008859 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008860 {
8861 return gl::error(GL_INVALID_VALUE);
8862 }
8863 break;
8864
8865 default:
8866 return gl::error(GL_INVALID_ENUM);
8867 }
8868
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008869 switch (target)
8870 {
8871 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008872 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008873 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008874 break;
8875
8876 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008877 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008878 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008879 break;
8880
8881 default:
8882 UNREACHABLE();
8883 }
8884 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008885 }
8886 catch(std::bad_alloc&)
8887 {
8888 return gl::error(GL_OUT_OF_MEMORY);
8889 }
8890}
8891
8892void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8893{
8894 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8895 program, count, varyings, bufferMode);
8896
8897 try
8898 {
8899 gl::Context *context = gl::getNonLostContext();
8900
8901 if (context)
8902 {
8903 if (context->getClientVersion() < 3)
8904 {
8905 return gl::error(GL_INVALID_OPERATION);
8906 }
8907 }
8908
8909 UNIMPLEMENTED();
8910 }
8911 catch(std::bad_alloc&)
8912 {
8913 return gl::error(GL_OUT_OF_MEMORY);
8914 }
8915}
8916
8917void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8918{
8919 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8920 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8921 program, index, bufSize, length, size, type, name);
8922
8923 try
8924 {
8925 gl::Context *context = gl::getNonLostContext();
8926
8927 if (context)
8928 {
8929 if (context->getClientVersion() < 3)
8930 {
8931 return gl::error(GL_INVALID_OPERATION);
8932 }
8933 }
8934
8935 UNIMPLEMENTED();
8936 }
8937 catch(std::bad_alloc&)
8938 {
8939 return gl::error(GL_OUT_OF_MEMORY);
8940 }
8941}
8942
8943void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8944{
8945 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8946 index, size, type, stride, pointer);
8947
8948 try
8949 {
8950 gl::Context *context = gl::getNonLostContext();
8951
8952 if (context)
8953 {
8954 if (context->getClientVersion() < 3)
8955 {
8956 return gl::error(GL_INVALID_OPERATION);
8957 }
8958 }
8959
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008960 if (index >= gl::MAX_VERTEX_ATTRIBS)
8961 {
8962 return gl::error(GL_INVALID_VALUE);
8963 }
8964
8965 if (size < 1 || size > 4)
8966 {
8967 return gl::error(GL_INVALID_VALUE);
8968 }
8969
8970 switch (type)
8971 {
8972 case GL_BYTE:
8973 case GL_UNSIGNED_BYTE:
8974 case GL_SHORT:
8975 case GL_UNSIGNED_SHORT:
8976 case GL_INT:
8977 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008978 case GL_INT_2_10_10_10_REV:
8979 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008980 break;
8981 default:
8982 return gl::error(GL_INVALID_ENUM);
8983 }
8984
8985 if (stride < 0)
8986 {
8987 return gl::error(GL_INVALID_VALUE);
8988 }
8989
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008990 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8991 {
8992 return gl::error(GL_INVALID_OPERATION);
8993 }
8994
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008995 if (context)
8996 {
8997 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8998 stride, pointer);
8999 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009000 }
9001 catch(std::bad_alloc&)
9002 {
9003 return gl::error(GL_OUT_OF_MEMORY);
9004 }
9005}
9006
9007void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
9008{
9009 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9010 index, pname, params);
9011
9012 try
9013 {
9014 gl::Context *context = gl::getNonLostContext();
9015
9016 if (context)
9017 {
9018 if (context->getClientVersion() < 3)
9019 {
9020 return gl::error(GL_INVALID_OPERATION);
9021 }
9022 }
9023
9024 UNIMPLEMENTED();
9025 }
9026 catch(std::bad_alloc&)
9027 {
9028 return gl::error(GL_OUT_OF_MEMORY);
9029 }
9030}
9031
9032void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
9033{
9034 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
9035 index, pname, params);
9036
9037 try
9038 {
9039 gl::Context *context = gl::getNonLostContext();
9040
9041 if (context)
9042 {
9043 if (context->getClientVersion() < 3)
9044 {
9045 return gl::error(GL_INVALID_OPERATION);
9046 }
9047 }
9048
9049 UNIMPLEMENTED();
9050 }
9051 catch(std::bad_alloc&)
9052 {
9053 return gl::error(GL_OUT_OF_MEMORY);
9054 }
9055}
9056
9057void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
9058{
9059 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
9060 index, x, y, z, w);
9061
9062 try
9063 {
9064 gl::Context *context = gl::getNonLostContext();
9065
9066 if (context)
9067 {
9068 if (context->getClientVersion() < 3)
9069 {
9070 return gl::error(GL_INVALID_OPERATION);
9071 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009072
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009073 if (index >= gl::MAX_VERTEX_ATTRIBS)
9074 {
9075 return gl::error(GL_INVALID_VALUE);
9076 }
9077
9078 GLint vals[4] = { x, y, z, w };
9079 context->setVertexAttribi(index, vals);
9080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009081 }
9082 catch(std::bad_alloc&)
9083 {
9084 return gl::error(GL_OUT_OF_MEMORY);
9085 }
9086}
9087
9088void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
9089{
9090 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
9091 index, x, y, z, w);
9092
9093 try
9094 {
9095 gl::Context *context = gl::getNonLostContext();
9096
9097 if (context)
9098 {
9099 if (context->getClientVersion() < 3)
9100 {
9101 return gl::error(GL_INVALID_OPERATION);
9102 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009103
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009104 if (index >= gl::MAX_VERTEX_ATTRIBS)
9105 {
9106 return gl::error(GL_INVALID_VALUE);
9107 }
9108
9109 GLuint vals[4] = { x, y, z, w };
9110 context->setVertexAttribu(index, vals);
9111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009112 }
9113 catch(std::bad_alloc&)
9114 {
9115 return gl::error(GL_OUT_OF_MEMORY);
9116 }
9117}
9118
9119void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9120{
9121 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9122
9123 try
9124 {
9125 gl::Context *context = gl::getNonLostContext();
9126
9127 if (context)
9128 {
9129 if (context->getClientVersion() < 3)
9130 {
9131 return gl::error(GL_INVALID_OPERATION);
9132 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009133
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009134 if (index >= gl::MAX_VERTEX_ATTRIBS)
9135 {
9136 return gl::error(GL_INVALID_VALUE);
9137 }
9138
9139 context->setVertexAttribi(index, v);
9140 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009141 }
9142 catch(std::bad_alloc&)
9143 {
9144 return gl::error(GL_OUT_OF_MEMORY);
9145 }
9146}
9147
9148void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9149{
9150 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9151
9152 try
9153 {
9154 gl::Context *context = gl::getNonLostContext();
9155
9156 if (context)
9157 {
9158 if (context->getClientVersion() < 3)
9159 {
9160 return gl::error(GL_INVALID_OPERATION);
9161 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009162
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009163 if (index >= gl::MAX_VERTEX_ATTRIBS)
9164 {
9165 return gl::error(GL_INVALID_VALUE);
9166 }
9167
9168 context->setVertexAttribu(index, v);
9169 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009170 }
9171 catch(std::bad_alloc&)
9172 {
9173 return gl::error(GL_OUT_OF_MEMORY);
9174 }
9175}
9176
9177void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9178{
9179 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9180 program, location, params);
9181
9182 try
9183 {
9184 gl::Context *context = gl::getNonLostContext();
9185
9186 if (context)
9187 {
9188 if (context->getClientVersion() < 3)
9189 {
9190 return gl::error(GL_INVALID_OPERATION);
9191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009192
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009193 if (program == 0)
9194 {
9195 return gl::error(GL_INVALID_VALUE);
9196 }
9197
9198 gl::Program *programObject = context->getProgram(program);
9199
9200 if (!programObject || !programObject->isLinked())
9201 {
9202 return gl::error(GL_INVALID_OPERATION);
9203 }
9204
9205 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9206 if (!programBinary)
9207 {
9208 return gl::error(GL_INVALID_OPERATION);
9209 }
9210
9211 if (!programBinary->getUniformuiv(location, NULL, params))
9212 {
9213 return gl::error(GL_INVALID_OPERATION);
9214 }
9215 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009216 }
9217 catch(std::bad_alloc&)
9218 {
9219 return gl::error(GL_OUT_OF_MEMORY);
9220 }
9221}
9222
9223GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9224{
9225 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9226 program, name);
9227
9228 try
9229 {
9230 gl::Context *context = gl::getNonLostContext();
9231
9232 if (context)
9233 {
9234 if (context->getClientVersion() < 3)
9235 {
9236 return gl::error(GL_INVALID_OPERATION, 0);
9237 }
9238 }
9239
9240 UNIMPLEMENTED();
9241 }
9242 catch(std::bad_alloc&)
9243 {
9244 return gl::error(GL_OUT_OF_MEMORY, 0);
9245 }
9246
9247 return 0;
9248}
9249
9250void __stdcall glUniform1ui(GLint location, GLuint v0)
9251{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009252 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009253}
9254
9255void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9256{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009257 const GLuint xy[] = { v0, v1 };
9258 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009259}
9260
9261void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9262{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009263 const GLuint xyz[] = { v0, v1, v2 };
9264 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009265}
9266
9267void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9268{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009269 const GLuint xyzw[] = { v0, v1, v2, v3 };
9270 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009271}
9272
9273void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9274{
9275 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9276 location, count, value);
9277
9278 try
9279 {
9280 gl::Context *context = gl::getNonLostContext();
9281
9282 if (context)
9283 {
9284 if (context->getClientVersion() < 3)
9285 {
9286 return gl::error(GL_INVALID_OPERATION);
9287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009288
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009289 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9290 if (!programBinary)
9291 {
9292 return gl::error(GL_INVALID_OPERATION);
9293 }
9294
9295 if (!programBinary->setUniform1uiv(location, count, value))
9296 {
9297 return gl::error(GL_INVALID_OPERATION);
9298 }
9299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009300 }
9301 catch(std::bad_alloc&)
9302 {
9303 return gl::error(GL_OUT_OF_MEMORY);
9304 }
9305}
9306
9307void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9308{
9309 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9310 location, count, value);
9311
9312 try
9313 {
9314 gl::Context *context = gl::getNonLostContext();
9315
9316 if (context)
9317 {
9318 if (context->getClientVersion() < 3)
9319 {
9320 return gl::error(GL_INVALID_OPERATION);
9321 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009322
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009323 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9324 if (!programBinary)
9325 {
9326 return gl::error(GL_INVALID_OPERATION);
9327 }
9328
9329 if (!programBinary->setUniform2uiv(location, count, value))
9330 {
9331 return gl::error(GL_INVALID_OPERATION);
9332 }
9333 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009334 }
9335 catch(std::bad_alloc&)
9336 {
9337 return gl::error(GL_OUT_OF_MEMORY);
9338 }
9339}
9340
9341void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9342{
9343 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9344 location, count, value);
9345
9346 try
9347 {
9348 gl::Context *context = gl::getNonLostContext();
9349
9350 if (context)
9351 {
9352 if (context->getClientVersion() < 3)
9353 {
9354 return gl::error(GL_INVALID_OPERATION);
9355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009356
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009357 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9358 if (!programBinary)
9359 {
9360 return gl::error(GL_INVALID_OPERATION);
9361 }
9362
9363 if (!programBinary->setUniform3uiv(location, count, value))
9364 {
9365 return gl::error(GL_INVALID_OPERATION);
9366 }
9367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009368 }
9369 catch(std::bad_alloc&)
9370 {
9371 return gl::error(GL_OUT_OF_MEMORY);
9372 }
9373}
9374
9375void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9376{
9377 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9378 location, count, value);
9379
9380 try
9381 {
9382 gl::Context *context = gl::getNonLostContext();
9383
9384 if (context)
9385 {
9386 if (context->getClientVersion() < 3)
9387 {
9388 return gl::error(GL_INVALID_OPERATION);
9389 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009390
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009391 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9392 if (!programBinary)
9393 {
9394 return gl::error(GL_INVALID_OPERATION);
9395 }
9396
9397 if (!programBinary->setUniform4uiv(location, count, value))
9398 {
9399 return gl::error(GL_INVALID_OPERATION);
9400 }
9401 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009402 }
9403 catch(std::bad_alloc&)
9404 {
9405 return gl::error(GL_OUT_OF_MEMORY);
9406 }
9407}
9408
9409void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9410{
9411 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9412 buffer, drawbuffer, value);
9413
9414 try
9415 {
9416 gl::Context *context = gl::getNonLostContext();
9417
9418 if (context)
9419 {
9420 if (context->getClientVersion() < 3)
9421 {
9422 return gl::error(GL_INVALID_OPERATION);
9423 }
9424 }
9425
9426 UNIMPLEMENTED();
9427 }
9428 catch(std::bad_alloc&)
9429 {
9430 return gl::error(GL_OUT_OF_MEMORY);
9431 }
9432}
9433
9434void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9435{
9436 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9437 buffer, drawbuffer, value);
9438
9439 try
9440 {
9441 gl::Context *context = gl::getNonLostContext();
9442
9443 if (context)
9444 {
9445 if (context->getClientVersion() < 3)
9446 {
9447 return gl::error(GL_INVALID_OPERATION);
9448 }
9449 }
9450
9451 UNIMPLEMENTED();
9452 }
9453 catch(std::bad_alloc&)
9454 {
9455 return gl::error(GL_OUT_OF_MEMORY);
9456 }
9457}
9458
9459void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9460{
9461 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9462 buffer, drawbuffer, value);
9463
9464 try
9465 {
9466 gl::Context *context = gl::getNonLostContext();
9467
9468 if (context)
9469 {
9470 if (context->getClientVersion() < 3)
9471 {
9472 return gl::error(GL_INVALID_OPERATION);
9473 }
9474 }
9475
9476 UNIMPLEMENTED();
9477 }
9478 catch(std::bad_alloc&)
9479 {
9480 return gl::error(GL_OUT_OF_MEMORY);
9481 }
9482}
9483
9484void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9485{
9486 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9487 buffer, drawbuffer, depth, stencil);
9488
9489 try
9490 {
9491 gl::Context *context = gl::getNonLostContext();
9492
9493 if (context)
9494 {
9495 if (context->getClientVersion() < 3)
9496 {
9497 return gl::error(GL_INVALID_OPERATION);
9498 }
9499 }
9500
9501 UNIMPLEMENTED();
9502 }
9503 catch(std::bad_alloc&)
9504 {
9505 return gl::error(GL_OUT_OF_MEMORY);
9506 }
9507}
9508
9509const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9510{
9511 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9512
9513 try
9514 {
9515 gl::Context *context = gl::getNonLostContext();
9516
9517 if (context)
9518 {
9519 if (context->getClientVersion() < 3)
9520 {
9521 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9522 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009523
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009524 if (name != GL_EXTENSIONS)
9525 {
9526 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9527 }
9528
9529 if (index >= context->getNumExtensions())
9530 {
9531 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9532 }
9533
9534 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9535 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009536 }
9537 catch(std::bad_alloc&)
9538 {
9539 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9540 }
9541
9542 return NULL;
9543}
9544
9545void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9546{
9547 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9548 readTarget, writeTarget, readOffset, writeOffset, size);
9549
9550 try
9551 {
9552 gl::Context *context = gl::getNonLostContext();
9553
9554 if (context)
9555 {
9556 if (context->getClientVersion() < 3)
9557 {
9558 return gl::error(GL_INVALID_OPERATION);
9559 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009560
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009561 gl::Buffer *readBuffer = NULL;
9562 switch (readTarget)
9563 {
9564 case GL_ARRAY_BUFFER:
9565 readBuffer = context->getArrayBuffer();
9566 break;
9567 case GL_COPY_READ_BUFFER:
9568 readBuffer = context->getCopyReadBuffer();
9569 break;
9570 case GL_COPY_WRITE_BUFFER:
9571 readBuffer = context->getCopyWriteBuffer();
9572 break;
9573 case GL_ELEMENT_ARRAY_BUFFER:
9574 readBuffer = context->getElementArrayBuffer();
9575 break;
9576 case GL_PIXEL_PACK_BUFFER:
9577 readBuffer = context->getPixelPackBuffer();
9578 break;
9579 case GL_PIXEL_UNPACK_BUFFER:
9580 readBuffer = context->getPixelUnpackBuffer();
9581 break;
9582 case GL_TRANSFORM_FEEDBACK_BUFFER:
9583 readBuffer = context->getGenericTransformFeedbackBuffer();
9584 break;
9585 case GL_UNIFORM_BUFFER:
9586 readBuffer = context->getGenericUniformBuffer();
9587 break;
9588 default:
9589 return gl::error(GL_INVALID_ENUM);
9590 }
9591
9592 gl::Buffer *writeBuffer = NULL;
9593 switch (writeTarget)
9594 {
9595 case GL_ARRAY_BUFFER:
9596 writeBuffer = context->getArrayBuffer();
9597 break;
9598 case GL_COPY_READ_BUFFER:
9599 writeBuffer = context->getCopyReadBuffer();
9600 break;
9601 case GL_COPY_WRITE_BUFFER:
9602 writeBuffer = context->getCopyWriteBuffer();
9603 break;
9604 case GL_ELEMENT_ARRAY_BUFFER:
9605 writeBuffer = context->getElementArrayBuffer();
9606 break;
9607 case GL_PIXEL_PACK_BUFFER:
9608 writeBuffer = context->getPixelPackBuffer();
9609 break;
9610 case GL_PIXEL_UNPACK_BUFFER:
9611 writeBuffer = context->getPixelUnpackBuffer();
9612 break;
9613 case GL_TRANSFORM_FEEDBACK_BUFFER:
9614 writeBuffer = context->getGenericTransformFeedbackBuffer();
9615 break;
9616 case GL_UNIFORM_BUFFER:
9617 writeBuffer = context->getGenericUniformBuffer();
9618 break;
9619 default:
9620 return gl::error(GL_INVALID_ENUM);
9621 }
9622
9623 if (!readBuffer || !writeBuffer)
9624 {
9625 return gl::error(GL_INVALID_OPERATION);
9626 }
9627
9628 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9629 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9630 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9631 {
9632 return gl::error(GL_INVALID_VALUE);
9633 }
9634
9635 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9636 {
9637 return gl::error(GL_INVALID_VALUE);
9638 }
9639
9640 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9641
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009642 // if size is zero, the copy is a successful no-op
9643 if (size > 0)
9644 {
9645 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9646 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009647 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009648 }
9649 catch(std::bad_alloc&)
9650 {
9651 return gl::error(GL_OUT_OF_MEMORY);
9652 }
9653}
9654
9655void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9656{
9657 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9658 program, uniformCount, uniformNames, uniformIndices);
9659
9660 try
9661 {
9662 gl::Context *context = gl::getNonLostContext();
9663
9664 if (context)
9665 {
9666 if (context->getClientVersion() < 3)
9667 {
9668 return gl::error(GL_INVALID_OPERATION);
9669 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009670
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009671 if (uniformCount < 0)
9672 {
9673 return gl::error(GL_INVALID_VALUE);
9674 }
9675
9676 gl::Program *programObject = context->getProgram(program);
9677
9678 if (!programObject)
9679 {
9680 if (context->getShader(program))
9681 {
9682 return gl::error(GL_INVALID_OPERATION);
9683 }
9684 else
9685 {
9686 return gl::error(GL_INVALID_VALUE);
9687 }
9688 }
9689
9690 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9691 if (!programObject->isLinked() || !programBinary)
9692 {
9693 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9694 {
9695 uniformIndices[uniformId] = GL_INVALID_INDEX;
9696 }
9697 }
9698 else
9699 {
9700 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9701 {
9702 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9703 }
9704 }
9705 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009706 }
9707 catch(std::bad_alloc&)
9708 {
9709 return gl::error(GL_OUT_OF_MEMORY);
9710 }
9711}
9712
9713void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9714{
9715 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9716 program, uniformCount, uniformIndices, pname, params);
9717
9718 try
9719 {
9720 gl::Context *context = gl::getNonLostContext();
9721
9722 if (context)
9723 {
9724 if (context->getClientVersion() < 3)
9725 {
9726 return gl::error(GL_INVALID_OPERATION);
9727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009728
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009729 if (uniformCount < 0)
9730 {
9731 return gl::error(GL_INVALID_VALUE);
9732 }
9733
9734 gl::Program *programObject = context->getProgram(program);
9735
9736 if (!programObject)
9737 {
9738 if (context->getShader(program))
9739 {
9740 return gl::error(GL_INVALID_OPERATION);
9741 }
9742 else
9743 {
9744 return gl::error(GL_INVALID_VALUE);
9745 }
9746 }
9747
9748 switch (pname)
9749 {
9750 case GL_UNIFORM_TYPE:
9751 case GL_UNIFORM_SIZE:
9752 case GL_UNIFORM_NAME_LENGTH:
9753 case GL_UNIFORM_BLOCK_INDEX:
9754 case GL_UNIFORM_OFFSET:
9755 case GL_UNIFORM_ARRAY_STRIDE:
9756 case GL_UNIFORM_MATRIX_STRIDE:
9757 case GL_UNIFORM_IS_ROW_MAJOR:
9758 break;
9759 default:
9760 return gl::error(GL_INVALID_ENUM);
9761 }
9762
9763 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9764
9765 if (!programBinary && uniformCount > 0)
9766 {
9767 return gl::error(GL_INVALID_VALUE);
9768 }
9769
9770 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9771 {
9772 const GLuint index = uniformIndices[uniformId];
9773
9774 if (index >= (GLuint)programBinary->getActiveUniformCount())
9775 {
9776 return gl::error(GL_INVALID_VALUE);
9777 }
9778 }
9779
9780 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9781 {
9782 const GLuint index = uniformIndices[uniformId];
9783 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9784 }
9785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009786 }
9787 catch(std::bad_alloc&)
9788 {
9789 return gl::error(GL_OUT_OF_MEMORY);
9790 }
9791}
9792
9793GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9794{
9795 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9796
9797 try
9798 {
9799 gl::Context *context = gl::getNonLostContext();
9800
9801 if (context)
9802 {
9803 if (context->getClientVersion() < 3)
9804 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009805 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009806 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009807
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009808 gl::Program *programObject = context->getProgram(program);
9809
9810 if (!programObject)
9811 {
9812 if (context->getShader(program))
9813 {
9814 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9815 }
9816 else
9817 {
9818 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9819 }
9820 }
9821
9822 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9823 if (!programBinary)
9824 {
9825 return GL_INVALID_INDEX;
9826 }
9827
9828 return programBinary->getUniformBlockIndex(uniformBlockName);
9829 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009830 }
9831 catch(std::bad_alloc&)
9832 {
9833 return gl::error(GL_OUT_OF_MEMORY, 0);
9834 }
9835
9836 return 0;
9837}
9838
9839void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9840{
9841 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9842 program, uniformBlockIndex, pname, params);
9843
9844 try
9845 {
9846 gl::Context *context = gl::getNonLostContext();
9847
9848 if (context)
9849 {
9850 if (context->getClientVersion() < 3)
9851 {
9852 return gl::error(GL_INVALID_OPERATION);
9853 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009854 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009855
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009856 if (!programObject)
9857 {
9858 if (context->getShader(program))
9859 {
9860 return gl::error(GL_INVALID_OPERATION);
9861 }
9862 else
9863 {
9864 return gl::error(GL_INVALID_VALUE);
9865 }
9866 }
9867
9868 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9869
9870 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9871 {
9872 return gl::error(GL_INVALID_VALUE);
9873 }
9874
9875 switch (pname)
9876 {
9877 case GL_UNIFORM_BLOCK_BINDING:
9878 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9879 break;
9880
9881 case GL_UNIFORM_BLOCK_DATA_SIZE:
9882 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9883 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9884 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9885 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9886 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9887 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9888 break;
9889
9890 default:
9891 return gl::error(GL_INVALID_ENUM);
9892 }
9893 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009894 }
9895 catch(std::bad_alloc&)
9896 {
9897 return gl::error(GL_OUT_OF_MEMORY);
9898 }
9899}
9900
9901void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9902{
9903 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9904 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9905
9906 try
9907 {
9908 gl::Context *context = gl::getNonLostContext();
9909
9910 if (context)
9911 {
9912 if (context->getClientVersion() < 3)
9913 {
9914 return gl::error(GL_INVALID_OPERATION);
9915 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009916
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009917 gl::Program *programObject = context->getProgram(program);
9918
9919 if (!programObject)
9920 {
9921 if (context->getShader(program))
9922 {
9923 return gl::error(GL_INVALID_OPERATION);
9924 }
9925 else
9926 {
9927 return gl::error(GL_INVALID_VALUE);
9928 }
9929 }
9930
9931 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9932
9933 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9934 {
9935 return gl::error(GL_INVALID_VALUE);
9936 }
9937
9938 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
9939 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009940 }
9941 catch(std::bad_alloc&)
9942 {
9943 return gl::error(GL_OUT_OF_MEMORY);
9944 }
9945}
9946
9947void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9948{
9949 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9950 program, uniformBlockIndex, uniformBlockBinding);
9951
9952 try
9953 {
9954 gl::Context *context = gl::getNonLostContext();
9955
9956 if (context)
9957 {
9958 if (context->getClientVersion() < 3)
9959 {
9960 return gl::error(GL_INVALID_OPERATION);
9961 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009962
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00009963 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
9964 {
9965 return gl::error(GL_INVALID_VALUE);
9966 }
9967
9968 gl::Program *programObject = context->getProgram(program);
9969
9970 if (!programObject)
9971 {
9972 if (context->getShader(program))
9973 {
9974 return gl::error(GL_INVALID_OPERATION);
9975 }
9976 else
9977 {
9978 return gl::error(GL_INVALID_VALUE);
9979 }
9980 }
9981
9982 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9983
9984 // if never linked, there won't be any uniform blocks
9985 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9986 {
9987 return gl::error(GL_INVALID_VALUE);
9988 }
9989
9990 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9991 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009992 }
9993 catch(std::bad_alloc&)
9994 {
9995 return gl::error(GL_OUT_OF_MEMORY);
9996 }
9997}
9998
9999void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
10000{
10001 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
10002 mode, first, count, instanceCount);
10003
10004 try
10005 {
10006 gl::Context *context = gl::getNonLostContext();
10007
10008 if (context)
10009 {
10010 if (context->getClientVersion() < 3)
10011 {
10012 return gl::error(GL_INVALID_OPERATION);
10013 }
10014 }
10015
10016 UNIMPLEMENTED();
10017 }
10018 catch(std::bad_alloc&)
10019 {
10020 return gl::error(GL_OUT_OF_MEMORY);
10021 }
10022}
10023
10024void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
10025{
10026 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
10027 mode, count, type, indices, instanceCount);
10028
10029 try
10030 {
10031 gl::Context *context = gl::getNonLostContext();
10032
10033 if (context)
10034 {
10035 if (context->getClientVersion() < 3)
10036 {
10037 return gl::error(GL_INVALID_OPERATION);
10038 }
10039 }
10040
10041 UNIMPLEMENTED();
10042 }
10043 catch(std::bad_alloc&)
10044 {
10045 return gl::error(GL_OUT_OF_MEMORY);
10046 }
10047}
10048
10049GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
10050{
10051 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
10052
10053 try
10054 {
10055 gl::Context *context = gl::getNonLostContext();
10056
10057 if (context)
10058 {
10059 if (context->getClientVersion() < 3)
10060 {
10061 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
10062 }
10063 }
10064
10065 UNIMPLEMENTED();
10066 }
10067 catch(std::bad_alloc&)
10068 {
10069 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
10070 }
10071
10072 return NULL;
10073}
10074
10075GLboolean __stdcall glIsSync(GLsync sync)
10076{
10077 EVENT("(GLsync sync = 0x%0.8p)", sync);
10078
10079 try
10080 {
10081 gl::Context *context = gl::getNonLostContext();
10082
10083 if (context)
10084 {
10085 if (context->getClientVersion() < 3)
10086 {
10087 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10088 }
10089 }
10090
10091 UNIMPLEMENTED();
10092 }
10093 catch(std::bad_alloc&)
10094 {
10095 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10096 }
10097
10098 return GL_FALSE;
10099}
10100
10101void __stdcall glDeleteSync(GLsync sync)
10102{
10103 EVENT("(GLsync sync = 0x%0.8p)", sync);
10104
10105 try
10106 {
10107 gl::Context *context = gl::getNonLostContext();
10108
10109 if (context)
10110 {
10111 if (context->getClientVersion() < 3)
10112 {
10113 return gl::error(GL_INVALID_OPERATION);
10114 }
10115 }
10116
10117 UNIMPLEMENTED();
10118 }
10119 catch(std::bad_alloc&)
10120 {
10121 return gl::error(GL_OUT_OF_MEMORY);
10122 }
10123}
10124
10125GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10126{
10127 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10128 sync, flags, timeout);
10129
10130 try
10131 {
10132 gl::Context *context = gl::getNonLostContext();
10133
10134 if (context)
10135 {
10136 if (context->getClientVersion() < 3)
10137 {
10138 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10139 }
10140 }
10141
10142 UNIMPLEMENTED();
10143 }
10144 catch(std::bad_alloc&)
10145 {
10146 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10147 }
10148
10149 return GL_FALSE;
10150}
10151
10152void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10153{
10154 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10155 sync, flags, timeout);
10156
10157 try
10158 {
10159 gl::Context *context = gl::getNonLostContext();
10160
10161 if (context)
10162 {
10163 if (context->getClientVersion() < 3)
10164 {
10165 return gl::error(GL_INVALID_OPERATION);
10166 }
10167 }
10168
10169 UNIMPLEMENTED();
10170 }
10171 catch(std::bad_alloc&)
10172 {
10173 return gl::error(GL_OUT_OF_MEMORY);
10174 }
10175}
10176
10177void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10178{
10179 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10180 pname, params);
10181
10182 try
10183 {
10184 gl::Context *context = gl::getNonLostContext();
10185
10186 if (context)
10187 {
10188 if (context->getClientVersion() < 3)
10189 {
10190 return gl::error(GL_INVALID_OPERATION);
10191 }
10192 }
10193
10194 UNIMPLEMENTED();
10195 }
10196 catch(std::bad_alloc&)
10197 {
10198 return gl::error(GL_OUT_OF_MEMORY);
10199 }
10200}
10201
10202void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10203{
10204 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10205 sync, pname, bufSize, length, values);
10206
10207 try
10208 {
10209 gl::Context *context = gl::getNonLostContext();
10210
10211 if (context)
10212 {
10213 if (context->getClientVersion() < 3)
10214 {
10215 return gl::error(GL_INVALID_OPERATION);
10216 }
10217 }
10218
10219 UNIMPLEMENTED();
10220 }
10221 catch(std::bad_alloc&)
10222 {
10223 return gl::error(GL_OUT_OF_MEMORY);
10224 }
10225}
10226
10227void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10228{
10229 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10230 target, index, data);
10231
10232 try
10233 {
10234 gl::Context *context = gl::getNonLostContext();
10235
10236 if (context)
10237 {
10238 if (context->getClientVersion() < 3)
10239 {
10240 return gl::error(GL_INVALID_OPERATION);
10241 }
10242 }
10243
10244 UNIMPLEMENTED();
10245 }
10246 catch(std::bad_alloc&)
10247 {
10248 return gl::error(GL_OUT_OF_MEMORY);
10249 }
10250}
10251
10252void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10253{
10254 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10255 target, pname, params);
10256
10257 try
10258 {
10259 gl::Context *context = gl::getNonLostContext();
10260
10261 if (context)
10262 {
10263 if (context->getClientVersion() < 3)
10264 {
10265 return gl::error(GL_INVALID_OPERATION);
10266 }
10267 }
10268
10269 UNIMPLEMENTED();
10270 }
10271 catch(std::bad_alloc&)
10272 {
10273 return gl::error(GL_OUT_OF_MEMORY);
10274 }
10275}
10276
10277void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10278{
10279 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10280
10281 try
10282 {
10283 gl::Context *context = gl::getNonLostContext();
10284
10285 if (context)
10286 {
10287 if (context->getClientVersion() < 3)
10288 {
10289 return gl::error(GL_INVALID_OPERATION);
10290 }
10291 }
10292
10293 UNIMPLEMENTED();
10294 }
10295 catch(std::bad_alloc&)
10296 {
10297 return gl::error(GL_OUT_OF_MEMORY);
10298 }
10299}
10300
10301void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10302{
10303 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10304
10305 try
10306 {
10307 gl::Context *context = gl::getNonLostContext();
10308
10309 if (context)
10310 {
10311 if (context->getClientVersion() < 3)
10312 {
10313 return gl::error(GL_INVALID_OPERATION);
10314 }
10315 }
10316
10317 UNIMPLEMENTED();
10318 }
10319 catch(std::bad_alloc&)
10320 {
10321 return gl::error(GL_OUT_OF_MEMORY);
10322 }
10323}
10324
10325GLboolean __stdcall glIsSampler(GLuint sampler)
10326{
10327 EVENT("(GLuint sampler = %u)", sampler);
10328
10329 try
10330 {
10331 gl::Context *context = gl::getNonLostContext();
10332
10333 if (context)
10334 {
10335 if (context->getClientVersion() < 3)
10336 {
10337 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10338 }
10339 }
10340
10341 UNIMPLEMENTED();
10342 }
10343 catch(std::bad_alloc&)
10344 {
10345 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10346 }
10347
10348 return GL_FALSE;
10349}
10350
10351void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10352{
10353 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10354
10355 try
10356 {
10357 gl::Context *context = gl::getNonLostContext();
10358
10359 if (context)
10360 {
10361 if (context->getClientVersion() < 3)
10362 {
10363 return gl::error(GL_INVALID_OPERATION);
10364 }
10365 }
10366
10367 UNIMPLEMENTED();
10368 }
10369 catch(std::bad_alloc&)
10370 {
10371 return gl::error(GL_OUT_OF_MEMORY);
10372 }
10373}
10374
10375void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10376{
10377 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10378
10379 try
10380 {
10381 gl::Context *context = gl::getNonLostContext();
10382
10383 if (context)
10384 {
10385 if (context->getClientVersion() < 3)
10386 {
10387 return gl::error(GL_INVALID_OPERATION);
10388 }
10389 }
10390
10391 UNIMPLEMENTED();
10392 }
10393 catch(std::bad_alloc&)
10394 {
10395 return gl::error(GL_OUT_OF_MEMORY);
10396 }
10397}
10398
10399void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10400{
10401 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10402 sampler, pname, param);
10403
10404 try
10405 {
10406 gl::Context *context = gl::getNonLostContext();
10407
10408 if (context)
10409 {
10410 if (context->getClientVersion() < 3)
10411 {
10412 return gl::error(GL_INVALID_OPERATION);
10413 }
10414 }
10415
10416 UNIMPLEMENTED();
10417 }
10418 catch(std::bad_alloc&)
10419 {
10420 return gl::error(GL_OUT_OF_MEMORY);
10421 }
10422}
10423
10424void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10425{
10426 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10427
10428 try
10429 {
10430 gl::Context *context = gl::getNonLostContext();
10431
10432 if (context)
10433 {
10434 if (context->getClientVersion() < 3)
10435 {
10436 return gl::error(GL_INVALID_OPERATION);
10437 }
10438 }
10439
10440 UNIMPLEMENTED();
10441 }
10442 catch(std::bad_alloc&)
10443 {
10444 return gl::error(GL_OUT_OF_MEMORY);
10445 }
10446}
10447
10448void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10449{
10450 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10451
10452 try
10453 {
10454 gl::Context *context = gl::getNonLostContext();
10455
10456 if (context)
10457 {
10458 if (context->getClientVersion() < 3)
10459 {
10460 return gl::error(GL_INVALID_OPERATION);
10461 }
10462 }
10463
10464 UNIMPLEMENTED();
10465 }
10466 catch(std::bad_alloc&)
10467 {
10468 return gl::error(GL_OUT_OF_MEMORY);
10469 }
10470}
10471
10472void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10473{
10474 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10475
10476 try
10477 {
10478 gl::Context *context = gl::getNonLostContext();
10479
10480 if (context)
10481 {
10482 if (context->getClientVersion() < 3)
10483 {
10484 return gl::error(GL_INVALID_OPERATION);
10485 }
10486 }
10487
10488 UNIMPLEMENTED();
10489 }
10490 catch(std::bad_alloc&)
10491 {
10492 return gl::error(GL_OUT_OF_MEMORY);
10493 }
10494}
10495
10496void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10497{
10498 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10499
10500 try
10501 {
10502 gl::Context *context = gl::getNonLostContext();
10503
10504 if (context)
10505 {
10506 if (context->getClientVersion() < 3)
10507 {
10508 return gl::error(GL_INVALID_OPERATION);
10509 }
10510 }
10511
10512 UNIMPLEMENTED();
10513 }
10514 catch(std::bad_alloc&)
10515 {
10516 return gl::error(GL_OUT_OF_MEMORY);
10517 }
10518}
10519
10520void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10521{
10522 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10523
10524 try
10525 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010526 if (index >= gl::MAX_VERTEX_ATTRIBS)
10527 {
10528 return gl::error(GL_INVALID_VALUE);
10529 }
10530
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010531 gl::Context *context = gl::getNonLostContext();
10532
10533 if (context)
10534 {
10535 if (context->getClientVersion() < 3)
10536 {
10537 return gl::error(GL_INVALID_OPERATION);
10538 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010539
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010540 context->setVertexAttribDivisor(index, divisor);
10541 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010542 }
10543 catch(std::bad_alloc&)
10544 {
10545 return gl::error(GL_OUT_OF_MEMORY);
10546 }
10547}
10548
10549void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10550{
10551 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10552
10553 try
10554 {
10555 gl::Context *context = gl::getNonLostContext();
10556
10557 if (context)
10558 {
10559 if (context->getClientVersion() < 3)
10560 {
10561 return gl::error(GL_INVALID_OPERATION);
10562 }
10563 }
10564
10565 UNIMPLEMENTED();
10566 }
10567 catch(std::bad_alloc&)
10568 {
10569 return gl::error(GL_OUT_OF_MEMORY);
10570 }
10571}
10572
10573void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10574{
10575 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10576
10577 try
10578 {
10579 gl::Context *context = gl::getNonLostContext();
10580
10581 if (context)
10582 {
10583 if (context->getClientVersion() < 3)
10584 {
10585 return gl::error(GL_INVALID_OPERATION);
10586 }
10587 }
10588
10589 UNIMPLEMENTED();
10590 }
10591 catch(std::bad_alloc&)
10592 {
10593 return gl::error(GL_OUT_OF_MEMORY);
10594 }
10595}
10596
10597void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10598{
10599 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10600
10601 try
10602 {
10603 gl::Context *context = gl::getNonLostContext();
10604
10605 if (context)
10606 {
10607 if (context->getClientVersion() < 3)
10608 {
10609 return gl::error(GL_INVALID_OPERATION);
10610 }
10611 }
10612
10613 UNIMPLEMENTED();
10614 }
10615 catch(std::bad_alloc&)
10616 {
10617 return gl::error(GL_OUT_OF_MEMORY);
10618 }
10619}
10620
10621GLboolean __stdcall glIsTransformFeedback(GLuint id)
10622{
10623 EVENT("(GLuint id = %u)", id);
10624
10625 try
10626 {
10627 gl::Context *context = gl::getNonLostContext();
10628
10629 if (context)
10630 {
10631 if (context->getClientVersion() < 3)
10632 {
10633 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10634 }
10635 }
10636
10637 UNIMPLEMENTED();
10638 }
10639 catch(std::bad_alloc&)
10640 {
10641 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10642 }
10643
10644 return GL_FALSE;
10645}
10646
10647void __stdcall glPauseTransformFeedback(void)
10648{
10649 EVENT("(void)");
10650
10651 try
10652 {
10653 gl::Context *context = gl::getNonLostContext();
10654
10655 if (context)
10656 {
10657 if (context->getClientVersion() < 3)
10658 {
10659 return gl::error(GL_INVALID_OPERATION);
10660 }
10661 }
10662
10663 UNIMPLEMENTED();
10664 }
10665 catch(std::bad_alloc&)
10666 {
10667 return gl::error(GL_OUT_OF_MEMORY);
10668 }
10669}
10670
10671void __stdcall glResumeTransformFeedback(void)
10672{
10673 EVENT("(void)");
10674
10675 try
10676 {
10677 gl::Context *context = gl::getNonLostContext();
10678
10679 if (context)
10680 {
10681 if (context->getClientVersion() < 3)
10682 {
10683 return gl::error(GL_INVALID_OPERATION);
10684 }
10685 }
10686
10687 UNIMPLEMENTED();
10688 }
10689 catch(std::bad_alloc&)
10690 {
10691 return gl::error(GL_OUT_OF_MEMORY);
10692 }
10693}
10694
10695void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10696{
10697 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10698 program, bufSize, length, binaryFormat, binary);
10699
10700 try
10701 {
10702 gl::Context *context = gl::getNonLostContext();
10703
10704 if (context)
10705 {
10706 if (context->getClientVersion() < 3)
10707 {
10708 return gl::error(GL_INVALID_OPERATION);
10709 }
10710 }
10711
10712 UNIMPLEMENTED();
10713 }
10714 catch(std::bad_alloc&)
10715 {
10716 return gl::error(GL_OUT_OF_MEMORY);
10717 }
10718}
10719
10720void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10721{
10722 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10723 program, binaryFormat, binary, length);
10724
10725 try
10726 {
10727 gl::Context *context = gl::getNonLostContext();
10728
10729 if (context)
10730 {
10731 if (context->getClientVersion() < 3)
10732 {
10733 return gl::error(GL_INVALID_OPERATION);
10734 }
10735 }
10736
10737 UNIMPLEMENTED();
10738 }
10739 catch(std::bad_alloc&)
10740 {
10741 return gl::error(GL_OUT_OF_MEMORY);
10742 }
10743}
10744
10745void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10746{
10747 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10748 program, pname, value);
10749
10750 try
10751 {
10752 gl::Context *context = gl::getNonLostContext();
10753
10754 if (context)
10755 {
10756 if (context->getClientVersion() < 3)
10757 {
10758 return gl::error(GL_INVALID_OPERATION);
10759 }
10760 }
10761
10762 UNIMPLEMENTED();
10763 }
10764 catch(std::bad_alloc&)
10765 {
10766 return gl::error(GL_OUT_OF_MEMORY);
10767 }
10768}
10769
10770void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10771{
10772 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10773 target, numAttachments, attachments);
10774
10775 try
10776 {
10777 gl::Context *context = gl::getNonLostContext();
10778
10779 if (context)
10780 {
10781 if (context->getClientVersion() < 3)
10782 {
10783 return gl::error(GL_INVALID_OPERATION);
10784 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010785
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010786 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10787 {
10788 return;
10789 }
10790
10791 int maxDimension = context->getMaximumRenderbufferDimension();
10792 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
10793 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010794 }
10795 catch(std::bad_alloc&)
10796 {
10797 return gl::error(GL_OUT_OF_MEMORY);
10798 }
10799}
10800
10801void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10802{
10803 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10804 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10805 target, numAttachments, attachments, x, y, width, height);
10806
10807 try
10808 {
10809 gl::Context *context = gl::getNonLostContext();
10810
10811 if (context)
10812 {
10813 if (context->getClientVersion() < 3)
10814 {
10815 return gl::error(GL_INVALID_OPERATION);
10816 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010817
shannonwoods@chromium.orgd63ef892013-05-30 00:10:56 +000010818 if (!validateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
10819 {
10820 return;
10821 }
10822
10823 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
10824 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010825 }
10826 catch(std::bad_alloc&)
10827 {
10828 return gl::error(GL_OUT_OF_MEMORY);
10829 }
10830}
10831
10832void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10833{
10834 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10835 target, levels, internalformat, width, height);
10836
10837 try
10838 {
10839 gl::Context *context = gl::getNonLostContext();
10840
10841 if (context)
10842 {
10843 if (context->getClientVersion() < 3)
10844 {
10845 return gl::error(GL_INVALID_OPERATION);
10846 }
10847 }
10848
10849 UNIMPLEMENTED();
10850 }
10851 catch(std::bad_alloc&)
10852 {
10853 return gl::error(GL_OUT_OF_MEMORY);
10854 }
10855}
10856
10857void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10858{
10859 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10860 "GLsizei height = %d, GLsizei depth = %d)",
10861 target, levels, internalformat, width, height, depth);
10862
10863 try
10864 {
10865 gl::Context *context = gl::getNonLostContext();
10866
10867 if (context)
10868 {
10869 if (context->getClientVersion() < 3)
10870 {
10871 return gl::error(GL_INVALID_OPERATION);
10872 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010873 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010874 }
10875 catch(std::bad_alloc&)
10876 {
10877 return gl::error(GL_OUT_OF_MEMORY);
10878 }
10879}
10880
10881void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10882{
10883 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10884 "GLint* params = 0x%0.8p)",
10885 target, internalformat, pname, bufSize, params);
10886
10887 try
10888 {
10889 gl::Context *context = gl::getNonLostContext();
10890
10891 if (context)
10892 {
10893 if (context->getClientVersion() < 3)
10894 {
10895 return gl::error(GL_INVALID_OPERATION);
10896 }
10897 }
10898
10899 UNIMPLEMENTED();
10900 }
10901 catch(std::bad_alloc&)
10902 {
10903 return gl::error(GL_OUT_OF_MEMORY);
10904 }
10905}
10906
10907// Extension functions
10908
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010909void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10910 GLbitfield mask, GLenum filter)
10911{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010912 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010913 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10914 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10915 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10916
10917 try
10918 {
10919 switch (filter)
10920 {
10921 case GL_NEAREST:
10922 break;
10923 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010925 }
10926
10927 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010929 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010930 }
10931
10932 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10933 {
10934 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010935 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010936 }
10937
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010938 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010939
10940 if (context)
10941 {
10942 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10943 {
10944 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010945 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010946 }
10947
10948 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10949 }
10950 }
10951 catch(std::bad_alloc&)
10952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010954 }
10955}
10956
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010957void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10958 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010959{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010960 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010961 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010962 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010963 target, level, internalformat, width, height, depth, border, format, type, pixels);
10964
10965 try
10966 {
10967 UNIMPLEMENTED(); // FIXME
10968 }
10969 catch(std::bad_alloc&)
10970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010971 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010972 }
10973}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010974
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010975void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10976 GLenum *binaryFormat, void *binary)
10977{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010978 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 +000010979 program, bufSize, length, binaryFormat, binary);
10980
10981 try
10982 {
10983 gl::Context *context = gl::getNonLostContext();
10984
10985 if (context)
10986 {
10987 gl::Program *programObject = context->getProgram(program);
10988
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010989 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010991 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010992 }
10993
10994 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10995
10996 if (!programBinary)
10997 {
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 }
11000
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011001 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011003 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011004 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000011005
11006 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011007 }
11008 }
11009 catch(std::bad_alloc&)
11010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011011 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011012 }
11013}
11014
11015void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
11016 const void *binary, GLint length)
11017{
11018 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
11019 program, binaryFormat, binary, length);
11020
11021 try
11022 {
11023 gl::Context *context = gl::getNonLostContext();
11024
11025 if (context)
11026 {
11027 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
11028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011029 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011030 }
11031
11032 gl::Program *programObject = context->getProgram(program);
11033
11034 if (!programObject)
11035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011036 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011037 }
11038
daniel@transgaming.com95d29422012-07-24 18:36:10 +000011039 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011040 }
11041 }
11042 catch(std::bad_alloc&)
11043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011044 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011045 }
11046}
11047
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011048void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
11049{
11050 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
11051
11052 try
11053 {
11054 gl::Context *context = gl::getNonLostContext();
11055
11056 if (context)
11057 {
11058 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
11059 {
11060 return gl::error(GL_INVALID_VALUE);
11061 }
11062
11063 if (context->getDrawFramebufferHandle() == 0)
11064 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011065 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011066 {
11067 return gl::error(GL_INVALID_OPERATION);
11068 }
11069
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011070 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011071 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011072 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011073 }
11074 }
11075 else
11076 {
11077 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11078 {
11079 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
11080 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
11081 {
11082 return gl::error(GL_INVALID_OPERATION);
11083 }
11084 }
11085 }
11086
11087 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
11088
11089 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
11090 {
11091 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
11092 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011093
11094 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
11095 {
11096 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
11097 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011098 }
11099 }
11100 catch (std::bad_alloc&)
11101 {
11102 return gl::error(GL_OUT_OF_MEMORY);
11103 }
11104}
11105
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011106__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
11107{
11108 struct Extension
11109 {
11110 const char *name;
11111 __eglMustCastToProperFunctionPointerType address;
11112 };
11113
11114 static const Extension glExtensions[] =
11115 {
11116 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011117 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011118 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011119 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11120 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11121 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11122 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11123 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11124 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11125 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011126 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011127 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011128 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11129 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11130 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11131 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011132 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11133 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11134 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11135 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11136 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11137 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11138 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011139 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011140 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11141 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11142 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011143 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11144 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011145
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011146 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011147 {
11148 if (strcmp(procname, glExtensions[ext].name) == 0)
11149 {
11150 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11151 }
11152 }
11153
11154 return NULL;
11155}
11156
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011157// Non-public functions used by EGL
11158
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011159bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011160{
11161 EVENT("(egl::Surface* surface = 0x%0.8p)",
11162 surface);
11163
11164 try
11165 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011166 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011167
11168 if (context)
11169 {
11170 gl::Texture2D *textureObject = context->getTexture2D();
11171
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011172 if (textureObject->isImmutable())
11173 {
11174 return false;
11175 }
11176
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011177 if (textureObject)
11178 {
11179 textureObject->bindTexImage(surface);
11180 }
11181 }
11182 }
11183 catch(std::bad_alloc&)
11184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011185 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011186 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011187
11188 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011189}
11190
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011191}