blob: 0dfeae6536c0db33b02e8027c48e4ee22c5deaac [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +000014#include "libGLESv2/formatutils.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000016#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000018#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000020#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000022#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000023#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000025bool validImageSize(GLint level, GLsizei width, GLsizei height, GLsizei depth)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000026{
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000027 if (level < 0 || width < 0 || height < 0 || depth < 0)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000028 {
29 return false;
30 }
31
32 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
33 {
34 return true;
35 }
36
37 if (level == 0)
38 {
39 return true;
40 }
41
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000042 if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000043 {
44 return true;
45 }
46
47 return false;
48}
49
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000050// Verify that format/type are one of the combinations from table 3.4.
51bool checkTextureFormatType(GLenum format, GLenum type)
52{
53 // validate <format> by itself (used as secondary key below)
54 switch (format)
55 {
56 case GL_RGBA:
57 case GL_BGRA_EXT:
58 case GL_RGB:
59 case GL_ALPHA:
60 case GL_LUMINANCE:
61 case GL_LUMINANCE_ALPHA:
62 case GL_DEPTH_COMPONENT:
63 case GL_DEPTH_STENCIL_OES:
64 break;
65 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000066 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000067 }
68
69 // invalid <type> -> sets INVALID_ENUM
70 // invalid <format>+<type> combination -> sets INVALID_OPERATION
71 switch (type)
72 {
73 case GL_UNSIGNED_BYTE:
74 switch (format)
75 {
76 case GL_RGBA:
77 case GL_BGRA_EXT:
78 case GL_RGB:
79 case GL_ALPHA:
80 case GL_LUMINANCE:
81 case GL_LUMINANCE_ALPHA:
82 return true;
83 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000084 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000085 }
86
87 case GL_FLOAT:
88 case GL_HALF_FLOAT_OES:
89 switch (format)
90 {
91 case GL_RGBA:
92 case GL_RGB:
93 case GL_ALPHA:
94 case GL_LUMINANCE:
95 case GL_LUMINANCE_ALPHA:
96 return true;
97 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000098 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000099 }
100
101 case GL_UNSIGNED_SHORT_4_4_4_4:
102 case GL_UNSIGNED_SHORT_5_5_5_1:
103 switch (format)
104 {
105 case GL_RGBA:
106 return true;
107 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000108 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000109 }
110
111 case GL_UNSIGNED_SHORT_5_6_5:
112 switch (format)
113 {
114 case GL_RGB:
115 return true;
116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000117 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000118 }
119
120 case GL_UNSIGNED_SHORT:
121 case GL_UNSIGNED_INT:
122 switch (format)
123 {
124 case GL_DEPTH_COMPONENT:
125 return true;
126 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000127 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000128 }
129
130 case GL_UNSIGNED_INT_24_8_OES:
131 switch (format)
132 {
133 case GL_DEPTH_STENCIL_OES:
134 return true;
135 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000136 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000137 }
138
139 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000140 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000141 }
142}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000143
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000144bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000145 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000146 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000147{
148 if (!texture)
149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000150 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000151 }
152
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000153 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000156 }
157
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000158 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000159 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000160 GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000161 if (internalformat != texture->getInternalFormat(level))
162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000163 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000164 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000165 }
166
167 if (compressed)
168 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000169 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
170 (height % 4 != 0 && height != texture->getHeight(0)))
171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000172 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000173 }
174 }
175
176 if (xoffset + width > texture->getWidth(level) ||
177 yoffset + height > texture->getHeight(level))
178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000179 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000180 }
181
182 return true;
183}
184
185bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000186 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000187 gl::TextureCubeMap *texture)
188{
189 if (!texture)
190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000191 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000192 }
193
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000194 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000196 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000197 }
198
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000199 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000200 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000201 GLenum internalformat = gl::GetSizedInternalFormat(format, type, 2);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000202 if (internalformat != texture->getInternalFormat(target, level))
203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000204 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000205 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000206 }
207
208 if (compressed)
209 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000210 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
211 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000213 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000214 }
215 }
216
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000217 if (xoffset + width > texture->getWidth(target, level) ||
218 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000220 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000221 }
222
223 return true;
224}
225
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000226bool validateES3TexImageFormat(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
227 GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
228 GLint border, GLenum format, GLenum type)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000229{
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000230 // Validate image size
231 if (level < 0 || width < 0 || height < 0 || depth < 0 )
232 {
233 return gl::error(GL_INVALID_VALUE, false);
234 }
235
236 if (isCompressed)
237 {
238 if (width != 1 && width != 2 && width % 4 != 0)
239 {
240 return gl::error(GL_INVALID_OPERATION, false);
241 }
242
243 if (height != 1 && height != 2 && height % 4 != 0)
244 {
245 return gl::error(GL_INVALID_OPERATION, false);
246 }
247 }
248
249 // Verify zero border
250 if (border != 0)
251 {
252 return gl::error(GL_INVALID_VALUE, false);
253 }
254
255 // Validate dimensions based on Context limits and validate the texture
256 if (level > context->getMaximumTextureLevel())
257 {
258 return gl::error(GL_INVALID_VALUE, false);
259 }
260
261 gl::Texture *texture = NULL;
262 bool textureCompressed = false;
263 GLenum textureInternalFormat = GL_NONE;
264 GLint textureLevelWidth = 0;
265 GLint textureLevelHeight = 0;
266 GLint textureLevelDepth = 0;
267 switch (target)
268 {
269 case GL_TEXTURE_2D:
270 {
271 if (width > (context->getMaximum2DTextureDimension() >> level) ||
272 height > (context->getMaximum2DTextureDimension() >> level))
273 {
274 return gl::error(GL_INVALID_VALUE, false);
275 }
276
277 gl::Texture2D *texture2d = context->getTexture2D();
278 if (texture2d)
279 {
280 textureCompressed = texture2d->isCompressed(level);
281 textureInternalFormat = texture2d->getInternalFormat(level);
282 textureLevelWidth = texture2d->getWidth(level);
283 textureLevelHeight = texture2d->getHeight(level);
284 textureLevelDepth = 1;
285 texture = texture2d;
286 }
287 }
288 break;
289
290 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
291 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
292 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
293 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
294 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
295 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
296 {
297 if (width != height)
298 {
299 return gl::error(GL_INVALID_VALUE, false);
300 }
301
302 if (width > (context->getMaximumCubeTextureDimension() >> level))
303 {
304 return gl::error(GL_INVALID_VALUE, false);
305 }
306
307 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
308 if (textureCube)
309 {
310 textureCompressed = textureCube->isCompressed(target, level);
311 textureInternalFormat = textureCube->getInternalFormat(target, level);
312 textureLevelWidth = textureCube->getWidth(target, level);
313 textureLevelHeight = textureCube->getHeight(target, level);
314 textureLevelDepth = 1;
315 texture = textureCube;
316 }
317 }
318 break;
319
320 case GL_TEXTURE_3D:
321 {
322 if (width > (context->getMaximum3DTextureDimension() >> level) ||
323 height > (context->getMaximum3DTextureDimension() >> level) ||
324 depth > (context->getMaximum3DTextureDimension() >> level))
325 {
326 return gl::error(GL_INVALID_VALUE, false);
327 }
328
329 gl::Texture3D *texture3d = context->getTexture3D();
330 if (texture3d)
331 {
332 textureCompressed = texture3d->isCompressed(level);
333 textureInternalFormat = texture3d->getInternalFormat(level);
334 textureLevelWidth = texture3d->getWidth(level);
335 textureLevelHeight = texture3d->getHeight(level);
336 textureLevelDepth = texture3d->getDepth(level);
337 texture = texture3d;
338 }
339 }
340 break;
341
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +0000342 case GL_TEXTURE_2D_ARRAY:
343 {
344 if (width > (context->getMaximum2DTextureDimension() >> level) ||
345 height > (context->getMaximum2DTextureDimension() >> level) ||
346 depth > (context->getMaximum2DArrayTextureLayers() >> level))
347 {
348 return gl::error(GL_INVALID_VALUE, false);
349 }
350
351 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
352 if (texture2darray)
353 {
354 textureCompressed = texture2darray->isCompressed(level);
355 textureInternalFormat = texture2darray->getInternalFormat(level);
356 textureLevelWidth = texture2darray->getWidth(level);
357 textureLevelHeight = texture2darray->getHeight(level);
358 textureLevelDepth = texture2darray->getDepth(level);
359 texture = texture2darray;
360 }
361 }
362 break;
363
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000364 default:
365 return gl::error(GL_INVALID_ENUM, false);
366 }
367
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000368 if (!texture)
369 {
370 return gl::error(GL_INVALID_OPERATION, false);
371 }
372
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000373 if (texture->isImmutable())
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000374 {
375 return gl::error(GL_INVALID_OPERATION, false);
376 }
377
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000378 // Validate texture formats
379 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
380 if (isCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000381 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000382 if (!gl::IsFormatCompressed(actualInternalFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000383 {
384 return gl::error(GL_INVALID_ENUM, false);
385 }
386
387 if (target == GL_TEXTURE_3D)
388 {
389 return gl::error(GL_INVALID_OPERATION, false);
390 }
391 }
392 else
393 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000394 if (!gl::IsValidInternalFormat(actualInternalFormat, context) ||
395 !gl::IsValidFormat(format, context->getClientVersion()) ||
396 !gl::IsValidType(type, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000397 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000398 return gl::error(GL_INVALID_ENUM, false);
399 }
400
401 if (!gl::IsValidFormatCombination(actualInternalFormat, format, type, context->getClientVersion()))
402 {
403 return gl::error(GL_INVALID_OPERATION, false);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000404 }
405
406 if ((target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) &&
407 (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000408 {
409 return gl::error(GL_INVALID_OPERATION, false);
410 }
411 }
412
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000413 // Validate sub image parameters
414 if (isSubImage)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000415 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000416 if (isCompressed != textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000417 {
418 return gl::error(GL_INVALID_OPERATION, false);
419 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000420
421 if (format != GL_NONE)
422 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000423 GLenum internalformat = gl::GetSizedInternalFormat(format, type, context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000424 if (internalformat != textureInternalFormat)
425 {
426 return gl::error(GL_INVALID_OPERATION, false);
427 }
428 }
429
430 if (isCompressed)
431 {
432 if ((width % 4 != 0 && width != textureLevelWidth) ||
433 (height % 4 != 0 && height != textureLevelHeight))
434 {
435 return gl::error(GL_INVALID_OPERATION, false);
436 }
437 }
438
439 if (width == 0 || height == 0 || depth == 0)
440 {
441 return false;
442 }
443
444 if (xoffset < 0 || yoffset < 0 || zoffset < 0)
445 {
446 return gl::error(GL_INVALID_VALUE, false);
447 }
448
449 if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
450 std::numeric_limits<GLsizei>::max() - yoffset < height ||
451 std::numeric_limits<GLsizei>::max() - zoffset < depth)
452 {
453 return gl::error(GL_INVALID_VALUE, false);
454 }
455
456 if (xoffset + width > textureLevelWidth ||
457 yoffset + height > textureLevelHeight ||
458 zoffset + depth > textureLevelDepth)
459 {
460 return gl::error(GL_INVALID_VALUE, false);
461 }
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000462 }
463
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000464 return true;
465}
466
467bool validateCopyTexImageParameters(gl::Context *context, GLenum target, bool isCompressed, GLint level,
468 GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
469 GLsizei width, GLsizei height)
470{
471 if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000472 {
473 return gl::error(GL_INVALID_VALUE, false);
474 }
475
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000476 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
477 {
478 return gl::error(GL_INVALID_VALUE, false);
479 }
480
481 if (width == 0 || height == 0)
482 {
483 return false;
484 }
485
486 if (level > context->getMaximumTextureLevel())
487 {
488 return gl::error(GL_INVALID_VALUE, false);
489 }
490
491 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
492
493 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
494 {
495 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
496 }
497
498 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
499 {
500 return gl::error(GL_INVALID_OPERATION, false);
501 }
502
503 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
504 GLenum colorbufferFormat = source->getInternalFormat();
505 gl::Texture *texture = NULL;
506 GLenum textureFormat = GL_RGBA;
507 bool textureCompressed = false;
508 GLint textureLevelWidth = 0;
509 GLint textureLevelHeight = 0;
510 GLint textureLevelDepth = 0;
511 switch (target)
512 {
513 case GL_TEXTURE_2D:
514 {
515 gl::Texture2D *texture2d = context->getTexture2D();
516 if (texture2d)
517 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000518 textureFormat = gl::GetFormat(texture2d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000519 textureCompressed = texture2d->isCompressed(level);
520 textureLevelWidth = texture2d->getWidth(level);
521 textureLevelHeight = texture2d->getHeight(level);
522 textureLevelDepth = 1;
523 texture = texture2d;
524 }
525 }
526 break;
527
528 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
529 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
530 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
531 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
532 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
533 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
534 {
535 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
536 if (textureCube)
537 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000538 textureFormat = gl::GetFormat(textureCube->getInternalFormat(target, level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000539 textureCompressed = textureCube->isCompressed(target, level);
540 textureLevelWidth = textureCube->getWidth(target, level);
541 textureLevelHeight = textureCube->getHeight(target, level);
542 textureLevelDepth = 1;
543 texture = textureCube;
544 }
545 }
546 break;
547
548 case GL_TEXTURE_3D:
549 {
550 gl::Texture3D *texture3d = context->getTexture3D();
551 if (texture3d)
552 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000553 textureFormat = gl::GetFormat(texture3d->getInternalFormat(level), context->getClientVersion());
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000554 textureCompressed = texture3d->isCompressed(level);
555 textureLevelWidth = texture3d->getWidth(level);
556 textureLevelHeight = texture3d->getHeight(level);
557 textureLevelDepth = texture3d->getDepth(level);
558 texture = texture3d;
559 }
560 }
561 break;
562
563 default:
564 return gl::error(GL_INVALID_ENUM, false);
565 }
566
567 if (!texture)
568 {
569 return gl::error(GL_INVALID_OPERATION, false);
570 }
571
572 if (isCompressed != textureCompressed)
573 {
574 return gl::error(GL_INVALID_OPERATION, false);
575 }
576
577 if (isCompressed)
578 {
579 if ((width % 4 != 0 && width != textureLevelWidth) ||
580 (height % 4 != 0 && height != textureLevelHeight))
581 {
582 return gl::error(GL_INVALID_OPERATION, false);
583 }
584 }
585
586 if (xoffset + width > textureLevelWidth ||
587 yoffset + height > textureLevelHeight ||
588 zoffset >= textureLevelDepth)
589 {
590 return gl::error(GL_INVALID_VALUE, false);
591 }
592
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +0000593 if (!gl::IsValidCopyTexImageCombination(textureFormat, colorbufferFormat, context->getClientVersion()))
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000594 {
595 return gl::error(GL_INVALID_OPERATION, false);
596 }
597
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000598 return true;
599}
600
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000601// check for combinations of format and type that are valid for ReadPixels
602bool validReadFormatType(GLenum format, GLenum type)
603{
604 switch (format)
605 {
606 case GL_RGBA:
607 switch (type)
608 {
609 case GL_UNSIGNED_BYTE:
610 break;
611 default:
612 return false;
613 }
614 break;
615 case GL_BGRA_EXT:
616 switch (type)
617 {
618 case GL_UNSIGNED_BYTE:
619 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
620 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
621 break;
622 default:
623 return false;
624 }
625 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000626 default:
627 return false;
628 }
629 return true;
630}
631
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000632extern "C"
633{
634
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000635// OpenGL ES 2.0 functions
636
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000637void __stdcall glActiveTexture(GLenum texture)
638{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000639 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640
641 try
642 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000643 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000644
645 if (context)
646 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000647 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000649 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000650 }
651
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000652 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000653 }
654 }
655 catch(std::bad_alloc&)
656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000658 }
659}
660
661void __stdcall glAttachShader(GLuint program, GLuint shader)
662{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000663 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000664
665 try
666 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000667 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668
669 if (context)
670 {
671 gl::Program *programObject = context->getProgram(program);
672 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000673
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000674 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000675 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000676 if (context->getShader(program))
677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000678 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000679 }
680 else
681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000683 }
684 }
685
686 if (!shaderObject)
687 {
688 if (context->getProgram(shader))
689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000691 }
692 else
693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000694 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000696 }
697
698 if (!programObject->attachShader(shaderObject))
699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000700 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000701 }
702 }
703 }
704 catch(std::bad_alloc&)
705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000706 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000707 }
708}
709
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000710void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
711{
712 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
713
714 try
715 {
716 switch (target)
717 {
718 case GL_ANY_SAMPLES_PASSED_EXT:
719 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
720 break;
721 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000722 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000723 }
724
725 if (id == 0)
726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000727 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000728 }
729
730 gl::Context *context = gl::getNonLostContext();
731
732 if (context)
733 {
734 context->beginQuery(target, id);
735 }
736 }
737 catch(std::bad_alloc&)
738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000740 }
741}
742
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000743void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000745 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746
747 try
748 {
749 if (index >= gl::MAX_VERTEX_ATTRIBS)
750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000752 }
753
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000755
756 if (context)
757 {
758 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000759
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000760 if (!programObject)
761 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000762 if (context->getShader(program))
763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000764 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000765 }
766 else
767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000768 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000769 }
770 }
771
772 if (strncmp(name, "gl_", 3) == 0)
773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000774 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000775 }
776
777 programObject->bindAttributeLocation(index, name);
778 }
779 }
780 catch(std::bad_alloc&)
781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000782 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783 }
784}
785
786void __stdcall glBindBuffer(GLenum target, GLuint buffer)
787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000788 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789
790 try
791 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000793
794 if (context)
795 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000796 // Check ES3 specific targets
797 switch (target)
798 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000799 case GL_COPY_READ_BUFFER:
800 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000801 case GL_PIXEL_PACK_BUFFER:
802 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000803 case GL_UNIFORM_BUFFER:
804 case GL_TRANSFORM_FEEDBACK_BUFFER:
805 if (context->getClientVersion() < 3)
806 {
807 return gl::error(GL_INVALID_ENUM);
808 }
809 }
810
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000811 switch (target)
812 {
813 case GL_ARRAY_BUFFER:
814 context->bindArrayBuffer(buffer);
815 return;
816 case GL_ELEMENT_ARRAY_BUFFER:
817 context->bindElementArrayBuffer(buffer);
818 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000819 case GL_COPY_READ_BUFFER:
820 context->bindCopyReadBuffer(buffer);
821 return;
822 case GL_COPY_WRITE_BUFFER:
823 context->bindCopyWriteBuffer(buffer);
824 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000825 case GL_PIXEL_PACK_BUFFER:
826 context->bindPixelPackBuffer(buffer);
827 return;
828 case GL_PIXEL_UNPACK_BUFFER:
829 context->bindPixelUnpackBuffer(buffer);
830 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000831 case GL_UNIFORM_BUFFER:
832 context->bindGenericUniformBuffer(buffer);
833 return;
834 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000835 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000836 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000837 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000838 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000839 }
840 }
841 }
842 catch(std::bad_alloc&)
843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000844 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845 }
846}
847
848void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
849{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000850 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851
852 try
853 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000854 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000856 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000857 }
858
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000860
861 if (context)
862 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000863 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
864 {
865 context->bindReadFramebuffer(framebuffer);
866 }
867
868 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
869 {
870 context->bindDrawFramebuffer(framebuffer);
871 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872 }
873 }
874 catch(std::bad_alloc&)
875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000876 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000877 }
878}
879
880void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
881{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000882 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000883
884 try
885 {
886 if (target != GL_RENDERBUFFER)
887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000888 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000889 }
890
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000891 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892
893 if (context)
894 {
895 context->bindRenderbuffer(renderbuffer);
896 }
897 }
898 catch(std::bad_alloc&)
899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000900 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 }
902}
903
904void __stdcall glBindTexture(GLenum target, GLuint texture)
905{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000906 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000907
908 try
909 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000910 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911
912 if (context)
913 {
914 gl::Texture *textureObject = context->getTexture(texture);
915
916 if (textureObject && textureObject->getTarget() != target && texture != 0)
917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000918 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000919 }
920
921 switch (target)
922 {
923 case GL_TEXTURE_2D:
924 context->bindTexture2D(texture);
925 return;
926 case GL_TEXTURE_CUBE_MAP:
927 context->bindTextureCubeMap(texture);
928 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000929 case GL_TEXTURE_3D:
930 if (context->getClientVersion() < 3)
931 {
932 return gl::error(GL_INVALID_ENUM);
933 }
934 context->bindTexture3D(texture);
935 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000936 case GL_TEXTURE_2D_ARRAY:
937 if (context->getClientVersion() < 3)
938 {
939 return gl::error(GL_INVALID_ENUM);
940 }
941 context->bindTexture2DArray(texture);
942 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000943 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000944 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000945 }
946 }
947 }
948 catch(std::bad_alloc&)
949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000950 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000951 }
952}
953
954void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000956 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000957 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958
959 try
960 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000961 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000962
963 if (context)
964 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000965 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000966 }
967 }
968 catch(std::bad_alloc&)
969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000970 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000971 }
972}
973
974void __stdcall glBlendEquation(GLenum mode)
975{
976 glBlendEquationSeparate(mode, mode);
977}
978
979void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
980{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000981 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000982
983 try
984 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000985 gl::Context *context = gl::getNonLostContext();
986
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000987 switch (modeRGB)
988 {
989 case GL_FUNC_ADD:
990 case GL_FUNC_SUBTRACT:
991 case GL_FUNC_REVERSE_SUBTRACT:
992 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000993
994 case GL_MIN:
995 case GL_MAX:
996 if (context && context->getClientVersion() < 3)
997 {
998 return gl::error(GL_INVALID_ENUM);
999 }
1000 break;
1001
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001002 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001003 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001004 }
1005
1006 switch (modeAlpha)
1007 {
1008 case GL_FUNC_ADD:
1009 case GL_FUNC_SUBTRACT:
1010 case GL_FUNC_REVERSE_SUBTRACT:
1011 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001012
1013 case GL_MIN:
1014 case GL_MAX:
1015 if (context && context->getClientVersion() < 3)
1016 {
1017 return gl::error(GL_INVALID_ENUM);
1018 }
1019 break;
1020
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001022 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001023 }
1024
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001025 if (context)
1026 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001027 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001028 }
1029 }
1030 catch(std::bad_alloc&)
1031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001032 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001033 }
1034}
1035
1036void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1037{
1038 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1039}
1040
1041void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1042{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001043 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 +00001044 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001045
1046 try
1047 {
1048 switch (srcRGB)
1049 {
1050 case GL_ZERO:
1051 case GL_ONE:
1052 case GL_SRC_COLOR:
1053 case GL_ONE_MINUS_SRC_COLOR:
1054 case GL_DST_COLOR:
1055 case GL_ONE_MINUS_DST_COLOR:
1056 case GL_SRC_ALPHA:
1057 case GL_ONE_MINUS_SRC_ALPHA:
1058 case GL_DST_ALPHA:
1059 case GL_ONE_MINUS_DST_ALPHA:
1060 case GL_CONSTANT_COLOR:
1061 case GL_ONE_MINUS_CONSTANT_COLOR:
1062 case GL_CONSTANT_ALPHA:
1063 case GL_ONE_MINUS_CONSTANT_ALPHA:
1064 case GL_SRC_ALPHA_SATURATE:
1065 break;
1066 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001068 }
1069
1070 switch (dstRGB)
1071 {
1072 case GL_ZERO:
1073 case GL_ONE:
1074 case GL_SRC_COLOR:
1075 case GL_ONE_MINUS_SRC_COLOR:
1076 case GL_DST_COLOR:
1077 case GL_ONE_MINUS_DST_COLOR:
1078 case GL_SRC_ALPHA:
1079 case GL_ONE_MINUS_SRC_ALPHA:
1080 case GL_DST_ALPHA:
1081 case GL_ONE_MINUS_DST_ALPHA:
1082 case GL_CONSTANT_COLOR:
1083 case GL_ONE_MINUS_CONSTANT_COLOR:
1084 case GL_CONSTANT_ALPHA:
1085 case GL_ONE_MINUS_CONSTANT_ALPHA:
1086 break;
1087 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
1091 switch (srcAlpha)
1092 {
1093 case GL_ZERO:
1094 case GL_ONE:
1095 case GL_SRC_COLOR:
1096 case GL_ONE_MINUS_SRC_COLOR:
1097 case GL_DST_COLOR:
1098 case GL_ONE_MINUS_DST_COLOR:
1099 case GL_SRC_ALPHA:
1100 case GL_ONE_MINUS_SRC_ALPHA:
1101 case GL_DST_ALPHA:
1102 case GL_ONE_MINUS_DST_ALPHA:
1103 case GL_CONSTANT_COLOR:
1104 case GL_ONE_MINUS_CONSTANT_COLOR:
1105 case GL_CONSTANT_ALPHA:
1106 case GL_ONE_MINUS_CONSTANT_ALPHA:
1107 case GL_SRC_ALPHA_SATURATE:
1108 break;
1109 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001110 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001111 }
1112
1113 switch (dstAlpha)
1114 {
1115 case GL_ZERO:
1116 case GL_ONE:
1117 case GL_SRC_COLOR:
1118 case GL_ONE_MINUS_SRC_COLOR:
1119 case GL_DST_COLOR:
1120 case GL_ONE_MINUS_DST_COLOR:
1121 case GL_SRC_ALPHA:
1122 case GL_ONE_MINUS_SRC_ALPHA:
1123 case GL_DST_ALPHA:
1124 case GL_ONE_MINUS_DST_ALPHA:
1125 case GL_CONSTANT_COLOR:
1126 case GL_ONE_MINUS_CONSTANT_COLOR:
1127 case GL_CONSTANT_ALPHA:
1128 case GL_ONE_MINUS_CONSTANT_ALPHA:
1129 break;
1130 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001131 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001132 }
1133
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001134 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1135 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1136
1137 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1138 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1139
1140 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001142 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 +00001143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144 }
1145
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001146 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001147
1148 if (context)
1149 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001150 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001151 }
1152 }
1153 catch(std::bad_alloc&)
1154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001155 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156 }
1157}
1158
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001159void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001160{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001161 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 +00001162 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001163
1164 try
1165 {
1166 if (size < 0)
1167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169 }
1170
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001171 gl::Context *context = gl::getNonLostContext();
1172
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001173 switch (usage)
1174 {
1175 case GL_STREAM_DRAW:
1176 case GL_STATIC_DRAW:
1177 case GL_DYNAMIC_DRAW:
1178 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001179
1180 case GL_STREAM_READ:
1181 case GL_STREAM_COPY:
1182 case GL_STATIC_READ:
1183 case GL_STATIC_COPY:
1184 case GL_DYNAMIC_READ:
1185 case GL_DYNAMIC_COPY:
1186 if (context && context->getClientVersion() < 3)
1187 {
1188 return gl::error(GL_INVALID_ENUM);
1189 }
1190 break;
1191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001192 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001193 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001194 }
1195
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001196 if (context)
1197 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001198 // Check ES3 specific targets
1199 switch (target)
1200 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001201 case GL_COPY_READ_BUFFER:
1202 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001203 case GL_PIXEL_PACK_BUFFER:
1204 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001205 case GL_UNIFORM_BUFFER:
1206 case GL_TRANSFORM_FEEDBACK_BUFFER:
1207 if (context->getClientVersion() < 3)
1208 {
1209 return gl::error(GL_INVALID_ENUM);
1210 }
1211 }
1212
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001213 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001215 switch (target)
1216 {
1217 case GL_ARRAY_BUFFER:
1218 buffer = context->getArrayBuffer();
1219 break;
1220 case GL_ELEMENT_ARRAY_BUFFER:
1221 buffer = context->getElementArrayBuffer();
1222 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001223 case GL_COPY_READ_BUFFER:
1224 buffer = context->getCopyReadBuffer();
1225 break;
1226 case GL_COPY_WRITE_BUFFER:
1227 buffer = context->getCopyWriteBuffer();
1228 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001229 case GL_PIXEL_PACK_BUFFER:
1230 buffer = context->getPixelPackBuffer();
1231 break;
1232 case GL_PIXEL_UNPACK_BUFFER:
1233 buffer = context->getPixelUnpackBuffer();
1234 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001235 case GL_TRANSFORM_FEEDBACK_BUFFER:
1236 buffer = context->getGenericTransformFeedbackBuffer();
1237 break;
1238 case GL_UNIFORM_BUFFER:
1239 buffer = context->getGenericUniformBuffer();
1240 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243 }
1244
1245 if (!buffer)
1246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001247 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248 }
1249
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001250 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001251 }
1252 }
1253 catch(std::bad_alloc&)
1254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001255 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256 }
1257}
1258
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001259void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001261 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 +00001262 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001263
1264 try
1265 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001266 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001269 }
1270
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001271 if (data == NULL)
1272 {
1273 return;
1274 }
1275
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001276 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001277
1278 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.com0f7aaf52010-03-11 19:41:38 +00001295 gl::Buffer *buffer;
1296
1297 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.com0f7aaf52010-03-11 19:41:38 +00001323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001325 }
1326
1327 if (!buffer)
1328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001329 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001330 }
1331
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001332 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001335 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001336
1337 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001338 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001339 }
1340 catch(std::bad_alloc&)
1341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001342 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001343 }
1344}
1345
1346GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001348 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349
1350 try
1351 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001352 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001354 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001355 }
1356
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001358
1359 if (context)
1360 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001361 gl::Framebuffer *framebuffer = NULL;
1362 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1363 {
1364 framebuffer = context->getReadFramebuffer();
1365 }
1366 else
1367 {
1368 framebuffer = context->getDrawFramebuffer();
1369 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370
1371 return framebuffer->completeness();
1372 }
1373 }
1374 catch(std::bad_alloc&)
1375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001376 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001377 }
1378
1379 return 0;
1380}
1381
1382void __stdcall glClear(GLbitfield mask)
1383{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001384 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001385
1386 try
1387 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001388 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001389
1390 if (context)
1391 {
1392 context->clear(mask);
1393 }
1394 }
1395 catch(std::bad_alloc&)
1396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001397 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398 }
1399}
1400
1401void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1402{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001403 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001404 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001405
1406 try
1407 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001408 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001409
1410 if (context)
1411 {
1412 context->setClearColor(red, green, blue, alpha);
1413 }
1414 }
1415 catch(std::bad_alloc&)
1416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001417 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001418 }
1419}
1420
1421void __stdcall glClearDepthf(GLclampf depth)
1422{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001423 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001424
1425 try
1426 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001427 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001428
1429 if (context)
1430 {
1431 context->setClearDepth(depth);
1432 }
1433 }
1434 catch(std::bad_alloc&)
1435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001436 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001437 }
1438}
1439
1440void __stdcall glClearStencil(GLint s)
1441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001442 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001443
1444 try
1445 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001447
1448 if (context)
1449 {
1450 context->setClearStencil(s);
1451 }
1452 }
1453 catch(std::bad_alloc&)
1454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 }
1457}
1458
1459void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1460{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001461 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001462 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463
1464 try
1465 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001466 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467
1468 if (context)
1469 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001470 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001471 }
1472 }
1473 catch(std::bad_alloc&)
1474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001475 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001476 }
1477}
1478
1479void __stdcall glCompileShader(GLuint shader)
1480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001481 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001482
1483 try
1484 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001486
1487 if (context)
1488 {
1489 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001490
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001491 if (!shaderObject)
1492 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001493 if (context->getProgram(shader))
1494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001495 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001496 }
1497 else
1498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001500 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001501 }
1502
1503 shaderObject->compile();
1504 }
1505 }
1506 catch(std::bad_alloc&)
1507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001508 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001509 }
1510}
1511
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001512void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1513 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001514{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001515 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001516 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001517 target, level, internalformat, width, height, border, imageSize, data);
1518
1519 try
1520 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001521 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001524 }
1525
daniel@transgaming.com01868132010-08-24 19:21:17 +00001526 switch (internalformat)
1527 {
1528 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1529 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001530 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1531 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001532 break;
1533 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001534 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001535 }
1536
1537 if (border != 0)
1538 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001539 return gl::error(GL_INVALID_OPERATION);
1540 }
1541
1542 if (width != 1 && width != 2 && width % 4 != 0)
1543 {
1544 return gl::error(GL_INVALID_OPERATION);
1545 }
1546
1547 if (height != 1 && height != 2 && height % 4 != 0)
1548 {
1549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001550 }
1551
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001552 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001553
1554 if (context)
1555 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001556 if (level > context->getMaximumTextureLevel())
1557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001558 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001559 }
1560
1561 switch (target)
1562 {
1563 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001564 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1565 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001567 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001568 }
1569 break;
1570 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1571 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1572 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1573 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1574 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1575 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1576 if (width != height)
1577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001578 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001579 }
1580
1581 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1582 height > (context->getMaximumCubeTextureDimension() >> level))
1583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001584 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001585 }
1586 break;
1587 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001589 }
1590
gman@chromium.org50c526d2011-08-10 05:19:44 +00001591 switch (internalformat) {
1592 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1593 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1594 if (!context->supportsDXT1Textures())
1595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001596 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 +00001597 }
1598 break;
1599 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1600 if (!context->supportsDXT3Textures())
1601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001602 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 +00001603 }
1604 break;
1605 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1606 if (!context->supportsDXT5Textures())
1607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001608 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 +00001609 }
1610 break;
1611 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001612 }
1613
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001614 if (imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001616 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001617 }
1618
1619 if (target == GL_TEXTURE_2D)
1620 {
1621 gl::Texture2D *texture = context->getTexture2D();
1622
1623 if (!texture)
1624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001625 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001626 }
1627
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001628 if (texture->isImmutable())
1629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001630 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001631 }
1632
daniel@transgaming.com01868132010-08-24 19:21:17 +00001633 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1634 }
1635 else
1636 {
1637 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1638
1639 if (!texture)
1640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001641 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001642 }
1643
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001644 if (texture->isImmutable())
1645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001646 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001647 }
1648
daniel@transgaming.com01868132010-08-24 19:21:17 +00001649 switch (target)
1650 {
1651 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1652 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1653 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1654 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1655 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1656 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1657 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1658 break;
1659 default: UNREACHABLE();
1660 }
1661 }
1662 }
1663
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001664 }
1665 catch(std::bad_alloc&)
1666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001667 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001668 }
1669}
1670
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001671void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1672 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001674 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001675 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001676 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001677 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1678
1679 try
1680 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001681 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001683 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001684 }
1685
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001686 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001689 }
1690
daniel@transgaming.com01868132010-08-24 19:21:17 +00001691 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001692 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001693 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1694 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001695 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1696 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001697 break;
1698 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001700 }
1701
daniel@transgaming.com01868132010-08-24 19:21:17 +00001702 if (width == 0 || height == 0 || data == NULL)
1703 {
1704 return;
1705 }
1706
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001707 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001708
1709 if (context)
1710 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001711 if (level > context->getMaximumTextureLevel())
1712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001713 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001714 }
1715
gman@chromium.org50c526d2011-08-10 05:19:44 +00001716 switch (format) {
1717 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1718 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1719 if (!context->supportsDXT1Textures())
1720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001721 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 +00001722 }
1723 break;
1724 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1725 if (!context->supportsDXT3Textures())
1726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001727 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 +00001728 }
1729 break;
1730 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1731 if (!context->supportsDXT5Textures())
1732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001733 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 +00001734 }
1735 break;
1736 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001737 }
1738
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001739 if (imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001741 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001742 }
1743
1744 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001746 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 +00001747 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001748 }
1749
1750 if (target == GL_TEXTURE_2D)
1751 {
1752 gl::Texture2D *texture = context->getTexture2D();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001753 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001754 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001755 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001756 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001757 }
1758 else if (gl::IsCubemapTextureTarget(target))
1759 {
1760 gl::TextureCubeMap *texture = context->getTextureCubeMap();
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00001761 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_UNSIGNED_BYTE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001762 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001763 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001764 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001765 }
1766 else
1767 {
1768 UNREACHABLE();
1769 }
1770 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001771 }
1772 catch(std::bad_alloc&)
1773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775 }
1776}
1777
1778void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001780 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001781 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001782 target, level, internalformat, x, y, width, height, border);
1783
1784 try
1785 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001786 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001788 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001789 }
1790
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001791 if (border != 0)
1792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001793 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001794 }
1795
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001796 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001797
1798 if (context)
1799 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001800 if (level > context->getMaximumTextureLevel())
1801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001802 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001803 }
1804
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001805 switch (target)
1806 {
1807 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001808 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1809 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001812 }
1813 break;
1814 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1815 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1816 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1817 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1818 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1819 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1820 if (width != height)
1821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001823 }
1824
1825 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1826 height > (context->getMaximumCubeTextureDimension() >> level))
1827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001828 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001829 }
1830 break;
1831 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001833 }
1834
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001835 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001836
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001837 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001839 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001840 }
1841
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001842 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001844 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001845 }
1846
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001847 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001848 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001849
1850 // [OpenGL ES 2.0.24] table 3.9
1851 switch (internalformat)
1852 {
1853 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001854 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001855 colorbufferFormat != GL_RGBA4 &&
1856 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001857 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001858 colorbufferFormat != GL_RGBA8_OES)
1859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001860 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001861 }
1862 break;
1863 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001864 case GL_RGB:
1865 if (colorbufferFormat != GL_RGB565 &&
1866 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001867 colorbufferFormat != GL_RGBA4 &&
1868 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001869 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001870 colorbufferFormat != GL_RGBA8_OES)
1871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001872 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001873 }
1874 break;
1875 case GL_LUMINANCE_ALPHA:
1876 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001877 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001878 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001879 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001880 colorbufferFormat != GL_RGBA8_OES)
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001883 }
1884 break;
1885 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1886 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001887 if (context->supportsDXT1Textures())
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001890 }
1891 else
1892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001893 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001894 }
1895 break;
1896 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1897 if (context->supportsDXT3Textures())
1898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001899 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001900 }
1901 else
1902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001903 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001904 }
1905 break;
1906 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1907 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001909 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001910 }
1911 else
1912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001913 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001914 }
1915 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001916 case GL_DEPTH_COMPONENT:
1917 case GL_DEPTH_COMPONENT16:
1918 case GL_DEPTH_COMPONENT32_OES:
1919 case GL_DEPTH_STENCIL_OES:
1920 case GL_DEPTH24_STENCIL8_OES:
1921 if (context->supportsDepthTextures())
1922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001923 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001924 }
1925 else
1926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001928 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001929 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001930 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001931 }
1932
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001933 if (target == GL_TEXTURE_2D)
1934 {
1935 gl::Texture2D *texture = context->getTexture2D();
1936
1937 if (!texture)
1938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001939 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001940 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001941
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001942 if (texture->isImmutable())
1943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001944 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001945 }
1946
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001947 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001948 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001949 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001950 {
1951 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1952
1953 if (!texture)
1954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001955 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001956 }
1957
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001958 if (texture->isImmutable())
1959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001960 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001961 }
1962
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001963 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001964 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001965 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001966 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967 }
1968 catch(std::bad_alloc&)
1969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001970 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 }
1972}
1973
1974void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1975{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001976 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001977 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001978 target, level, xoffset, yoffset, x, y, width, height);
1979
1980 try
1981 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001982 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001984 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001985 }
1986
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001987 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001989 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990 }
1991
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001992 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001995 }
1996
1997 if (width == 0 || height == 0)
1998 {
1999 return;
2000 }
2001
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002003
2004 if (context)
2005 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002006 if (level > context->getMaximumTextureLevel())
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002009 }
2010
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002011 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002012
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002013 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
2014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002015 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002016 }
2017
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002018 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002020 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002021 }
2022
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002023 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00002024 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002025 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002026 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002027
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002028 if (target == GL_TEXTURE_2D)
2029 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002030 gl::Texture2D *tex2d = context->getTexture2D();
2031
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002032 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002033 {
2034 return; // error already registered by validateSubImageParams
2035 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002036 textureFormat = gl::GetFormat(tex2d->getInternalFormat(level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002037 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002038 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002039 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002040 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002041 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2042
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002043 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002044 {
2045 return; // error already registered by validateSubImageParams
2046 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00002047 textureFormat = gl::GetFormat(texcube->getInternalFormat(target, level), context->getClientVersion());
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002048 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002049 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002050 else UNREACHABLE();
2051
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002052 // [OpenGL ES 2.0.24] table 3.9
2053 switch (textureFormat)
2054 {
2055 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002056 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002057 colorbufferFormat != GL_RGBA4 &&
2058 colorbufferFormat != GL_RGB5_A1 &&
2059 colorbufferFormat != GL_RGBA8_OES)
2060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002061 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002062 }
2063 break;
2064 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002065 case GL_RGB:
2066 if (colorbufferFormat != GL_RGB565 &&
2067 colorbufferFormat != GL_RGB8_OES &&
2068 colorbufferFormat != GL_RGBA4 &&
2069 colorbufferFormat != GL_RGB5_A1 &&
2070 colorbufferFormat != GL_RGBA8_OES)
2071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002072 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002073 }
2074 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002075 case GL_LUMINANCE_ALPHA:
2076 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002077 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002078 colorbufferFormat != GL_RGB5_A1 &&
2079 colorbufferFormat != GL_RGBA8_OES)
2080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002081 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002082 }
2083 break;
2084 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2085 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002086 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2087 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002088 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002089 case GL_DEPTH_COMPONENT:
2090 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002091 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002092 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002094 }
2095
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002096 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002097 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002098 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002099
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100 catch(std::bad_alloc&)
2101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002103 }
2104}
2105
2106GLuint __stdcall glCreateProgram(void)
2107{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002108 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002109
2110 try
2111 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002112 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002113
2114 if (context)
2115 {
2116 return context->createProgram();
2117 }
2118 }
2119 catch(std::bad_alloc&)
2120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002121 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002122 }
2123
2124 return 0;
2125}
2126
2127GLuint __stdcall glCreateShader(GLenum type)
2128{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002129 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002130
2131 try
2132 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002133 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134
2135 if (context)
2136 {
2137 switch (type)
2138 {
2139 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002140 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141 return context->createShader(type);
2142 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002144 }
2145 }
2146 }
2147 catch(std::bad_alloc&)
2148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002150 }
2151
2152 return 0;
2153}
2154
2155void __stdcall glCullFace(GLenum mode)
2156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002157 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158
2159 try
2160 {
2161 switch (mode)
2162 {
2163 case GL_FRONT:
2164 case GL_BACK:
2165 case GL_FRONT_AND_BACK:
2166 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002167 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002168
2169 if (context)
2170 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002171 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172 }
2173 }
2174 break;
2175 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002176 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177 }
2178 }
2179 catch(std::bad_alloc&)
2180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002182 }
2183}
2184
2185void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2186{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002187 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002188
2189 try
2190 {
2191 if (n < 0)
2192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002193 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002194 }
2195
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002196 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002197
2198 if (context)
2199 {
2200 for (int i = 0; i < n; i++)
2201 {
2202 context->deleteBuffer(buffers[i]);
2203 }
2204 }
2205 }
2206 catch(std::bad_alloc&)
2207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002208 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002209 }
2210}
2211
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002212void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002214 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002215
2216 try
2217 {
2218 if (n < 0)
2219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002220 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002221 }
2222
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002223 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002224
2225 if (context)
2226 {
2227 for (int i = 0; i < n; i++)
2228 {
2229 context->deleteFence(fences[i]);
2230 }
2231 }
2232 }
2233 catch(std::bad_alloc&)
2234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002235 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002236 }
2237}
2238
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2240{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002241 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002242
2243 try
2244 {
2245 if (n < 0)
2246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002247 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002248 }
2249
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002250 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002251
2252 if (context)
2253 {
2254 for (int i = 0; i < n; i++)
2255 {
2256 if (framebuffers[i] != 0)
2257 {
2258 context->deleteFramebuffer(framebuffers[i]);
2259 }
2260 }
2261 }
2262 }
2263 catch(std::bad_alloc&)
2264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267}
2268
2269void __stdcall glDeleteProgram(GLuint program)
2270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002271 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002272
2273 try
2274 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002275 if (program == 0)
2276 {
2277 return;
2278 }
2279
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002280 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002281
2282 if (context)
2283 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002284 if (!context->getProgram(program))
2285 {
2286 if(context->getShader(program))
2287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002288 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002289 }
2290 else
2291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002293 }
2294 }
2295
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002296 context->deleteProgram(program);
2297 }
2298 }
2299 catch(std::bad_alloc&)
2300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002301 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002302 }
2303}
2304
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002305void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2306{
2307 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2308
2309 try
2310 {
2311 if (n < 0)
2312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002313 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002314 }
2315
2316 gl::Context *context = gl::getNonLostContext();
2317
2318 if (context)
2319 {
2320 for (int i = 0; i < n; i++)
2321 {
2322 context->deleteQuery(ids[i]);
2323 }
2324 }
2325 }
2326 catch(std::bad_alloc&)
2327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002329 }
2330}
2331
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002332void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002334 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335
2336 try
2337 {
2338 if (n < 0)
2339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 }
2342
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002344
2345 if (context)
2346 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002347 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348 {
2349 context->deleteRenderbuffer(renderbuffers[i]);
2350 }
2351 }
2352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glDeleteShader(GLuint shader)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362
2363 try
2364 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002365 if (shader == 0)
2366 {
2367 return;
2368 }
2369
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002370 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371
2372 if (context)
2373 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002374 if (!context->getShader(shader))
2375 {
2376 if(context->getProgram(shader))
2377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002378 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002379 }
2380 else
2381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002383 }
2384 }
2385
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002386 context->deleteShader(shader);
2387 }
2388 }
2389 catch(std::bad_alloc&)
2390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002391 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
2393}
2394
2395void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2396{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002397 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398
2399 try
2400 {
2401 if (n < 0)
2402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002404 }
2405
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002406 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002407
2408 if (context)
2409 {
2410 for (int i = 0; i < n; i++)
2411 {
2412 if (textures[i] != 0)
2413 {
2414 context->deleteTexture(textures[i]);
2415 }
2416 }
2417 }
2418 }
2419 catch(std::bad_alloc&)
2420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002421 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002422 }
2423}
2424
2425void __stdcall glDepthFunc(GLenum func)
2426{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002427 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002428
2429 try
2430 {
2431 switch (func)
2432 {
2433 case GL_NEVER:
2434 case GL_ALWAYS:
2435 case GL_LESS:
2436 case GL_LEQUAL:
2437 case GL_EQUAL:
2438 case GL_GREATER:
2439 case GL_GEQUAL:
2440 case GL_NOTEQUAL:
2441 break;
2442 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 }
2445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447
2448 if (context)
2449 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002450 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002451 }
2452 }
2453 catch(std::bad_alloc&)
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002456 }
2457}
2458
2459void __stdcall glDepthMask(GLboolean flag)
2460{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002461 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002462
2463 try
2464 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002465 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466
2467 if (context)
2468 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002469 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 }
2471 }
2472 catch(std::bad_alloc&)
2473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 }
2476}
2477
2478void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002480 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481
2482 try
2483 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002484 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002485
2486 if (context)
2487 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002488 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489 }
2490 }
2491 catch(std::bad_alloc&)
2492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002493 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002494 }
2495}
2496
2497void __stdcall glDetachShader(GLuint program, GLuint shader)
2498{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002499 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500
2501 try
2502 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002503 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504
2505 if (context)
2506 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002507
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002508 gl::Program *programObject = context->getProgram(program);
2509 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002510
2511 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002513 gl::Shader *shaderByProgramHandle;
2514 shaderByProgramHandle = context->getShader(program);
2515 if (!shaderByProgramHandle)
2516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002517 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002518 }
2519 else
2520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002522 }
2523 }
2524
2525 if (!shaderObject)
2526 {
2527 gl::Program *programByShaderHandle = context->getProgram(shader);
2528 if (!programByShaderHandle)
2529 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002530 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002531 }
2532 else
2533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002534 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002535 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537
2538 if (!programObject->detachShader(shaderObject))
2539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002540 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542 }
2543 }
2544 catch(std::bad_alloc&)
2545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002547 }
2548}
2549
2550void __stdcall glDisable(GLenum cap)
2551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002552 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553
2554 try
2555 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002556 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002557
2558 if (context)
2559 {
2560 switch (cap)
2561 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002562 case GL_CULL_FACE: context->setCullFace(false); break;
2563 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2564 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2565 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2566 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2567 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2568 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2569 case GL_BLEND: context->setBlend(false); break;
2570 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002572 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002573 }
2574 }
2575 }
2576 catch(std::bad_alloc&)
2577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002578 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002579 }
2580}
2581
2582void __stdcall glDisableVertexAttribArray(GLuint index)
2583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002584 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002585
2586 try
2587 {
2588 if (index >= gl::MAX_VERTEX_ATTRIBS)
2589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002590 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591 }
2592
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002593 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002594
2595 if (context)
2596 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002597 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002598 }
2599 }
2600 catch(std::bad_alloc&)
2601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002603 }
2604}
2605
2606void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002608 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609
2610 try
2611 {
2612 if (count < 0 || first < 0)
2613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002614 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 }
2616
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002618
2619 if (context)
2620 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002621 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002622 }
2623 }
2624 catch(std::bad_alloc&)
2625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627 }
2628}
2629
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002630void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2631{
2632 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2633
2634 try
2635 {
2636 if (count < 0 || first < 0 || primcount < 0)
2637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002639 }
2640
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002641 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002642 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002643 gl::Context *context = gl::getNonLostContext();
2644
2645 if (context)
2646 {
2647 context->drawArrays(mode, first, count, primcount);
2648 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002649 }
2650 }
2651 catch(std::bad_alloc&)
2652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002653 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002654 }
2655}
2656
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002657void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002659 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 +00002660 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002661
2662 try
2663 {
2664 if (count < 0)
2665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002666 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002667 }
2668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002669 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002670
2671 if (context)
2672 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002673 switch (type)
2674 {
2675 case GL_UNSIGNED_BYTE:
2676 case GL_UNSIGNED_SHORT:
2677 break;
2678 case GL_UNSIGNED_INT:
2679 if (!context->supports32bitIndices())
2680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002682 }
2683 break;
2684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002686 }
2687
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002688 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002689 }
2690 }
2691 catch(std::bad_alloc&)
2692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002694 }
2695}
2696
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002697void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2698{
2699 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2700 mode, count, type, indices, primcount);
2701
2702 try
2703 {
2704 if (count < 0 || primcount < 0)
2705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002707 }
2708
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002709 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002710 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002711 gl::Context *context = gl::getNonLostContext();
2712
2713 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002714 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002715 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002716 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002717 case GL_UNSIGNED_BYTE:
2718 case GL_UNSIGNED_SHORT:
2719 break;
2720 case GL_UNSIGNED_INT:
2721 if (!context->supports32bitIndices())
2722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002724 }
2725 break;
2726 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002727 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002728 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002729
2730 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002731 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002732 }
2733 }
2734 catch(std::bad_alloc&)
2735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002737 }
2738}
2739
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740void __stdcall glEnable(GLenum cap)
2741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002742 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743
2744 try
2745 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002747
2748 if (context)
2749 {
2750 switch (cap)
2751 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002752 case GL_CULL_FACE: context->setCullFace(true); break;
2753 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2754 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2755 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2756 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2757 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2758 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2759 case GL_BLEND: context->setBlend(true); break;
2760 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002761 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002763 }
2764 }
2765 }
2766 catch(std::bad_alloc&)
2767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002768 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002769 }
2770}
2771
2772void __stdcall glEnableVertexAttribArray(GLuint index)
2773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002774 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002775
2776 try
2777 {
2778 if (index >= gl::MAX_VERTEX_ATTRIBS)
2779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002780 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002781 }
2782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002784
2785 if (context)
2786 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002787 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002788 }
2789 }
2790 catch(std::bad_alloc&)
2791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002793 }
2794}
2795
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002796void __stdcall glEndQueryEXT(GLenum target)
2797{
2798 EVENT("GLenum target = 0x%X)", target);
2799
2800 try
2801 {
2802 switch (target)
2803 {
2804 case GL_ANY_SAMPLES_PASSED_EXT:
2805 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2806 break;
2807 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002808 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002809 }
2810
2811 gl::Context *context = gl::getNonLostContext();
2812
2813 if (context)
2814 {
2815 context->endQuery(target);
2816 }
2817 }
2818 catch(std::bad_alloc&)
2819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002821 }
2822}
2823
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002824void __stdcall glFinishFenceNV(GLuint fence)
2825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002826 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002827
2828 try
2829 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002830 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002831
2832 if (context)
2833 {
2834 gl::Fence* fenceObject = context->getFence(fence);
2835
2836 if (fenceObject == NULL)
2837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002838 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002839 }
2840
2841 fenceObject->finishFence();
2842 }
2843 }
2844 catch(std::bad_alloc&)
2845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002846 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002847 }
2848}
2849
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002850void __stdcall glFinish(void)
2851{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002852 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002853
2854 try
2855 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002856 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002857
2858 if (context)
2859 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002860 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861 }
2862 }
2863 catch(std::bad_alloc&)
2864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866 }
2867}
2868
2869void __stdcall glFlush(void)
2870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002871 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002872
2873 try
2874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002876
2877 if (context)
2878 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002879 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002880 }
2881 }
2882 catch(std::bad_alloc&)
2883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002885 }
2886}
2887
2888void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002890 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002891 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002892
2893 try
2894 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002895 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002896 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002899 }
2900
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002901 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002902
2903 if (context)
2904 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002905 gl::Framebuffer *framebuffer = NULL;
2906 GLuint framebufferHandle = 0;
2907 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2908 {
2909 framebuffer = context->getReadFramebuffer();
2910 framebufferHandle = context->getReadFramebufferHandle();
2911 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002912 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002913 {
2914 framebuffer = context->getDrawFramebuffer();
2915 framebufferHandle = context->getDrawFramebufferHandle();
2916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002917
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002918 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002920 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002921 }
2922
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002923 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002924 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002925 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2926
2927 if (colorAttachment >= context->getMaximumRenderTargets())
2928 {
2929 return gl::error(GL_INVALID_VALUE);
2930 }
2931
2932 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2933 }
2934 else
2935 {
2936 switch (attachment)
2937 {
2938 case GL_DEPTH_ATTACHMENT:
2939 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2940 break;
2941 case GL_STENCIL_ATTACHMENT:
2942 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2943 break;
2944 default:
2945 return gl::error(GL_INVALID_ENUM);
2946 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947 }
2948 }
2949 }
2950 catch(std::bad_alloc&)
2951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953 }
2954}
2955
2956void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002958 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002959 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002960
2961 try
2962 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002963 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002965 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002966 }
2967
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002969
2970 if (context)
2971 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002972 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2973 {
2974 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2975
2976 if (colorAttachment >= context->getMaximumRenderTargets())
2977 {
2978 return gl::error(GL_INVALID_VALUE);
2979 }
2980 }
2981 else
2982 {
2983 switch (attachment)
2984 {
2985 case GL_DEPTH_ATTACHMENT:
2986 case GL_STENCIL_ATTACHMENT:
2987 break;
2988 default:
2989 return gl::error(GL_INVALID_ENUM);
2990 }
2991 }
2992
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002993 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002994 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002995 textarget = GL_NONE;
2996 }
2997 else
2998 {
2999 gl::Texture *tex = context->getTexture(texture);
3000
3001 if (tex == NULL)
3002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003003 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003004 }
3005
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003006 switch (textarget)
3007 {
3008 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003009 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003010 if (tex->getTarget() != GL_TEXTURE_2D)
3011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003012 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003013 }
3014 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003015 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003017 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003018 }
3019 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003021
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003023 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003024 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003025 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003026 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003027 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003028 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003029 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003031 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003032 }
3033 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003034 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003036 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003037 }
3038 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003039 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003040
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003041 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003042 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003043 }
3044
3045 if (level != 0)
3046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003047 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003048 }
3049 }
3050
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003051 gl::Framebuffer *framebuffer = NULL;
3052 GLuint framebufferHandle = 0;
3053 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3054 {
3055 framebuffer = context->getReadFramebuffer();
3056 framebufferHandle = context->getReadFramebufferHandle();
3057 }
3058 else
3059 {
3060 framebuffer = context->getDrawFramebuffer();
3061 framebufferHandle = context->getDrawFramebufferHandle();
3062 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003064 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003066 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067 }
3068
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003069 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003070 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003071 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3072
3073 if (colorAttachment >= context->getMaximumRenderTargets())
3074 {
3075 return gl::error(GL_INVALID_VALUE);
3076 }
3077
3078 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3079 }
3080 else
3081 {
3082 switch (attachment)
3083 {
3084 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3085 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3086 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003087 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088 }
3089 }
3090 catch(std::bad_alloc&)
3091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003092 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003093 }
3094}
3095
3096void __stdcall glFrontFace(GLenum mode)
3097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003098 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003099
3100 try
3101 {
3102 switch (mode)
3103 {
3104 case GL_CW:
3105 case GL_CCW:
3106 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003107 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108
3109 if (context)
3110 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003111 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003112 }
3113 }
3114 break;
3115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003116 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003117 }
3118 }
3119 catch(std::bad_alloc&)
3120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003121 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003122 }
3123}
3124
3125void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3126{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003127 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003128
3129 try
3130 {
3131 if (n < 0)
3132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003133 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003134 }
3135
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003136 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003137
3138 if (context)
3139 {
3140 for (int i = 0; i < n; i++)
3141 {
3142 buffers[i] = context->createBuffer();
3143 }
3144 }
3145 }
3146 catch(std::bad_alloc&)
3147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003148 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003149 }
3150}
3151
3152void __stdcall glGenerateMipmap(GLenum target)
3153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003154 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155
3156 try
3157 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003159
3160 if (context)
3161 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003162 switch (target)
3163 {
3164 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003165 {
3166 gl::Texture2D *tex2d = context->getTexture2D();
3167
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003168 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003170 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003171 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003172 if (tex2d->isDepth(0))
3173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003174 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003175 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003176
3177 tex2d->generateMipmaps();
3178 break;
3179 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003180
3181 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003182 {
3183 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3184
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003185 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003187 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003188 }
3189
3190 texcube->generateMipmaps();
3191 break;
3192 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003193
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003194 case GL_TEXTURE_3D:
3195 {
3196 if (context->getClientVersion() < 3)
3197 {
3198 return gl::error(GL_INVALID_ENUM);
3199 }
3200
3201 gl::Texture3D *tex3D = context->getTexture3D();
3202 if (tex3D->isCompressed(0))
3203 {
3204 return gl::error(GL_INVALID_OPERATION);
3205 }
3206
3207 tex3D->generateMipmaps();
3208 break;
3209 }
3210
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003211 case GL_TEXTURE_2D_ARRAY:
3212 {
3213 if (context->getClientVersion() < 3)
3214 {
3215 return gl::error(GL_INVALID_ENUM);
3216 }
3217
3218 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3219 if (tex2darr->isCompressed(0))
3220 {
3221 return gl::error(GL_INVALID_OPERATION);
3222 }
3223
3224 tex2darr->generateMipmaps();
3225 break;
3226 }
3227
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003228 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003229 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003230 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003231 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003232 }
3233 catch(std::bad_alloc&)
3234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003235 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003236 }
3237}
3238
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003239void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3240{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003241 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003242
3243 try
3244 {
3245 if (n < 0)
3246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003247 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003248 }
3249
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003250 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003251
3252 if (context)
3253 {
3254 for (int i = 0; i < n; i++)
3255 {
3256 fences[i] = context->createFence();
3257 }
3258 }
3259 }
3260 catch(std::bad_alloc&)
3261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003262 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003263 }
3264}
3265
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003266void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003268 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003269
3270 try
3271 {
3272 if (n < 0)
3273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275 }
3276
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003277 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278
3279 if (context)
3280 {
3281 for (int i = 0; i < n; i++)
3282 {
3283 framebuffers[i] = context->createFramebuffer();
3284 }
3285 }
3286 }
3287 catch(std::bad_alloc&)
3288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003289 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003290 }
3291}
3292
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003293void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3294{
3295 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3296
3297 try
3298 {
3299 if (n < 0)
3300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003301 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003302 }
3303
3304 gl::Context *context = gl::getNonLostContext();
3305
3306 if (context)
3307 {
3308 for (int i = 0; i < n; i++)
3309 {
3310 ids[i] = context->createQuery();
3311 }
3312 }
3313 }
3314 catch(std::bad_alloc&)
3315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003316 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003317 }
3318}
3319
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003320void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3321{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003322 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003323
3324 try
3325 {
3326 if (n < 0)
3327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003328 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003329 }
3330
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003331 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332
3333 if (context)
3334 {
3335 for (int i = 0; i < n; i++)
3336 {
3337 renderbuffers[i] = context->createRenderbuffer();
3338 }
3339 }
3340 }
3341 catch(std::bad_alloc&)
3342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003344 }
3345}
3346
3347void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3348{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003349 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003350
3351 try
3352 {
3353 if (n < 0)
3354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003355 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356 }
3357
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003358 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359
3360 if (context)
3361 {
3362 for (int i = 0; i < n; i++)
3363 {
3364 textures[i] = context->createTexture();
3365 }
3366 }
3367 }
3368 catch(std::bad_alloc&)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 }
3372}
3373
daniel@transgaming.com85423182010-04-22 13:35:27 +00003374void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003376 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003377 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378 program, index, bufsize, length, size, type, name);
3379
3380 try
3381 {
3382 if (bufsize < 0)
3383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385 }
3386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003388
3389 if (context)
3390 {
3391 gl::Program *programObject = context->getProgram(program);
3392
3393 if (!programObject)
3394 {
3395 if (context->getShader(program))
3396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003397 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003398 }
3399 else
3400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003401 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003402 }
3403 }
3404
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003405 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003408 }
3409
3410 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3411 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 }
3413 catch(std::bad_alloc&)
3414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003415 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416 }
3417}
3418
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003419void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003421 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003422 "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 +00003423 program, index, bufsize, length, size, type, name);
3424
3425 try
3426 {
3427 if (bufsize < 0)
3428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003429 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 }
3431
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003432 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003433
3434 if (context)
3435 {
3436 gl::Program *programObject = context->getProgram(program);
3437
3438 if (!programObject)
3439 {
3440 if (context->getShader(program))
3441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003442 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003443 }
3444 else
3445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003446 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003447 }
3448 }
3449
3450 if (index >= (GLuint)programObject->getActiveUniformCount())
3451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003452 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003453 }
3454
3455 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3456 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457 }
3458 catch(std::bad_alloc&)
3459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003460 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461 }
3462}
3463
3464void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3465{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003466 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 +00003467 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003468
3469 try
3470 {
3471 if (maxcount < 0)
3472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003473 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003474 }
3475
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003476 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003477
3478 if (context)
3479 {
3480 gl::Program *programObject = context->getProgram(program);
3481
3482 if (!programObject)
3483 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003484 if (context->getShader(program))
3485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003486 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003487 }
3488 else
3489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003490 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003491 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003492 }
3493
3494 return programObject->getAttachedShaders(maxcount, count, shaders);
3495 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003496 }
3497 catch(std::bad_alloc&)
3498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003499 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003500 }
3501}
3502
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003503int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003504{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003505 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506
3507 try
3508 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003509 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003510
3511 if (context)
3512 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003513
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003514 gl::Program *programObject = context->getProgram(program);
3515
3516 if (!programObject)
3517 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003518 if (context->getShader(program))
3519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003520 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003521 }
3522 else
3523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003525 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003526 }
3527
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003528 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003529 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003531 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003532 }
3533
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003534 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535 }
3536 }
3537 catch(std::bad_alloc&)
3538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003539 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003540 }
3541
3542 return -1;
3543}
3544
3545void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3546{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003547 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003548
3549 try
3550 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003551 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003552
3553 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003554 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003555 if (!(context->getBooleanv(pname, params)))
3556 {
3557 GLenum nativeType;
3558 unsigned int numParams = 0;
3559 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003560 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003561
3562 if (numParams == 0)
3563 return; // it is known that the pname is valid, but there are no parameters to return
3564
3565 if (nativeType == GL_FLOAT)
3566 {
3567 GLfloat *floatParams = NULL;
3568 floatParams = new GLfloat[numParams];
3569
3570 context->getFloatv(pname, floatParams);
3571
3572 for (unsigned int i = 0; i < numParams; ++i)
3573 {
3574 if (floatParams[i] == 0.0f)
3575 params[i] = GL_FALSE;
3576 else
3577 params[i] = GL_TRUE;
3578 }
3579
3580 delete [] floatParams;
3581 }
3582 else if (nativeType == GL_INT)
3583 {
3584 GLint *intParams = NULL;
3585 intParams = new GLint[numParams];
3586
3587 context->getIntegerv(pname, intParams);
3588
3589 for (unsigned int i = 0; i < numParams; ++i)
3590 {
3591 if (intParams[i] == 0)
3592 params[i] = GL_FALSE;
3593 else
3594 params[i] = GL_TRUE;
3595 }
3596
3597 delete [] intParams;
3598 }
3599 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003600 }
3601 }
3602 catch(std::bad_alloc&)
3603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003604 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003605 }
3606}
3607
3608void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3609{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003610 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 +00003611
3612 try
3613 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003615
3616 if (context)
3617 {
3618 gl::Buffer *buffer;
3619
3620 switch (target)
3621 {
3622 case GL_ARRAY_BUFFER:
3623 buffer = context->getArrayBuffer();
3624 break;
3625 case GL_ELEMENT_ARRAY_BUFFER:
3626 buffer = context->getElementArrayBuffer();
3627 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003628 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003629 }
3630
3631 if (!buffer)
3632 {
3633 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003635 }
3636
3637 switch (pname)
3638 {
3639 case GL_BUFFER_USAGE:
3640 *params = buffer->usage();
3641 break;
3642 case GL_BUFFER_SIZE:
3643 *params = buffer->size();
3644 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003645 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003646 }
3647 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003648 }
3649 catch(std::bad_alloc&)
3650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003651 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003652 }
3653}
3654
3655GLenum __stdcall glGetError(void)
3656{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003657 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003658
3659 gl::Context *context = gl::getContext();
3660
3661 if (context)
3662 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003663 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003664 }
3665
3666 return GL_NO_ERROR;
3667}
3668
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003669void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003671 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003672
3673 try
3674 {
3675
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003676 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003677
3678 if (context)
3679 {
3680 gl::Fence *fenceObject = context->getFence(fence);
3681
3682 if (fenceObject == NULL)
3683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003684 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003685 }
3686
3687 fenceObject->getFenceiv(pname, params);
3688 }
3689 }
3690 catch(std::bad_alloc&)
3691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003692 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003693 }
3694}
3695
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003696void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3697{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003698 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003699
3700 try
3701 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003702 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003703
3704 if (context)
3705 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003706 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003707 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003708 GLenum nativeType;
3709 unsigned int numParams = 0;
3710 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003712
3713 if (numParams == 0)
3714 return; // it is known that the pname is valid, but that there are no parameters to return.
3715
3716 if (nativeType == GL_BOOL)
3717 {
3718 GLboolean *boolParams = NULL;
3719 boolParams = new GLboolean[numParams];
3720
3721 context->getBooleanv(pname, boolParams);
3722
3723 for (unsigned int i = 0; i < numParams; ++i)
3724 {
3725 if (boolParams[i] == GL_FALSE)
3726 params[i] = 0.0f;
3727 else
3728 params[i] = 1.0f;
3729 }
3730
3731 delete [] boolParams;
3732 }
3733 else if (nativeType == GL_INT)
3734 {
3735 GLint *intParams = NULL;
3736 intParams = new GLint[numParams];
3737
3738 context->getIntegerv(pname, intParams);
3739
3740 for (unsigned int i = 0; i < numParams; ++i)
3741 {
3742 params[i] = (GLfloat)intParams[i];
3743 }
3744
3745 delete [] intParams;
3746 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003747 }
3748 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003749 }
3750 catch(std::bad_alloc&)
3751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753 }
3754}
3755
3756void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003758 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 +00003759 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003760
3761 try
3762 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003764
3765 if (context)
3766 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003767 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003770 }
3771
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003772 gl::Framebuffer *framebuffer = NULL;
3773 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3774 {
3775 if(context->getReadFramebufferHandle() == 0)
3776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003777 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003778 }
3779
3780 framebuffer = context->getReadFramebuffer();
3781 }
3782 else
3783 {
3784 if (context->getDrawFramebufferHandle() == 0)
3785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003786 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003787 }
3788
3789 framebuffer = context->getDrawFramebuffer();
3790 }
3791
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003792 GLenum attachmentType;
3793 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003794
3795 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003796 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003797 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3798
3799 if (colorAttachment >= context->getMaximumRenderTargets())
3800 {
3801 return gl::error(GL_INVALID_ENUM);
3802 }
3803
3804 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3805 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3806 }
3807 else
3808 {
3809 switch (attachment)
3810 {
3811 case GL_DEPTH_ATTACHMENT:
3812 attachmentType = framebuffer->getDepthbufferType();
3813 attachmentHandle = framebuffer->getDepthbufferHandle();
3814 break;
3815 case GL_STENCIL_ATTACHMENT:
3816 attachmentType = framebuffer->getStencilbufferType();
3817 attachmentHandle = framebuffer->getStencilbufferHandle();
3818 break;
3819 default: return gl::error(GL_INVALID_ENUM);
3820 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003821 }
3822
3823 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003824 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003825 {
3826 attachmentObjectType = attachmentType;
3827 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003828 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003829 {
3830 attachmentObjectType = GL_TEXTURE;
3831 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003832 else
3833 {
3834 UNREACHABLE();
3835 return;
3836 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003837
3838 switch (pname)
3839 {
3840 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3841 *params = attachmentObjectType;
3842 break;
3843 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3844 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3845 {
3846 *params = attachmentHandle;
3847 }
3848 else
3849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003850 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003851 }
3852 break;
3853 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3854 if (attachmentObjectType == GL_TEXTURE)
3855 {
3856 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3857 }
3858 else
3859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003860 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003861 }
3862 break;
3863 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3864 if (attachmentObjectType == GL_TEXTURE)
3865 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003866 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003867 {
3868 *params = attachmentType;
3869 }
3870 else
3871 {
3872 *params = 0;
3873 }
3874 }
3875 else
3876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003877 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003878 }
3879 break;
3880 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003881 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003882 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003883 }
3884 }
3885 catch(std::bad_alloc&)
3886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003887 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003888 }
3889}
3890
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003891GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3892{
3893 EVENT("()");
3894
3895 try
3896 {
3897 gl::Context *context = gl::getContext();
3898
3899 if (context)
3900 {
3901 return context->getResetStatus();
3902 }
3903
3904 return GL_NO_ERROR;
3905 }
3906 catch(std::bad_alloc&)
3907 {
3908 return GL_OUT_OF_MEMORY;
3909 }
3910}
3911
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003914 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003915
3916 try
3917 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003919
3920 if (context)
3921 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003922 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003924 GLenum nativeType;
3925 unsigned int numParams = 0;
3926 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003929 if (numParams == 0)
3930 return; // it is known that pname is valid, but there are no parameters to return
3931
3932 if (nativeType == GL_BOOL)
3933 {
3934 GLboolean *boolParams = NULL;
3935 boolParams = new GLboolean[numParams];
3936
3937 context->getBooleanv(pname, boolParams);
3938
3939 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003940 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003941 if (boolParams[i] == GL_FALSE)
3942 params[i] = 0;
3943 else
3944 params[i] = 1;
3945 }
3946
3947 delete [] boolParams;
3948 }
3949 else if (nativeType == GL_FLOAT)
3950 {
3951 GLfloat *floatParams = NULL;
3952 floatParams = new GLfloat[numParams];
3953
3954 context->getFloatv(pname, floatParams);
3955
3956 for (unsigned int i = 0; i < numParams; ++i)
3957 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003958 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 +00003959 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003960 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003961 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003962 else
3963 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 +00003964 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003965
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003966 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003968 }
3969 }
3970 }
3971 catch(std::bad_alloc&)
3972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003974 }
3975}
3976
3977void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003979 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003980
3981 try
3982 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984
3985 if (context)
3986 {
3987 gl::Program *programObject = context->getProgram(program);
3988
3989 if (!programObject)
3990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003992 }
3993
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003994 if (context->getClientVersion() < 3)
3995 {
3996 switch (pname)
3997 {
3998 case GL_ACTIVE_UNIFORM_BLOCKS:
3999 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4000 return gl::error(GL_INVALID_ENUM);
4001 }
4002 }
4003
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 switch (pname)
4005 {
4006 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004007 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004008 return;
4009 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004010 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004011 return;
4012 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004013 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004014 return;
4015 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004016 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017 return;
4018 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004019 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004020 return;
4021 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004022 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004023 return;
4024 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004025 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004026 return;
4027 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004028 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004029 return;
4030 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004031 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004033 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004034 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004035 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004036 case GL_ACTIVE_UNIFORM_BLOCKS:
4037 *params = programObject->getActiveUniformBlockCount();
4038 return;
4039 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4040 *params = programObject->getActiveUniformBlockMaxLength();
4041 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004042 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044 }
4045 }
4046 }
4047 catch(std::bad_alloc&)
4048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004049 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004050 }
4051}
4052
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004053void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004054{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004055 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 +00004056 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057
4058 try
4059 {
4060 if (bufsize < 0)
4061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004062 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 }
4064
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004065 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +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.comcba50572010-03-28 19:36:09 +00004074 }
4075
4076 programObject->getInfoLog(bufsize, length, infolog);
4077 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004078 }
4079 catch(std::bad_alloc&)
4080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004081 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004082 }
4083}
4084
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004085void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4086{
4087 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4088
4089 try
4090 {
4091 switch (pname)
4092 {
4093 case GL_CURRENT_QUERY_EXT:
4094 break;
4095 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004096 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004097 }
4098
4099 gl::Context *context = gl::getNonLostContext();
4100
4101 if (context)
4102 {
4103 params[0] = context->getActiveQuery(target);
4104 }
4105 }
4106 catch(std::bad_alloc&)
4107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004108 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004109 }
4110}
4111
4112void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4113{
4114 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4115
4116 try
4117 {
4118 switch (pname)
4119 {
4120 case GL_QUERY_RESULT_EXT:
4121 case GL_QUERY_RESULT_AVAILABLE_EXT:
4122 break;
4123 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004124 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004125 }
4126 gl::Context *context = gl::getNonLostContext();
4127
4128 if (context)
4129 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004130 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4131
4132 if (!queryObject)
4133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004134 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004135 }
4136
4137 if (context->getActiveQuery(queryObject->getType()) == id)
4138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004139 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004140 }
4141
4142 switch(pname)
4143 {
4144 case GL_QUERY_RESULT_EXT:
4145 params[0] = queryObject->getResult();
4146 break;
4147 case GL_QUERY_RESULT_AVAILABLE_EXT:
4148 params[0] = queryObject->isResultAvailable();
4149 break;
4150 default:
4151 ASSERT(false);
4152 }
4153 }
4154 }
4155 catch(std::bad_alloc&)
4156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004158 }
4159}
4160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004163 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 +00004164
4165 try
4166 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004167 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004168
4169 if (context)
4170 {
4171 if (target != GL_RENDERBUFFER)
4172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004173 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004174 }
4175
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004176 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004178 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004179 }
4180
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004181 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004182
4183 switch (pname)
4184 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004185 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4186 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4187 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4188 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4189 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4190 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4191 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4192 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4193 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004194 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004195 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004196 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004197 *params = renderbuffer->getSamples();
4198 }
4199 else
4200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004201 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004202 }
4203 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004204 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004205 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004206 }
4207 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004208 }
4209 catch(std::bad_alloc&)
4210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004211 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212 }
4213}
4214
4215void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004217 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004218
4219 try
4220 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004221 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222
4223 if (context)
4224 {
4225 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004226
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004227 if (!shaderObject)
4228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004229 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004230 }
4231
4232 switch (pname)
4233 {
4234 case GL_SHADER_TYPE:
4235 *params = shaderObject->getType();
4236 return;
4237 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004238 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004239 return;
4240 case GL_COMPILE_STATUS:
4241 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4242 return;
4243 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004244 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245 return;
4246 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004247 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004248 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004249 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4250 *params = shaderObject->getTranslatedSourceLength();
4251 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004252 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004254 }
4255 }
4256 }
4257 catch(std::bad_alloc&)
4258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260 }
4261}
4262
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004263void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004265 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 +00004266 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267
4268 try
4269 {
4270 if (bufsize < 0)
4271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273 }
4274
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004276
4277 if (context)
4278 {
4279 gl::Shader *shaderObject = context->getShader(shader);
4280
4281 if (!shaderObject)
4282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004283 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004284 }
4285
4286 shaderObject->getInfoLog(bufsize, length, infolog);
4287 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288 }
4289 catch(std::bad_alloc&)
4290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292 }
4293}
4294
4295void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004297 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 +00004298 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004299
4300 try
4301 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004302 switch (shadertype)
4303 {
4304 case GL_VERTEX_SHADER:
4305 case GL_FRAGMENT_SHADER:
4306 break;
4307 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004309 }
4310
4311 switch (precisiontype)
4312 {
4313 case GL_LOW_FLOAT:
4314 case GL_MEDIUM_FLOAT:
4315 case GL_HIGH_FLOAT:
4316 // Assume IEEE 754 precision
4317 range[0] = 127;
4318 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004319 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004320 break;
4321 case GL_LOW_INT:
4322 case GL_MEDIUM_INT:
4323 case GL_HIGH_INT:
4324 // Some (most) hardware only supports single-precision floating-point numbers,
4325 // which can accurately represent integers up to +/-16777216
4326 range[0] = 24;
4327 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004328 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004329 break;
4330 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004331 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004332 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333 }
4334 catch(std::bad_alloc&)
4335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337 }
4338}
4339
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004340void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004342 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004343 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344
4345 try
4346 {
4347 if (bufsize < 0)
4348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004350 }
4351
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004353
4354 if (context)
4355 {
4356 gl::Shader *shaderObject = context->getShader(shader);
4357
4358 if (!shaderObject)
4359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004360 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004361 }
4362
4363 shaderObject->getSource(bufsize, length, source);
4364 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004365 }
4366 catch(std::bad_alloc&)
4367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004368 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004369 }
4370}
4371
zmo@google.coma574f782011-10-03 21:45:23 +00004372void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4373{
4374 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4375 shader, bufsize, length, source);
4376
4377 try
4378 {
4379 if (bufsize < 0)
4380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004381 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004382 }
4383
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004384 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004385
4386 if (context)
4387 {
4388 gl::Shader *shaderObject = context->getShader(shader);
4389
4390 if (!shaderObject)
4391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004392 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004393 }
4394
4395 shaderObject->getTranslatedSource(bufsize, length, source);
4396 }
4397 }
4398 catch(std::bad_alloc&)
4399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004400 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004401 }
4402}
4403
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404const GLubyte* __stdcall glGetString(GLenum name)
4405{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004406 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407
4408 try
4409 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004411
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412 switch (name)
4413 {
4414 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004415 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004416 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004417 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004418 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004419 if (context->getClientVersion() == 2)
4420 {
4421 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4422 }
4423 else
4424 {
4425 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4426 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004427 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004428 if (context->getClientVersion() == 2)
4429 {
4430 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4431 }
4432 else
4433 {
4434 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4435 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004437 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004439 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004440 }
4441 }
4442 catch(std::bad_alloc&)
4443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004444 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004446}
4447
4448void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004450 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 +00004451
4452 try
4453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004455
4456 if (context)
4457 {
4458 gl::Texture *texture;
4459
4460 switch (target)
4461 {
4462 case GL_TEXTURE_2D:
4463 texture = context->getTexture2D();
4464 break;
4465 case GL_TEXTURE_CUBE_MAP:
4466 texture = context->getTextureCubeMap();
4467 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004468 case GL_TEXTURE_3D:
4469 if (context->getClientVersion() < 3)
4470 {
4471 return gl::error(GL_INVALID_ENUM);
4472 }
4473 texture = context->getTexture3D();
4474 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004475 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004477 }
4478
4479 switch (pname)
4480 {
4481 case GL_TEXTURE_MAG_FILTER:
4482 *params = (GLfloat)texture->getMagFilter();
4483 break;
4484 case GL_TEXTURE_MIN_FILTER:
4485 *params = (GLfloat)texture->getMinFilter();
4486 break;
4487 case GL_TEXTURE_WRAP_S:
4488 *params = (GLfloat)texture->getWrapS();
4489 break;
4490 case GL_TEXTURE_WRAP_T:
4491 *params = (GLfloat)texture->getWrapT();
4492 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004493 case GL_TEXTURE_WRAP_R:
4494 if (context->getClientVersion() < 3)
4495 {
4496 return gl::error(GL_INVALID_ENUM);
4497 }
4498 *params = (GLfloat)texture->getWrapR();
4499 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004500 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4501 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4502 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004503 case GL_TEXTURE_USAGE_ANGLE:
4504 *params = (GLfloat)texture->getUsage();
4505 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004506 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4507 if (!context->supportsTextureFilterAnisotropy())
4508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004509 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004510 }
4511 *params = (GLfloat)texture->getMaxAnisotropy();
4512 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004513 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004514 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004515 }
4516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004517 }
4518 catch(std::bad_alloc&)
4519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004521 }
4522}
4523
4524void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 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 +00004527
4528 try
4529 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004530 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004531
4532 if (context)
4533 {
4534 gl::Texture *texture;
4535
4536 switch (target)
4537 {
4538 case GL_TEXTURE_2D:
4539 texture = context->getTexture2D();
4540 break;
4541 case GL_TEXTURE_CUBE_MAP:
4542 texture = context->getTextureCubeMap();
4543 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004544 case GL_TEXTURE_3D:
4545 if (context->getClientVersion() < 3)
4546 {
4547 return gl::error(GL_INVALID_ENUM);
4548 }
4549 texture = context->getTexture3D();
4550 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004551 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004553 }
4554
4555 switch (pname)
4556 {
4557 case GL_TEXTURE_MAG_FILTER:
4558 *params = texture->getMagFilter();
4559 break;
4560 case GL_TEXTURE_MIN_FILTER:
4561 *params = texture->getMinFilter();
4562 break;
4563 case GL_TEXTURE_WRAP_S:
4564 *params = texture->getWrapS();
4565 break;
4566 case GL_TEXTURE_WRAP_T:
4567 *params = texture->getWrapT();
4568 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004569 case GL_TEXTURE_WRAP_R:
4570 if (context->getClientVersion() < 3)
4571 {
4572 return gl::error(GL_INVALID_ENUM);
4573 }
4574 *params = texture->getWrapR();
4575 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004576 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4577 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4578 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004579 case GL_TEXTURE_USAGE_ANGLE:
4580 *params = texture->getUsage();
4581 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004582 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4583 if (!context->supportsTextureFilterAnisotropy())
4584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004586 }
4587 *params = (GLint)texture->getMaxAnisotropy();
4588 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004589 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004590 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004591 }
4592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 }
4594 catch(std::bad_alloc&)
4595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 }
4598}
4599
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004600void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4601{
4602 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4603 program, location, bufSize, params);
4604
4605 try
4606 {
4607 if (bufSize < 0)
4608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004610 }
4611
4612 gl::Context *context = gl::getNonLostContext();
4613
4614 if (context)
4615 {
4616 if (program == 0)
4617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004619 }
4620
4621 gl::Program *programObject = context->getProgram(program);
4622
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004623 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004625 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004626 }
4627
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004628 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4629 if (!programBinary)
4630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004631 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004632 }
4633
4634 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004636 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004637 }
4638 }
4639 }
4640 catch(std::bad_alloc&)
4641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004643 }
4644}
4645
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004646void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004648 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649
4650 try
4651 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004653
4654 if (context)
4655 {
4656 if (program == 0)
4657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004659 }
4660
4661 gl::Program *programObject = context->getProgram(program);
4662
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004663 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004665 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004666 }
4667
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004668 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4669 if (!programBinary)
4670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004671 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004672 }
4673
4674 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004676 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004677 }
4678 }
4679 }
4680 catch(std::bad_alloc&)
4681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004682 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004683 }
4684}
4685
4686void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4687{
4688 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4689 program, location, bufSize, params);
4690
4691 try
4692 {
4693 if (bufSize < 0)
4694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004695 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004696 }
4697
4698 gl::Context *context = gl::getNonLostContext();
4699
4700 if (context)
4701 {
4702 if (program == 0)
4703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004705 }
4706
4707 gl::Program *programObject = context->getProgram(program);
4708
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004709 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004711 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004712 }
4713
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004714 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4715 if (!programBinary)
4716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004717 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004718 }
4719
4720 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004721 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004722 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004723 }
4724 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004725 }
4726 catch(std::bad_alloc&)
4727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729 }
4730}
4731
4732void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4733{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004734 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735
4736 try
4737 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004738 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004739
4740 if (context)
4741 {
4742 if (program == 0)
4743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004745 }
4746
4747 gl::Program *programObject = context->getProgram(program);
4748
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004749 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004751 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004752 }
4753
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004754 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4755 if (!programBinary)
4756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004757 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004758 }
4759
4760 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004762 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004763 }
4764 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004765 }
4766 catch(std::bad_alloc&)
4767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004768 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770}
4771
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004772int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004774 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775
4776 try
4777 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004778 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779
4780 if (strstr(name, "gl_") == name)
4781 {
4782 return -1;
4783 }
4784
4785 if (context)
4786 {
4787 gl::Program *programObject = context->getProgram(program);
4788
4789 if (!programObject)
4790 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004791 if (context->getShader(program))
4792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004793 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004794 }
4795 else
4796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004797 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004798 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799 }
4800
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004801 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004802 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004804 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004805 }
4806
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004807 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 }
4809 }
4810 catch(std::bad_alloc&)
4811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004812 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814
4815 return -1;
4816}
4817
4818void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4819{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004820 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821
4822 try
4823 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825
daniel@transgaming.come0078962010-04-15 20:45:08 +00004826 if (context)
4827 {
4828 if (index >= gl::MAX_VERTEX_ATTRIBS)
4829 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004830 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004831 }
4832
daniel@transgaming.com83921382011-01-08 05:46:00 +00004833 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004834
daniel@transgaming.come0078962010-04-15 20:45:08 +00004835 switch (pname)
4836 {
4837 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004838 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004839 break;
4840 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004841 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004842 break;
4843 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004844 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004845 break;
4846 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004847 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004848 break;
4849 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004850 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004851 break;
4852 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004853 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004854 break;
4855 case GL_CURRENT_VERTEX_ATTRIB:
4856 for (int i = 0; i < 4; ++i)
4857 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004858 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004859 }
4860 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004861 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4862 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4863 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004864 *params = (GLfloat)attribState.mDivisor;
4865 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004866 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004867 }
4868 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870 catch(std::bad_alloc&)
4871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873 }
4874}
4875
4876void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4877{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004878 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879
4880 try
4881 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004882 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004883
daniel@transgaming.come0078962010-04-15 20:45:08 +00004884 if (context)
4885 {
4886 if (index >= gl::MAX_VERTEX_ATTRIBS)
4887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004888 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004889 }
4890
daniel@transgaming.com83921382011-01-08 05:46:00 +00004891 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004892
daniel@transgaming.come0078962010-04-15 20:45:08 +00004893 switch (pname)
4894 {
4895 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004896 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004897 break;
4898 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004899 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004900 break;
4901 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004902 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004903 break;
4904 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004905 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004906 break;
4907 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004908 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004909 break;
4910 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004911 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004912 break;
4913 case GL_CURRENT_VERTEX_ATTRIB:
4914 for (int i = 0; i < 4; ++i)
4915 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004916 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004917 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4918 }
4919 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004920 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4921 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4922 // the same constant.
4923 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004924 *params = (GLint)attribState.mDivisor;
4925 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004926 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004927 }
4928 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004929 }
4930 catch(std::bad_alloc&)
4931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933 }
4934}
4935
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004936void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004938 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939
4940 try
4941 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004942 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004943
daniel@transgaming.come0078962010-04-15 20:45:08 +00004944 if (context)
4945 {
4946 if (index >= gl::MAX_VERTEX_ATTRIBS)
4947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004948 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004949 }
4950
4951 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004953 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004954 }
4955
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004956 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004957 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004958 }
4959 catch(std::bad_alloc&)
4960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004962 }
4963}
4964
4965void __stdcall glHint(GLenum target, GLenum mode)
4966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004967 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004968
4969 try
4970 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004971 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004972 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004973 case GL_FASTEST:
4974 case GL_NICEST:
4975 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004976 break;
4977 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004978 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004979 }
4980
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004981 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004982 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004983 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004984 case GL_GENERATE_MIPMAP_HINT:
4985 if (context) context->setGenerateMipmapHint(mode);
4986 break;
4987 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4988 if (context) context->setFragmentShaderDerivativeHint(mode);
4989 break;
4990 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004991 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004992 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004993 }
4994 catch(std::bad_alloc&)
4995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004996 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004997 }
4998}
4999
5000GLboolean __stdcall glIsBuffer(GLuint buffer)
5001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005002 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005003
5004 try
5005 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005006 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005007
5008 if (context && buffer)
5009 {
5010 gl::Buffer *bufferObject = context->getBuffer(buffer);
5011
5012 if (bufferObject)
5013 {
5014 return GL_TRUE;
5015 }
5016 }
5017 }
5018 catch(std::bad_alloc&)
5019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005020 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005021 }
5022
5023 return GL_FALSE;
5024}
5025
5026GLboolean __stdcall glIsEnabled(GLenum cap)
5027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005028 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005029
5030 try
5031 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005032 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033
5034 if (context)
5035 {
5036 switch (cap)
5037 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005038 case GL_CULL_FACE: return context->isCullFaceEnabled();
5039 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5040 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5041 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5042 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5043 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5044 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5045 case GL_BLEND: return context->isBlendEnabled();
5046 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005047 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005048 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049 }
5050 }
5051 }
5052 catch(std::bad_alloc&)
5053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005054 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005055 }
5056
5057 return false;
5058}
5059
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005060GLboolean __stdcall glIsFenceNV(GLuint fence)
5061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005062 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005063
5064 try
5065 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005066 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005067
5068 if (context)
5069 {
5070 gl::Fence *fenceObject = context->getFence(fence);
5071
5072 if (fenceObject == NULL)
5073 {
5074 return GL_FALSE;
5075 }
5076
5077 return fenceObject->isFence();
5078 }
5079 }
5080 catch(std::bad_alloc&)
5081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005082 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005083 }
5084
5085 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005086}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005087
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5089{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005090 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005091
5092 try
5093 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005095
5096 if (context && framebuffer)
5097 {
5098 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5099
5100 if (framebufferObject)
5101 {
5102 return GL_TRUE;
5103 }
5104 }
5105 }
5106 catch(std::bad_alloc&)
5107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005108 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005109 }
5110
5111 return GL_FALSE;
5112}
5113
5114GLboolean __stdcall glIsProgram(GLuint program)
5115{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005116 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005117
5118 try
5119 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005120 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005121
5122 if (context && program)
5123 {
5124 gl::Program *programObject = context->getProgram(program);
5125
5126 if (programObject)
5127 {
5128 return GL_TRUE;
5129 }
5130 }
5131 }
5132 catch(std::bad_alloc&)
5133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005134 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005135 }
5136
5137 return GL_FALSE;
5138}
5139
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005140GLboolean __stdcall glIsQueryEXT(GLuint id)
5141{
5142 EVENT("(GLuint id = %d)", id);
5143
5144 try
5145 {
5146 if (id == 0)
5147 {
5148 return GL_FALSE;
5149 }
5150
5151 gl::Context *context = gl::getNonLostContext();
5152
5153 if (context)
5154 {
5155 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5156
5157 if (queryObject)
5158 {
5159 return GL_TRUE;
5160 }
5161 }
5162 }
5163 catch(std::bad_alloc&)
5164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005165 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005166 }
5167
5168 return GL_FALSE;
5169}
5170
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005171GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005173 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005174
5175 try
5176 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005178
5179 if (context && renderbuffer)
5180 {
5181 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5182
5183 if (renderbufferObject)
5184 {
5185 return GL_TRUE;
5186 }
5187 }
5188 }
5189 catch(std::bad_alloc&)
5190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005191 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192 }
5193
5194 return GL_FALSE;
5195}
5196
5197GLboolean __stdcall glIsShader(GLuint shader)
5198{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005199 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005200
5201 try
5202 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005203 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005204
5205 if (context && shader)
5206 {
5207 gl::Shader *shaderObject = context->getShader(shader);
5208
5209 if (shaderObject)
5210 {
5211 return GL_TRUE;
5212 }
5213 }
5214 }
5215 catch(std::bad_alloc&)
5216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005217 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005218 }
5219
5220 return GL_FALSE;
5221}
5222
5223GLboolean __stdcall glIsTexture(GLuint texture)
5224{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005225 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226
5227 try
5228 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005229 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230
5231 if (context && texture)
5232 {
5233 gl::Texture *textureObject = context->getTexture(texture);
5234
5235 if (textureObject)
5236 {
5237 return GL_TRUE;
5238 }
5239 }
5240 }
5241 catch(std::bad_alloc&)
5242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005243 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244 }
5245
5246 return GL_FALSE;
5247}
5248
5249void __stdcall glLineWidth(GLfloat width)
5250{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005251 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005252
5253 try
5254 {
5255 if (width <= 0.0f)
5256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 }
5259
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005261
5262 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005264 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 }
5266 }
5267 catch(std::bad_alloc&)
5268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005270 }
5271}
5272
5273void __stdcall glLinkProgram(GLuint program)
5274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005275 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276
5277 try
5278 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005280
5281 if (context)
5282 {
5283 gl::Program *programObject = context->getProgram(program);
5284
5285 if (!programObject)
5286 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005287 if (context->getShader(program))
5288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005290 }
5291 else
5292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005294 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005295 }
5296
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005297 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005298 }
5299 }
5300 catch(std::bad_alloc&)
5301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005302 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005303 }
5304}
5305
5306void __stdcall glPixelStorei(GLenum pname, GLint param)
5307{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005308 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005309
5310 try
5311 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005312 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005313
5314 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005315 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005316 switch (pname)
5317 {
5318 case GL_UNPACK_ALIGNMENT:
5319 if (param != 1 && param != 2 && param != 4 && param != 8)
5320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005322 }
5323
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005324 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005325 break;
5326
5327 case GL_PACK_ALIGNMENT:
5328 if (param != 1 && param != 2 && param != 4 && param != 8)
5329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005330 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005331 }
5332
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005333 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005334 break;
5335
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005336 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5337 context->setPackReverseRowOrder(param != 0);
5338 break;
5339
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005340 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005341 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005342 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005343 }
5344 }
5345 catch(std::bad_alloc&)
5346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005347 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005348 }
5349}
5350
5351void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5352{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005353 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005354
5355 try
5356 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005358
5359 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005361 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005362 }
5363 }
5364 catch(std::bad_alloc&)
5365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005367 }
5368}
5369
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005370void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5371 GLenum format, GLenum type, GLsizei bufSize,
5372 GLvoid *data)
5373{
5374 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5375 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5376 x, y, width, height, format, type, bufSize, data);
5377
5378 try
5379 {
5380 if (width < 0 || height < 0 || bufSize < 0)
5381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005383 }
5384
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005385 gl::Context *context = gl::getNonLostContext();
5386
5387 if (context)
5388 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005389 GLenum currentFormat, currentType;
5390
5391 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5392 // and attempting to read back if that's the case is an error. The error will be registered
5393 // by getCurrentReadFormat.
5394 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5395 return;
5396
5397 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005400 }
5401
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005402 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5403 }
5404 }
5405 catch(std::bad_alloc&)
5406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005407 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005408 }
5409}
5410
5411void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5412 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005414 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005415 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005416 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005417
5418 try
5419 {
5420 if (width < 0 || height < 0)
5421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005422 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005423 }
5424
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005426
5427 if (context)
5428 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005429 GLenum currentFormat, currentType;
5430
5431 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5432 // and attempting to read back if that's the case is an error. The error will be registered
5433 // by getCurrentReadFormat.
5434 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5435 return;
5436
5437 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005439 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005440 }
5441
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005442 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443 }
5444 }
5445 catch(std::bad_alloc&)
5446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449}
5450
5451void __stdcall glReleaseShaderCompiler(void)
5452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005453 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005454
5455 try
5456 {
5457 gl::Shader::releaseCompiler();
5458 }
5459 catch(std::bad_alloc&)
5460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005461 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 }
5463}
5464
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005465void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005467 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 +00005468 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005469
5470 try
5471 {
5472 switch (target)
5473 {
5474 case GL_RENDERBUFFER:
5475 break;
5476 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005477 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 }
5479
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005480 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005483 }
5484
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005486
5487 if (context)
5488 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00005489 if (!gl::IsValidInternalFormat(internalformat, context))
5490 {
5491 return gl::error(GL_INVALID_ENUM);
5492 }
5493
5494 if (!gl::IsColorRenderingSupported(internalformat, context) &&
5495 !gl::IsDepthRenderingSupported(internalformat, context) &&
5496 !gl::IsStencilRenderingSupported(internalformat, context))
5497 {
5498 return gl::error(GL_INVALID_ENUM);
5499 }
5500
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005501 if (width > context->getMaximumRenderbufferDimension() ||
5502 height > context->getMaximumRenderbufferDimension() ||
5503 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005506 }
5507
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005508 GLuint handle = context->getRenderbufferHandle();
5509 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005512 }
5513
5514 switch (internalformat)
5515 {
5516 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005517 case GL_RGBA4:
5518 case GL_RGB5_A1:
5519 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005520 case GL_RGB8_OES:
5521 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005523 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005524 break;
5525 case GL_SRGB8_ALPHA8:
5526 case GL_RGB10_A2:
5527 case GL_RG8:
5528 case GL_R8:
5529 if (context->getClientVersion() < 3)
5530 {
5531 return gl::error(GL_INVALID_ENUM);
5532 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005533 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005534 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005535 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005536 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005537
5538 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005539 }
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 glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5548{
5549 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5550}
5551
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005552void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5553{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005554 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005555
5556 try
5557 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005558 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005559
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005560 if (context)
5561 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005562 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005563 }
5564 }
5565 catch(std::bad_alloc&)
5566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005567 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005568 }
5569}
5570
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005571void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5572{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005573 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005574
5575 try
5576 {
5577 if (condition != GL_ALL_COMPLETED_NV)
5578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005579 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005580 }
5581
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005582 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005583
5584 if (context)
5585 {
5586 gl::Fence *fenceObject = context->getFence(fence);
5587
5588 if (fenceObject == NULL)
5589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005590 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005591 }
5592
5593 fenceObject->setFence(condition);
5594 }
5595 }
5596 catch(std::bad_alloc&)
5597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005598 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005599 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005600}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005601
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005602void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005604 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 +00005605
5606 try
5607 {
5608 if (width < 0 || height < 0)
5609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
5612
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005613 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005614
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 if (context)
5616 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005617 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005618 }
5619 }
5620 catch(std::bad_alloc&)
5621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624}
5625
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005626void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005628 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005629 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005630 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631
5632 try
5633 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005634 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005636 }
5637 catch(std::bad_alloc&)
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005640 }
5641}
5642
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005643void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005645 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 +00005646 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647
5648 try
5649 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005650 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 }
5654
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005656
5657 if (context)
5658 {
5659 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005660
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005661 if (!shaderObject)
5662 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005663 if (context->getProgram(shader))
5664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005665 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005666 }
5667 else
5668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005669 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005670 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 }
5672
5673 shaderObject->setSource(count, string, length);
5674 }
5675 }
5676 catch(std::bad_alloc&)
5677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005678 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005679 }
5680}
5681
5682void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5683{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005684 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005685}
5686
5687void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5688{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005689 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 +00005690
5691 try
5692 {
5693 switch (face)
5694 {
5695 case GL_FRONT:
5696 case GL_BACK:
5697 case GL_FRONT_AND_BACK:
5698 break;
5699 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005700 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005701 }
5702
5703 switch (func)
5704 {
5705 case GL_NEVER:
5706 case GL_ALWAYS:
5707 case GL_LESS:
5708 case GL_LEQUAL:
5709 case GL_EQUAL:
5710 case GL_GEQUAL:
5711 case GL_GREATER:
5712 case GL_NOTEQUAL:
5713 break;
5714 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005715 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716 }
5717
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005718 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005719
5720 if (context)
5721 {
5722 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5723 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005724 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005725 }
5726
5727 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5728 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005729 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005730 }
5731 }
5732 }
5733 catch(std::bad_alloc&)
5734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005735 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005736 }
5737}
5738
5739void __stdcall glStencilMask(GLuint mask)
5740{
5741 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5742}
5743
5744void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5745{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005746 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747
5748 try
5749 {
5750 switch (face)
5751 {
5752 case GL_FRONT:
5753 case GL_BACK:
5754 case GL_FRONT_AND_BACK:
5755 break;
5756 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005757 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005758 }
5759
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005760 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005761
5762 if (context)
5763 {
5764 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5765 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005766 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005767 }
5768
5769 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5770 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005771 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005772 }
5773 }
5774 }
5775 catch(std::bad_alloc&)
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005778 }
5779}
5780
5781void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5782{
5783 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5784}
5785
5786void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5787{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005788 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 +00005789 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005790
5791 try
5792 {
5793 switch (face)
5794 {
5795 case GL_FRONT:
5796 case GL_BACK:
5797 case GL_FRONT_AND_BACK:
5798 break;
5799 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802
5803 switch (fail)
5804 {
5805 case GL_ZERO:
5806 case GL_KEEP:
5807 case GL_REPLACE:
5808 case GL_INCR:
5809 case GL_DECR:
5810 case GL_INVERT:
5811 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005812 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 break;
5814 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 }
5817
5818 switch (zfail)
5819 {
5820 case GL_ZERO:
5821 case GL_KEEP:
5822 case GL_REPLACE:
5823 case GL_INCR:
5824 case GL_DECR:
5825 case GL_INVERT:
5826 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005827 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005828 break;
5829 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005830 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005831 }
5832
5833 switch (zpass)
5834 {
5835 case GL_ZERO:
5836 case GL_KEEP:
5837 case GL_REPLACE:
5838 case GL_INCR:
5839 case GL_DECR:
5840 case GL_INVERT:
5841 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005842 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 break;
5844 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005845 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005846 }
5847
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005848 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849
5850 if (context)
5851 {
5852 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5853 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005854 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856
5857 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5858 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005859 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005860 }
5861 }
5862 }
5863 catch(std::bad_alloc&)
5864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005866 }
5867}
5868
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005869GLboolean __stdcall glTestFenceNV(GLuint fence)
5870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005871 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005872
5873 try
5874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005875 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005876
5877 if (context)
5878 {
5879 gl::Fence *fenceObject = context->getFence(fence);
5880
5881 if (fenceObject == NULL)
5882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005884 }
5885
5886 return fenceObject->testFence();
5887 }
5888 }
5889 catch(std::bad_alloc&)
5890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005891 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005892 }
5893
5894 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005895}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005896
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005897void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5898 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005899{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005900 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 +00005901 "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 +00005902 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005903
5904 try
5905 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005906 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005908 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005909 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005910
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005911 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005913 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005914 }
5915
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005916 // validate <type> by itself (used as secondary key below)
5917 switch (type)
5918 {
5919 case GL_UNSIGNED_BYTE:
5920 case GL_UNSIGNED_SHORT_5_6_5:
5921 case GL_UNSIGNED_SHORT_4_4_4_4:
5922 case GL_UNSIGNED_SHORT_5_5_5_1:
5923 case GL_UNSIGNED_SHORT:
5924 case GL_UNSIGNED_INT:
5925 case GL_UNSIGNED_INT_24_8_OES:
5926 case GL_HALF_FLOAT_OES:
5927 case GL_FLOAT:
5928 break;
5929 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005931 }
5932
5933 // validate <format> + <type> combinations
5934 // - invalid <format> -> sets INVALID_ENUM
5935 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005936 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005937 {
5938 case GL_ALPHA:
5939 case GL_LUMINANCE:
5940 case GL_LUMINANCE_ALPHA:
5941 switch (type)
5942 {
5943 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005944 case GL_FLOAT:
5945 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005946 break;
5947 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005948 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949 }
5950 break;
5951 case GL_RGB:
5952 switch (type)
5953 {
5954 case GL_UNSIGNED_BYTE:
5955 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005956 case GL_FLOAT:
5957 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005958 break;
5959 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005961 }
5962 break;
5963 case GL_RGBA:
5964 switch (type)
5965 {
5966 case GL_UNSIGNED_BYTE:
5967 case GL_UNSIGNED_SHORT_4_4_4_4:
5968 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005969 case GL_FLOAT:
5970 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971 break;
5972 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005973 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005974 }
5975 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005976 case GL_BGRA_EXT:
5977 switch (type)
5978 {
5979 case GL_UNSIGNED_BYTE:
5980 break;
5981 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005982 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005983 }
5984 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005985 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5986 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005987 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5988 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005989 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005990 case GL_DEPTH_COMPONENT:
5991 switch (type)
5992 {
5993 case GL_UNSIGNED_SHORT:
5994 case GL_UNSIGNED_INT:
5995 break;
5996 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005997 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005998 }
5999 break;
6000 case GL_DEPTH_STENCIL_OES:
6001 switch (type)
6002 {
6003 case GL_UNSIGNED_INT_24_8_OES:
6004 break;
6005 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006006 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006007 }
6008 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 }
6012
6013 if (border != 0)
6014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006015 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006016 }
6017
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006018 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019
6020 if (context)
6021 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006022 if (level > context->getMaximumTextureLevel())
6023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006024 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006025 }
6026
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006027 switch (target)
6028 {
6029 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006030 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6031 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006034 }
6035 break;
6036 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6037 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6038 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6039 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6040 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6041 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6042 if (width != height)
6043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006044 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006045 }
6046
6047 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6048 height > (context->getMaximumCubeTextureDimension() >> level))
6049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006051 }
6052 break;
6053 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006054 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006055 }
6056
gman@chromium.org50c526d2011-08-10 05:19:44 +00006057 switch (format) {
6058 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6059 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6060 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006062 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006063 }
6064 else
6065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006067 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006068 break;
6069 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6070 if (context->supportsDXT3Textures())
6071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006072 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006073 }
6074 else
6075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006076 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006077 }
6078 break;
6079 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6080 if (context->supportsDXT5Textures())
6081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006082 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006083 }
6084 else
6085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006086 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006087 }
6088 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006089 case GL_DEPTH_COMPONENT:
6090 case GL_DEPTH_STENCIL_OES:
6091 if (!context->supportsDepthTextures())
6092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006093 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006094 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006095 if (target != GL_TEXTURE_2D)
6096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006097 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006098 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006099 // OES_depth_texture supports loading depth data and multiple levels,
6100 // but ANGLE_depth_texture does not
6101 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006103 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006104 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006105 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006106 default:
6107 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006108 }
6109
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006110 if (type == GL_FLOAT)
6111 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006112 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006114 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006115 }
6116 }
6117 else if (type == GL_HALF_FLOAT_OES)
6118 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006119 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006121 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006122 }
6123 }
6124
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006125 if (target == GL_TEXTURE_2D)
6126 {
6127 gl::Texture2D *texture = context->getTexture2D();
6128
6129 if (!texture)
6130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006131 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132 }
6133
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006134 if (texture->isImmutable())
6135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006137 }
6138
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006139 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006140 }
6141 else
6142 {
6143 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6144
6145 if (!texture)
6146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006147 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006148 }
6149
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006150 if (texture->isImmutable())
6151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006152 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006153 }
6154
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006155 switch (target)
6156 {
6157 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006158 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006159 break;
6160 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006161 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006162 break;
6163 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006164 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006165 break;
6166 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006167 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006168 break;
6169 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006170 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006171 break;
6172 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006173 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006174 break;
6175 default: UNREACHABLE();
6176 }
6177 }
6178 }
6179 }
6180 catch(std::bad_alloc&)
6181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006183 }
6184}
6185
6186void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6187{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006188 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6189
6190 try
6191 {
6192 gl::Context *context = gl::getNonLostContext();
6193
6194 if (context)
6195 {
6196 gl::Texture *texture;
6197
6198 switch (target)
6199 {
6200 case GL_TEXTURE_2D:
6201 texture = context->getTexture2D();
6202 break;
6203 case GL_TEXTURE_CUBE_MAP:
6204 texture = context->getTextureCubeMap();
6205 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006206 case GL_TEXTURE_3D:
6207 if (context->getClientVersion() < 3)
6208 {
6209 return gl::error(GL_INVALID_ENUM);
6210 }
6211 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006212 case GL_TEXTURE_2D_ARRAY:
6213 if (context->getClientVersion() < 3)
6214 {
6215 return gl::error(GL_INVALID_ENUM);
6216 }
6217 texture = context->getTexture2DArray();
6218 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006219 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006221 }
6222
6223 switch (pname)
6224 {
6225 case GL_TEXTURE_WRAP_S:
6226 if (!texture->setWrapS((GLenum)param))
6227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006229 }
6230 break;
6231 case GL_TEXTURE_WRAP_T:
6232 if (!texture->setWrapT((GLenum)param))
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006235 }
6236 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006237 case GL_TEXTURE_WRAP_R:
6238 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6239 {
6240 return gl::error(GL_INVALID_ENUM);
6241 }
6242 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006243 case GL_TEXTURE_MIN_FILTER:
6244 if (!texture->setMinFilter((GLenum)param))
6245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006247 }
6248 break;
6249 case GL_TEXTURE_MAG_FILTER:
6250 if (!texture->setMagFilter((GLenum)param))
6251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006252 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006253 }
6254 break;
6255 case GL_TEXTURE_USAGE_ANGLE:
6256 if (!texture->setUsage((GLenum)param))
6257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006258 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006259 }
6260 break;
6261 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6262 if (!context->supportsTextureFilterAnisotropy())
6263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006264 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006265 }
6266 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006268 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006269 }
6270 break;
6271 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006272 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006273 }
6274 }
6275 }
6276 catch(std::bad_alloc&)
6277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006278 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006279 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006280}
6281
6282void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6283{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006284 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006285}
6286
6287void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6288{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006289 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006290
6291 try
6292 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006293 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006294
6295 if (context)
6296 {
6297 gl::Texture *texture;
6298
6299 switch (target)
6300 {
6301 case GL_TEXTURE_2D:
6302 texture = context->getTexture2D();
6303 break;
6304 case GL_TEXTURE_CUBE_MAP:
6305 texture = context->getTextureCubeMap();
6306 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006307 case GL_TEXTURE_3D:
6308 if (context->getClientVersion() < 3)
6309 {
6310 return gl::error(GL_INVALID_ENUM);
6311 }
6312 texture = context->getTexture3D();
6313 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006314 case GL_TEXTURE_2D_ARRAY:
6315 if (context->getClientVersion() < 3)
6316 {
6317 return gl::error(GL_INVALID_ENUM);
6318 }
6319 texture = context->getTexture2DArray();
6320 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006321 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006322 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006323 }
6324
6325 switch (pname)
6326 {
6327 case GL_TEXTURE_WRAP_S:
6328 if (!texture->setWrapS((GLenum)param))
6329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006331 }
6332 break;
6333 case GL_TEXTURE_WRAP_T:
6334 if (!texture->setWrapT((GLenum)param))
6335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006336 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006337 }
6338 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006339 case GL_TEXTURE_WRAP_R:
6340 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6341 {
6342 return gl::error(GL_INVALID_ENUM);
6343 }
6344 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006345 case GL_TEXTURE_MIN_FILTER:
6346 if (!texture->setMinFilter((GLenum)param))
6347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006348 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006349 }
6350 break;
6351 case GL_TEXTURE_MAG_FILTER:
6352 if (!texture->setMagFilter((GLenum)param))
6353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006354 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006355 }
6356 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006357 case GL_TEXTURE_USAGE_ANGLE:
6358 if (!texture->setUsage((GLenum)param))
6359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006360 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006361 }
6362 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006363 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6364 if (!context->supportsTextureFilterAnisotropy())
6365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006366 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006367 }
6368 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006370 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006371 }
6372 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006373 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006374 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375 }
6376 }
6377 }
6378 catch(std::bad_alloc&)
6379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006380 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006381 }
6382}
6383
6384void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6385{
6386 glTexParameteri(target, pname, *params);
6387}
6388
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006389void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6390{
6391 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6392 target, levels, internalformat, width, height);
6393
6394 try
6395 {
6396 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006398 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006399 }
6400
6401 if (width < 1 || height < 1 || levels < 1)
6402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006404 }
6405
6406 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006409 }
6410
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006411 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006414 }
6415
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006416 gl::Context *context = gl::getNonLostContext();
6417
6418 if (context)
6419 {
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006420 if (!gl::IsValidInternalFormat(internalformat, context))
6421 {
6422 return gl::error(GL_INVALID_ENUM);
6423 }
6424
6425 GLenum format = gl::GetFormat(internalformat, context->getClientVersion());
6426 GLenum type = gl::GetType(internalformat, context->getClientVersion());
6427
6428 if (format == GL_NONE || type == GL_NONE)
6429 {
6430 return gl::error(GL_INVALID_ENUM);
6431 }
6432
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006433 switch (target)
6434 {
6435 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006436 if (width > context->getMaximum2DTextureDimension() ||
6437 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006440 }
6441 break;
6442 case GL_TEXTURE_CUBE_MAP:
6443 if (width > context->getMaximumCubeTextureDimension() ||
6444 height > context->getMaximumCubeTextureDimension())
6445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006446 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006447 }
6448 break;
6449 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006450 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006451 }
6452
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006453 if (levels != 1 && !context->supportsNonPower2Texture())
6454 {
6455 if (!gl::isPow2(width) || !gl::isPow2(height))
6456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006457 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006458 }
6459 }
6460
daniel@transgaming.come1077362011-11-11 04:16:50 +00006461 switch (internalformat)
6462 {
6463 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6464 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6465 if (!context->supportsDXT1Textures())
6466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006468 }
6469 break;
6470 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6471 if (!context->supportsDXT3Textures())
6472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006473 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006474 }
6475 break;
6476 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6477 if (!context->supportsDXT5Textures())
6478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006479 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006480 }
6481 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006482 case GL_RGBA32F_EXT:
6483 case GL_RGB32F_EXT:
6484 case GL_ALPHA32F_EXT:
6485 case GL_LUMINANCE32F_EXT:
6486 case GL_LUMINANCE_ALPHA32F_EXT:
6487 if (!context->supportsFloat32Textures())
6488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006489 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006490 }
6491 break;
6492 case GL_RGBA16F_EXT:
6493 case GL_RGB16F_EXT:
6494 case GL_ALPHA16F_EXT:
6495 case GL_LUMINANCE16F_EXT:
6496 case GL_LUMINANCE_ALPHA16F_EXT:
6497 if (!context->supportsFloat16Textures())
6498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006499 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006500 }
6501 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006502 case GL_DEPTH_COMPONENT16:
6503 case GL_DEPTH_COMPONENT32_OES:
6504 case GL_DEPTH24_STENCIL8_OES:
6505 if (!context->supportsDepthTextures())
6506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006507 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006508 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006509 if (target != GL_TEXTURE_2D)
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006512 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006513 // ANGLE_depth_texture only supports 1-level textures
6514 if (levels != 1)
6515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006517 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006518 break;
6519 default:
6520 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006521 }
6522
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006523 if (target == GL_TEXTURE_2D)
6524 {
6525 gl::Texture2D *texture = context->getTexture2D();
6526
6527 if (!texture || texture->id() == 0)
6528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006529 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006530 }
6531
6532 if (texture->isImmutable())
6533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006534 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006535 }
6536
6537 texture->storage(levels, internalformat, width, height);
6538 }
6539 else if (target == GL_TEXTURE_CUBE_MAP)
6540 {
6541 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6542
6543 if (!texture || texture->id() == 0)
6544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006545 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006546 }
6547
6548 if (texture->isImmutable())
6549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006550 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006551 }
6552
6553 texture->storage(levels, internalformat, width);
6554 }
6555 else UNREACHABLE();
6556 }
6557 }
6558 catch(std::bad_alloc&)
6559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006560 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006561 }
6562}
6563
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006564void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6565 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006566{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006567 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006568 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006569 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006570 target, level, xoffset, yoffset, width, height, format, type, pixels);
6571
6572 try
6573 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006574 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006577 }
6578
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006579 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006582 }
6583
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006584 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006587 }
6588
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006589 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006590 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006591 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006592 }
6593
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006595
6596 if (context)
6597 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006598 if (level > context->getMaximumTextureLevel())
6599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006601 }
6602
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006603 if (type == GL_FLOAT)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006604 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006605 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006607 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006608 }
6609 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006610 else if (type == GL_HALF_FLOAT_OES)
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006611 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006612 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006614 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006615 }
6616 }
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00006617
6618 if (format == GL_DEPTH_COMPONENT)
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006619 {
6620 if (!context->supportsDepthTextures())
6621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006622 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006623 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006624 if (target != GL_TEXTURE_2D)
6625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006626 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006627 }
6628 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006629 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006630 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006631
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006632 if (width == 0 || height == 0 || pixels == NULL)
6633 {
6634 return;
6635 }
6636
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006637 if (target == GL_TEXTURE_2D)
6638 {
6639 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006640 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006641 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006642 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006643 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006644 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006645 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006646 {
6647 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006648 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006649 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006650 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006651 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006652 }
6653 else
6654 {
6655 UNREACHABLE();
6656 }
6657 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006658 }
6659 catch(std::bad_alloc&)
6660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006661 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006662 }
6663}
6664
6665void __stdcall glUniform1f(GLint location, GLfloat x)
6666{
6667 glUniform1fv(location, 1, &x);
6668}
6669
6670void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6671{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006672 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006673
6674 try
6675 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006676 if (count < 0)
6677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006678 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006679 }
6680
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006681 if (location == -1)
6682 {
6683 return;
6684 }
6685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006687
6688 if (context)
6689 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006690 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006691 if (!programBinary)
6692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006693 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006694 }
6695
6696 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006698 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006699 }
6700 }
6701 }
6702 catch(std::bad_alloc&)
6703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006704 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006705 }
6706}
6707
6708void __stdcall glUniform1i(GLint location, GLint x)
6709{
6710 glUniform1iv(location, 1, &x);
6711}
6712
6713void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006715 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006716
6717 try
6718 {
6719 if (count < 0)
6720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006722 }
6723
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006724 if (location == -1)
6725 {
6726 return;
6727 }
6728
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006730
6731 if (context)
6732 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006733 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006734 if (!programBinary)
6735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006736 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006737 }
6738
6739 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006741 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006742 }
6743 }
6744 }
6745 catch(std::bad_alloc&)
6746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006748 }
6749}
6750
6751void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6752{
6753 GLfloat xy[2] = {x, y};
6754
6755 glUniform2fv(location, 1, (GLfloat*)&xy);
6756}
6757
6758void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6759{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006760 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006761
6762 try
6763 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006764 if (count < 0)
6765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006767 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006768
6769 if (location == -1)
6770 {
6771 return;
6772 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006773
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006774 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006775
6776 if (context)
6777 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006778 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006779 if (!programBinary)
6780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006781 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006782 }
6783
6784 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006786 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006787 }
6788 }
6789 }
6790 catch(std::bad_alloc&)
6791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006792 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006793 }
6794}
6795
6796void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6797{
6798 GLint xy[4] = {x, y};
6799
6800 glUniform2iv(location, 1, (GLint*)&xy);
6801}
6802
6803void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006805 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006806
6807 try
6808 {
6809 if (count < 0)
6810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006812 }
6813
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006814 if (location == -1)
6815 {
6816 return;
6817 }
6818
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006819 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006820
6821 if (context)
6822 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006823 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006824 if (!programBinary)
6825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006826 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006827 }
6828
6829 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006831 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006832 }
6833 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006834 }
6835 catch(std::bad_alloc&)
6836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006838 }
6839}
6840
6841void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6842{
6843 GLfloat xyz[3] = {x, y, z};
6844
6845 glUniform3fv(location, 1, (GLfloat*)&xyz);
6846}
6847
6848void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6849{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006850 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006851
6852 try
6853 {
6854 if (count < 0)
6855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006856 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006857 }
6858
6859 if (location == -1)
6860 {
6861 return;
6862 }
6863
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006864 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006865
6866 if (context)
6867 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006868 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006869 if (!programBinary)
6870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006871 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006872 }
6873
6874 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006876 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006877 }
6878 }
6879 }
6880 catch(std::bad_alloc&)
6881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006882 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006883 }
6884}
6885
6886void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6887{
6888 GLint xyz[3] = {x, y, z};
6889
6890 glUniform3iv(location, 1, (GLint*)&xyz);
6891}
6892
6893void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6894{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006895 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006896
6897 try
6898 {
6899 if (count < 0)
6900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006901 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006902 }
6903
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006904 if (location == -1)
6905 {
6906 return;
6907 }
6908
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006909 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006910
6911 if (context)
6912 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006913 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006914 if (!programBinary)
6915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006916 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006917 }
6918
6919 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006920 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006921 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006922 }
6923 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006924 }
6925 catch(std::bad_alloc&)
6926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006927 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006928 }
6929}
6930
6931void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6932{
6933 GLfloat xyzw[4] = {x, y, z, w};
6934
6935 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6936}
6937
6938void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006940 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006941
6942 try
6943 {
6944 if (count < 0)
6945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006946 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006947 }
6948
6949 if (location == -1)
6950 {
6951 return;
6952 }
6953
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006954 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006955
6956 if (context)
6957 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006958 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006959 if (!programBinary)
6960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006961 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006962 }
6963
6964 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006966 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006967 }
6968 }
6969 }
6970 catch(std::bad_alloc&)
6971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006973 }
6974}
6975
6976void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6977{
6978 GLint xyzw[4] = {x, y, z, w};
6979
6980 glUniform4iv(location, 1, (GLint*)&xyzw);
6981}
6982
6983void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6984{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006985 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006986
6987 try
6988 {
6989 if (count < 0)
6990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006992 }
6993
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006994 if (location == -1)
6995 {
6996 return;
6997 }
6998
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006999 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007000
7001 if (context)
7002 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007003 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007004 if (!programBinary)
7005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007006 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007007 }
7008
7009 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007011 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00007012 }
7013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007014 }
7015 catch(std::bad_alloc&)
7016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007018 }
7019}
7020
7021void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7022{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007023 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007024 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007025
7026 try
7027 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007028 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007031 }
7032
7033 if (location == -1)
7034 {
7035 return;
7036 }
7037
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007038 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007039
7040 if (context)
7041 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007042 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7043 {
7044 return gl::error(GL_INVALID_VALUE);
7045 }
7046
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007047 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007048 if (!programBinary)
7049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007050 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007051 }
7052
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007053 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007055 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007056 }
7057 }
7058 }
7059 catch(std::bad_alloc&)
7060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007061 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007062 }
7063}
7064
7065void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7066{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007067 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007068 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007069
7070 try
7071 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007072 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007074 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007075 }
7076
7077 if (location == -1)
7078 {
7079 return;
7080 }
7081
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007083
7084 if (context)
7085 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007086 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7087 {
7088 return gl::error(GL_INVALID_VALUE);
7089 }
7090
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007091 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007092 if (!programBinary)
7093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007094 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007095 }
7096
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007097 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007099 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007100 }
7101 }
7102 }
7103 catch(std::bad_alloc&)
7104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007105 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007106 }
7107}
7108
7109void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7110{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007111 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007112 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007113
7114 try
7115 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007116 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007118 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007119 }
7120
7121 if (location == -1)
7122 {
7123 return;
7124 }
7125
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007126 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007127
7128 if (context)
7129 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007130 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7131 {
7132 return gl::error(GL_INVALID_VALUE);
7133 }
7134
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007135 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007136 if (!programBinary)
7137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007138 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007139 }
7140
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007141 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144 }
7145 }
7146 }
7147 catch(std::bad_alloc&)
7148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007149 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007150 }
7151}
7152
7153void __stdcall glUseProgram(GLuint program)
7154{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007155 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007156
7157 try
7158 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007160
7161 if (context)
7162 {
7163 gl::Program *programObject = context->getProgram(program);
7164
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007165 if (!programObject && program != 0)
7166 {
7167 if (context->getShader(program))
7168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007169 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007170 }
7171 else
7172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007173 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007174 }
7175 }
7176
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007177 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007179 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007180 }
7181
7182 context->useProgram(program);
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 glValidateProgram(GLuint program)
7192{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007193 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007194
7195 try
7196 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007197 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007198
7199 if (context)
7200 {
7201 gl::Program *programObject = context->getProgram(program);
7202
7203 if (!programObject)
7204 {
7205 if (context->getShader(program))
7206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007207 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007208 }
7209 else
7210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007211 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007212 }
7213 }
7214
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007215 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007216 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007217 }
7218 catch(std::bad_alloc&)
7219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007220 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007221 }
7222}
7223
7224void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7225{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007226 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007227
7228 try
7229 {
7230 if (index >= gl::MAX_VERTEX_ATTRIBS)
7231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007232 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007233 }
7234
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007235 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007236
7237 if (context)
7238 {
7239 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007240 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007241 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007242 }
7243 catch(std::bad_alloc&)
7244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007245 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007246 }
7247}
7248
7249void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7250{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007251 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007252
7253 try
7254 {
7255 if (index >= gl::MAX_VERTEX_ATTRIBS)
7256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007258 }
7259
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007261
7262 if (context)
7263 {
7264 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007265 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007266 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007267 }
7268 catch(std::bad_alloc&)
7269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007270 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007271 }
7272}
7273
7274void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7275{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007276 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007277
7278 try
7279 {
7280 if (index >= gl::MAX_VERTEX_ATTRIBS)
7281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007283 }
7284
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007285 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007286
7287 if (context)
7288 {
7289 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007290 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007291 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007292 }
7293 catch(std::bad_alloc&)
7294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007295 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007296 }
7297}
7298
7299void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007301 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007302
7303 try
7304 {
7305 if (index >= gl::MAX_VERTEX_ATTRIBS)
7306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007308 }
7309
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007311
7312 if (context)
7313 {
7314 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007315 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007316 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007317 }
7318 catch(std::bad_alloc&)
7319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007320 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007321 }
7322}
7323
7324void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007326 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 +00007327
7328 try
7329 {
7330 if (index >= gl::MAX_VERTEX_ATTRIBS)
7331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007332 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007333 }
7334
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007335 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007336
7337 if (context)
7338 {
7339 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007340 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007342 }
7343 catch(std::bad_alloc&)
7344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007345 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007346 }
7347}
7348
7349void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7350{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007351 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007352
7353 try
7354 {
7355 if (index >= gl::MAX_VERTEX_ATTRIBS)
7356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007358 }
7359
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007360 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007361
7362 if (context)
7363 {
7364 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007365 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007366 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007367 }
7368 catch(std::bad_alloc&)
7369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007371 }
7372}
7373
7374void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007376 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 +00007377
7378 try
7379 {
7380 if (index >= gl::MAX_VERTEX_ATTRIBS)
7381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007383 }
7384
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007385 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007386
7387 if (context)
7388 {
7389 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007390 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007391 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007392 }
7393 catch(std::bad_alloc&)
7394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007395 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007396 }
7397}
7398
7399void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7400{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007401 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007402
7403 try
7404 {
7405 if (index >= gl::MAX_VERTEX_ATTRIBS)
7406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007407 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007408 }
7409
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007410 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007411
7412 if (context)
7413 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007414 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007416 }
7417 catch(std::bad_alloc&)
7418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007420 }
7421}
7422
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007423void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7424{
7425 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7426
7427 try
7428 {
7429 if (index >= gl::MAX_VERTEX_ATTRIBS)
7430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007431 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007432 }
7433
7434 gl::Context *context = gl::getNonLostContext();
7435
7436 if (context)
7437 {
7438 context->setVertexAttribDivisor(index, divisor);
7439 }
7440 }
7441 catch(std::bad_alloc&)
7442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007444 }
7445}
7446
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007447void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007449 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007450 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007451 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007452
7453 try
7454 {
7455 if (index >= gl::MAX_VERTEX_ATTRIBS)
7456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007457 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007458 }
7459
7460 if (size < 1 || size > 4)
7461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007462 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007463 }
7464
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007465 gl::Context *context = gl::getNonLostContext();
7466
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007467 switch (type)
7468 {
7469 case GL_BYTE:
7470 case GL_UNSIGNED_BYTE:
7471 case GL_SHORT:
7472 case GL_UNSIGNED_SHORT:
7473 case GL_FIXED:
7474 case GL_FLOAT:
7475 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007476 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007477 case GL_INT:
7478 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007479 case GL_INT_2_10_10_10_REV:
7480 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007481 if (context && context->getClientVersion() < 3)
7482 {
7483 return gl::error(GL_INVALID_ENUM);
7484 }
7485 else
7486 {
7487 break;
7488 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007489 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007490 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007491 }
7492
7493 if (stride < 0)
7494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007495 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007496 }
7497
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007498 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7499 {
7500 return gl::error(GL_INVALID_OPERATION);
7501 }
7502
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007503 if (context)
7504 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007505 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7506 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007507 }
7508 }
7509 catch(std::bad_alloc&)
7510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007511 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007512 }
7513}
7514
7515void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7516{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007517 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 +00007518
7519 try
7520 {
7521 if (width < 0 || height < 0)
7522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007524 }
7525
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007526 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007527
7528 if (context)
7529 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007530 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007531 }
7532 }
7533 catch(std::bad_alloc&)
7534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007535 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007536 }
7537}
7538
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007539// OpenGL ES 3.0 functions
7540
7541void __stdcall glReadBuffer(GLenum mode)
7542{
7543 EVENT("(GLenum mode = 0x%X)", mode);
7544
7545 try
7546 {
7547 gl::Context *context = gl::getNonLostContext();
7548
7549 if (context)
7550 {
7551 if (context->getClientVersion() < 3)
7552 {
7553 return gl::error(GL_INVALID_OPERATION);
7554 }
7555 }
7556
7557 UNIMPLEMENTED();
7558 }
7559 catch(std::bad_alloc&)
7560 {
7561 return gl::error(GL_OUT_OF_MEMORY);
7562 }
7563}
7564
7565void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7566{
7567 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7568 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7569
7570 try
7571 {
7572 gl::Context *context = gl::getNonLostContext();
7573
7574 if (context)
7575 {
7576 if (context->getClientVersion() < 3)
7577 {
7578 return gl::error(GL_INVALID_OPERATION);
7579 }
7580 }
7581
7582 UNIMPLEMENTED();
7583 }
7584 catch(std::bad_alloc&)
7585 {
7586 return gl::error(GL_OUT_OF_MEMORY);
7587 }
7588}
7589
7590void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7591{
7592 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7593 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7594 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7595 target, level, internalformat, width, height, depth, border, format, type, pixels);
7596
7597 try
7598 {
7599 gl::Context *context = gl::getNonLostContext();
7600
7601 if (context)
7602 {
7603 if (context->getClientVersion() < 3)
7604 {
7605 return gl::error(GL_INVALID_OPERATION);
7606 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007607
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007608 // validateES3TexImageFormat sets the error code if there is an error
7609 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7610 0, 0, 0, width, height, depth, border, format, type))
7611 {
7612 return;
7613 }
7614
7615 switch(target)
7616 {
7617 case GL_TEXTURE_3D:
7618 {
7619 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007620 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007621 }
7622 break;
7623
7624 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007625 {
7626 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007627 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007628 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007629 break;
7630
7631 default:
7632 return gl::error(GL_INVALID_ENUM);
7633 }
7634 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007635 }
7636 catch(std::bad_alloc&)
7637 {
7638 return gl::error(GL_OUT_OF_MEMORY);
7639 }
7640}
7641
7642void __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)
7643{
7644 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7645 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7646 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7647 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7648
7649 try
7650 {
7651 gl::Context *context = gl::getNonLostContext();
7652
7653 if (context)
7654 {
7655 if (context->getClientVersion() < 3)
7656 {
7657 return gl::error(GL_INVALID_OPERATION);
7658 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007659
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007660 if (!pixels)
7661 {
7662 return gl::error(GL_INVALID_VALUE);
7663 }
7664
7665 // validateES3TexImageFormat sets the error code if there is an error
7666 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7667 xoffset, yoffset, zoffset, width, height, depth, 0,
7668 format, type))
7669 {
7670 return;
7671 }
7672
7673 switch(target)
7674 {
7675 case GL_TEXTURE_3D:
7676 {
7677 gl::Texture3D *texture = context->getTexture3D();
7678 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7679 }
7680 break;
7681
7682 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007683 {
7684 gl::Texture2DArray *texture = context->getTexture2DArray();
7685 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7686 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007687 break;
7688
7689 default:
7690 return gl::error(GL_INVALID_ENUM);
7691 }
7692 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007693 }
7694 catch(std::bad_alloc&)
7695 {
7696 return gl::error(GL_OUT_OF_MEMORY);
7697 }
7698}
7699
7700void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7701{
7702 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7703 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7704 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7705
7706 try
7707 {
7708 gl::Context *context = gl::getNonLostContext();
7709
7710 if (context)
7711 {
7712 if (context->getClientVersion() < 3)
7713 {
7714 return gl::error(GL_INVALID_OPERATION);
7715 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007716
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007717 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7718 x, y, width, height))
7719 {
7720 return;
7721 }
7722
7723 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7724 gl::Texture *texture = NULL;
7725 switch (target)
7726 {
7727 case GL_TEXTURE_3D:
7728 texture = context->getTexture3D();
7729 break;
7730
7731 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007732 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007733 break;
7734
7735 default:
7736 return gl::error(GL_INVALID_ENUM);
7737 }
7738
7739 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7740 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007741 }
7742 catch(std::bad_alloc&)
7743 {
7744 return gl::error(GL_OUT_OF_MEMORY);
7745 }
7746}
7747
7748void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7749{
7750 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7751 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7752 "const GLvoid* data = 0x%0.8p)",
7753 target, level, internalformat, width, height, depth, border, imageSize, data);
7754
7755 try
7756 {
7757 gl::Context *context = gl::getNonLostContext();
7758
7759 if (context)
7760 {
7761 if (context->getClientVersion() < 3)
7762 {
7763 return gl::error(GL_INVALID_OPERATION);
7764 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007765
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007766 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 +00007767 {
7768 return gl::error(GL_INVALID_VALUE);
7769 }
7770
7771 // validateES3TexImageFormat sets the error code if there is an error
7772 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7773 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7774 {
7775 return;
7776 }
7777
7778 switch(target)
7779 {
7780 case GL_TEXTURE_3D:
7781 {
7782 gl::Texture3D *texture = context->getTexture3D();
7783 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7784 }
7785 break;
7786
7787 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007788 {
7789 gl::Texture2DArray *texture = context->getTexture2DArray();
7790 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7791 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007792 break;
7793
7794 default:
7795 return gl::error(GL_INVALID_ENUM);
7796 }
7797 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007798 }
7799 catch(std::bad_alloc&)
7800 {
7801 return gl::error(GL_OUT_OF_MEMORY);
7802 }
7803}
7804
7805void __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)
7806{
7807 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7808 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7809 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7810 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7811
7812 try
7813 {
7814 gl::Context *context = gl::getNonLostContext();
7815
7816 if (context)
7817 {
7818 if (context->getClientVersion() < 3)
7819 {
7820 return gl::error(GL_INVALID_OPERATION);
7821 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007822
shannonwoods@chromium.org8dcfc6a2013-05-30 00:09:48 +00007823 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 +00007824 {
7825 return gl::error(GL_INVALID_VALUE);
7826 }
7827
7828 if (!data)
7829 {
7830 return gl::error(GL_INVALID_VALUE);
7831 }
7832
7833 // validateES3TexImageFormat sets the error code if there is an error
7834 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7835 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7836 {
7837 return;
7838 }
7839
7840 switch(target)
7841 {
7842 case GL_TEXTURE_3D:
7843 {
7844 gl::Texture3D *texture = context->getTexture3D();
7845 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7846 format, imageSize, data);
7847 }
7848 break;
7849
7850 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007851 {
7852 gl::Texture2DArray *texture = context->getTexture2DArray();
7853 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7854 format, imageSize, data);
7855 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007856 break;
7857
7858 default:
7859 return gl::error(GL_INVALID_ENUM);
7860 }
7861 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007862 }
7863 catch(std::bad_alloc&)
7864 {
7865 return gl::error(GL_OUT_OF_MEMORY);
7866 }
7867}
7868
7869void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7870{
7871 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7872
7873 try
7874 {
7875 gl::Context *context = gl::getNonLostContext();
7876
7877 if (context)
7878 {
7879 if (context->getClientVersion() < 3)
7880 {
7881 return gl::error(GL_INVALID_OPERATION);
7882 }
7883 }
7884
7885 UNIMPLEMENTED();
7886 }
7887 catch(std::bad_alloc&)
7888 {
7889 return gl::error(GL_OUT_OF_MEMORY);
7890 }
7891}
7892
7893void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7894{
7895 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7896
7897 try
7898 {
7899 gl::Context *context = gl::getNonLostContext();
7900
7901 if (context)
7902 {
7903 if (context->getClientVersion() < 3)
7904 {
7905 return gl::error(GL_INVALID_OPERATION);
7906 }
7907 }
7908
7909 UNIMPLEMENTED();
7910 }
7911 catch(std::bad_alloc&)
7912 {
7913 return gl::error(GL_OUT_OF_MEMORY);
7914 }
7915}
7916
7917GLboolean __stdcall glIsQuery(GLuint id)
7918{
7919 EVENT("(GLuint id = %u)", id);
7920
7921 try
7922 {
7923 gl::Context *context = gl::getNonLostContext();
7924
7925 if (context)
7926 {
7927 if (context->getClientVersion() < 3)
7928 {
7929 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7930 }
7931 }
7932
7933 UNIMPLEMENTED();
7934 }
7935 catch(std::bad_alloc&)
7936 {
7937 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7938 }
7939
7940 return GL_FALSE;
7941}
7942
7943void __stdcall glBeginQuery(GLenum target, GLuint id)
7944{
7945 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7946
7947 try
7948 {
7949 gl::Context *context = gl::getNonLostContext();
7950
7951 if (context)
7952 {
7953 if (context->getClientVersion() < 3)
7954 {
7955 return gl::error(GL_INVALID_OPERATION);
7956 }
7957 }
7958
7959 UNIMPLEMENTED();
7960 }
7961 catch(std::bad_alloc&)
7962 {
7963 return gl::error(GL_OUT_OF_MEMORY);
7964 }
7965}
7966
7967void __stdcall glEndQuery(GLenum target)
7968{
7969 EVENT("(GLenum target = 0x%X)", target);
7970
7971 try
7972 {
7973 gl::Context *context = gl::getNonLostContext();
7974
7975 if (context)
7976 {
7977 if (context->getClientVersion() < 3)
7978 {
7979 return gl::error(GL_INVALID_OPERATION);
7980 }
7981 }
7982
7983 UNIMPLEMENTED();
7984 }
7985 catch(std::bad_alloc&)
7986 {
7987 return gl::error(GL_OUT_OF_MEMORY);
7988 }
7989}
7990
7991void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7992{
7993 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7994
7995 try
7996 {
7997 gl::Context *context = gl::getNonLostContext();
7998
7999 if (context)
8000 {
8001 if (context->getClientVersion() < 3)
8002 {
8003 return gl::error(GL_INVALID_OPERATION);
8004 }
8005 }
8006
8007 UNIMPLEMENTED();
8008 }
8009 catch(std::bad_alloc&)
8010 {
8011 return gl::error(GL_OUT_OF_MEMORY);
8012 }
8013}
8014
8015void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
8016{
8017 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
8018
8019 try
8020 {
8021 gl::Context *context = gl::getNonLostContext();
8022
8023 if (context)
8024 {
8025 if (context->getClientVersion() < 3)
8026 {
8027 return gl::error(GL_INVALID_OPERATION);
8028 }
8029 }
8030
8031 UNIMPLEMENTED();
8032 }
8033 catch(std::bad_alloc&)
8034 {
8035 return gl::error(GL_OUT_OF_MEMORY);
8036 }
8037}
8038
8039GLboolean __stdcall glUnmapBuffer(GLenum target)
8040{
8041 EVENT("(GLenum target = 0x%X)", target);
8042
8043 try
8044 {
8045 gl::Context *context = gl::getNonLostContext();
8046
8047 if (context)
8048 {
8049 if (context->getClientVersion() < 3)
8050 {
8051 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8052 }
8053 }
8054
8055 UNIMPLEMENTED();
8056 }
8057 catch(std::bad_alloc&)
8058 {
8059 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8060 }
8061
8062 return GL_FALSE;
8063}
8064
8065void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8066{
8067 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8068
8069 try
8070 {
8071 gl::Context *context = gl::getNonLostContext();
8072
8073 if (context)
8074 {
8075 if (context->getClientVersion() < 3)
8076 {
8077 return gl::error(GL_INVALID_OPERATION);
8078 }
8079 }
8080
8081 UNIMPLEMENTED();
8082 }
8083 catch(std::bad_alloc&)
8084 {
8085 return gl::error(GL_OUT_OF_MEMORY);
8086 }
8087}
8088
8089void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8090{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008091 try
8092 {
8093 gl::Context *context = gl::getNonLostContext();
8094
8095 if (context)
8096 {
8097 if (context->getClientVersion() < 3)
8098 {
8099 return gl::error(GL_INVALID_OPERATION);
8100 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008101
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008102 glDrawBuffersEXT(n, bufs);
8103 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008104 }
8105 catch(std::bad_alloc&)
8106 {
8107 return gl::error(GL_OUT_OF_MEMORY);
8108 }
8109}
8110
8111void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8112{
8113 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8114 location, count, transpose, value);
8115
8116 try
8117 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008118 if (count < 0)
8119 {
8120 return gl::error(GL_INVALID_VALUE);
8121 }
8122
8123 if (location == -1)
8124 {
8125 return;
8126 }
8127
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008128 gl::Context *context = gl::getNonLostContext();
8129
8130 if (context)
8131 {
8132 if (context->getClientVersion() < 3)
8133 {
8134 return gl::error(GL_INVALID_OPERATION);
8135 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008136
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008137 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8138 if (!programBinary)
8139 {
8140 return gl::error(GL_INVALID_OPERATION);
8141 }
8142
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008143 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008144 {
8145 return gl::error(GL_INVALID_OPERATION);
8146 }
8147 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008148 }
8149 catch(std::bad_alloc&)
8150 {
8151 return gl::error(GL_OUT_OF_MEMORY);
8152 }
8153}
8154
8155void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8156{
8157 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8158 location, count, transpose, value);
8159
8160 try
8161 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008162 if (count < 0)
8163 {
8164 return gl::error(GL_INVALID_VALUE);
8165 }
8166
8167 if (location == -1)
8168 {
8169 return;
8170 }
8171
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008172 gl::Context *context = gl::getNonLostContext();
8173
8174 if (context)
8175 {
8176 if (context->getClientVersion() < 3)
8177 {
8178 return gl::error(GL_INVALID_OPERATION);
8179 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008181 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8182 if (!programBinary)
8183 {
8184 return gl::error(GL_INVALID_OPERATION);
8185 }
8186
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008187 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008188 {
8189 return gl::error(GL_INVALID_OPERATION);
8190 }
8191 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008192 }
8193 catch(std::bad_alloc&)
8194 {
8195 return gl::error(GL_OUT_OF_MEMORY);
8196 }
8197}
8198
8199void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8200{
8201 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8202 location, count, transpose, value);
8203
8204 try
8205 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008206 if (count < 0)
8207 {
8208 return gl::error(GL_INVALID_VALUE);
8209 }
8210
8211 if (location == -1)
8212 {
8213 return;
8214 }
8215
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008216 gl::Context *context = gl::getNonLostContext();
8217
8218 if (context)
8219 {
8220 if (context->getClientVersion() < 3)
8221 {
8222 return gl::error(GL_INVALID_OPERATION);
8223 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008224
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008225 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8226 if (!programBinary)
8227 {
8228 return gl::error(GL_INVALID_OPERATION);
8229 }
8230
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008231 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008232 {
8233 return gl::error(GL_INVALID_OPERATION);
8234 }
8235 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008236 }
8237 catch(std::bad_alloc&)
8238 {
8239 return gl::error(GL_OUT_OF_MEMORY);
8240 }
8241}
8242
8243void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8244{
8245 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8246 location, count, transpose, value);
8247
8248 try
8249 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008250 if (count < 0)
8251 {
8252 return gl::error(GL_INVALID_VALUE);
8253 }
8254
8255 if (location == -1)
8256 {
8257 return;
8258 }
8259
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008260 gl::Context *context = gl::getNonLostContext();
8261
8262 if (context)
8263 {
8264 if (context->getClientVersion() < 3)
8265 {
8266 return gl::error(GL_INVALID_OPERATION);
8267 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008268
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008269 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8270 if (!programBinary)
8271 {
8272 return gl::error(GL_INVALID_OPERATION);
8273 }
8274
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008275 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008276 {
8277 return gl::error(GL_INVALID_OPERATION);
8278 }
8279 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008280 }
8281 catch(std::bad_alloc&)
8282 {
8283 return gl::error(GL_OUT_OF_MEMORY);
8284 }
8285}
8286
8287void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8288{
8289 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8290 location, count, transpose, value);
8291
8292 try
8293 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008294 if (count < 0)
8295 {
8296 return gl::error(GL_INVALID_VALUE);
8297 }
8298
8299 if (location == -1)
8300 {
8301 return;
8302 }
8303
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008304 gl::Context *context = gl::getNonLostContext();
8305
8306 if (context)
8307 {
8308 if (context->getClientVersion() < 3)
8309 {
8310 return gl::error(GL_INVALID_OPERATION);
8311 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008312
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008313 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8314 if (!programBinary)
8315 {
8316 return gl::error(GL_INVALID_OPERATION);
8317 }
8318
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008319 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008320 {
8321 return gl::error(GL_INVALID_OPERATION);
8322 }
8323 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008324 }
8325 catch(std::bad_alloc&)
8326 {
8327 return gl::error(GL_OUT_OF_MEMORY);
8328 }
8329}
8330
8331void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8332{
8333 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8334 location, count, transpose, value);
8335
8336 try
8337 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008338 if (count < 0)
8339 {
8340 return gl::error(GL_INVALID_VALUE);
8341 }
8342
8343 if (location == -1)
8344 {
8345 return;
8346 }
8347
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008348 gl::Context *context = gl::getNonLostContext();
8349
8350 if (context)
8351 {
8352 if (context->getClientVersion() < 3)
8353 {
8354 return gl::error(GL_INVALID_OPERATION);
8355 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008356
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008357 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8358 if (!programBinary)
8359 {
8360 return gl::error(GL_INVALID_OPERATION);
8361 }
8362
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008363 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008364 {
8365 return gl::error(GL_INVALID_OPERATION);
8366 }
8367 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008368 }
8369 catch(std::bad_alloc&)
8370 {
8371 return gl::error(GL_OUT_OF_MEMORY);
8372 }
8373}
8374
8375void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8376{
8377 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8378 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8379 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8380
8381 try
8382 {
8383 gl::Context *context = gl::getNonLostContext();
8384
8385 if (context)
8386 {
8387 if (context->getClientVersion() < 3)
8388 {
8389 return gl::error(GL_INVALID_OPERATION);
8390 }
8391 }
8392
8393 UNIMPLEMENTED();
8394 }
8395 catch(std::bad_alloc&)
8396 {
8397 return gl::error(GL_OUT_OF_MEMORY);
8398 }
8399}
8400
8401void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8402{
8403 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8404 target, samples, internalformat, width, height);
8405
8406 try
8407 {
8408 gl::Context *context = gl::getNonLostContext();
8409
8410 if (context)
8411 {
8412 if (context->getClientVersion() < 3)
8413 {
8414 return gl::error(GL_INVALID_OPERATION);
8415 }
8416 }
8417
8418 UNIMPLEMENTED();
8419 }
8420 catch(std::bad_alloc&)
8421 {
8422 return gl::error(GL_OUT_OF_MEMORY);
8423 }
8424}
8425
8426void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8427{
8428 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8429 target, attachment, texture, level, layer);
8430
8431 try
8432 {
8433 gl::Context *context = gl::getNonLostContext();
8434
8435 if (context)
8436 {
8437 if (context->getClientVersion() < 3)
8438 {
8439 return gl::error(GL_INVALID_OPERATION);
8440 }
8441 }
8442
8443 UNIMPLEMENTED();
8444 }
8445 catch(std::bad_alloc&)
8446 {
8447 return gl::error(GL_OUT_OF_MEMORY);
8448 }
8449}
8450
8451GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8452{
8453 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8454 target, offset, length, access);
8455
8456 try
8457 {
8458 gl::Context *context = gl::getNonLostContext();
8459
8460 if (context)
8461 {
8462 if (context->getClientVersion() < 3)
8463 {
8464 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8465 }
8466 }
8467
8468 UNIMPLEMENTED();
8469 }
8470 catch(std::bad_alloc&)
8471 {
8472 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8473 }
8474
8475 return NULL;
8476}
8477
8478void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8479{
8480 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8481
8482 try
8483 {
8484 gl::Context *context = gl::getNonLostContext();
8485
8486 if (context)
8487 {
8488 if (context->getClientVersion() < 3)
8489 {
8490 return gl::error(GL_INVALID_OPERATION);
8491 }
8492 }
8493
8494 UNIMPLEMENTED();
8495 }
8496 catch(std::bad_alloc&)
8497 {
8498 return gl::error(GL_OUT_OF_MEMORY);
8499 }
8500}
8501
8502void __stdcall glBindVertexArray(GLuint array)
8503{
8504 EVENT("(GLuint array = %u)", array);
8505
8506 try
8507 {
8508 gl::Context *context = gl::getNonLostContext();
8509
8510 if (context)
8511 {
8512 if (context->getClientVersion() < 3)
8513 {
8514 return gl::error(GL_INVALID_OPERATION);
8515 }
8516 }
8517
8518 UNIMPLEMENTED();
8519 }
8520 catch(std::bad_alloc&)
8521 {
8522 return gl::error(GL_OUT_OF_MEMORY);
8523 }
8524}
8525
8526void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8527{
8528 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8529
8530 try
8531 {
8532 gl::Context *context = gl::getNonLostContext();
8533
8534 if (context)
8535 {
8536 if (context->getClientVersion() < 3)
8537 {
8538 return gl::error(GL_INVALID_OPERATION);
8539 }
8540 }
8541
8542 UNIMPLEMENTED();
8543 }
8544 catch(std::bad_alloc&)
8545 {
8546 return gl::error(GL_OUT_OF_MEMORY);
8547 }
8548}
8549
8550void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8551{
8552 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8553
8554 try
8555 {
8556 gl::Context *context = gl::getNonLostContext();
8557
8558 if (context)
8559 {
8560 if (context->getClientVersion() < 3)
8561 {
8562 return gl::error(GL_INVALID_OPERATION);
8563 }
8564 }
8565
8566 UNIMPLEMENTED();
8567 }
8568 catch(std::bad_alloc&)
8569 {
8570 return gl::error(GL_OUT_OF_MEMORY);
8571 }
8572}
8573
8574GLboolean __stdcall glIsVertexArray(GLuint array)
8575{
8576 EVENT("(GLuint array = %u)", array);
8577
8578 try
8579 {
8580 gl::Context *context = gl::getNonLostContext();
8581
8582 if (context)
8583 {
8584 if (context->getClientVersion() < 3)
8585 {
8586 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8587 }
8588 }
8589
8590 UNIMPLEMENTED();
8591 }
8592 catch(std::bad_alloc&)
8593 {
8594 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8595 }
8596
8597 return GL_FALSE;
8598}
8599
8600void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8601{
8602 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8603 target, index, data);
8604
8605 try
8606 {
8607 gl::Context *context = gl::getNonLostContext();
8608
8609 if (context)
8610 {
8611 if (context->getClientVersion() < 3)
8612 {
8613 return gl::error(GL_INVALID_OPERATION);
8614 }
8615 }
8616
8617 UNIMPLEMENTED();
8618 }
8619 catch(std::bad_alloc&)
8620 {
8621 return gl::error(GL_OUT_OF_MEMORY);
8622 }
8623}
8624
8625void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8626{
8627 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8628
8629 try
8630 {
8631 gl::Context *context = gl::getNonLostContext();
8632
8633 if (context)
8634 {
8635 if (context->getClientVersion() < 3)
8636 {
8637 return gl::error(GL_INVALID_OPERATION);
8638 }
8639 }
8640
8641 UNIMPLEMENTED();
8642 }
8643 catch(std::bad_alloc&)
8644 {
8645 return gl::error(GL_OUT_OF_MEMORY);
8646 }
8647}
8648
8649void __stdcall glEndTransformFeedback(void)
8650{
8651 EVENT("(void)");
8652
8653 try
8654 {
8655 gl::Context *context = gl::getNonLostContext();
8656
8657 if (context)
8658 {
8659 if (context->getClientVersion() < 3)
8660 {
8661 return gl::error(GL_INVALID_OPERATION);
8662 }
8663 }
8664
8665 UNIMPLEMENTED();
8666 }
8667 catch(std::bad_alloc&)
8668 {
8669 return gl::error(GL_OUT_OF_MEMORY);
8670 }
8671}
8672
8673void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8674{
8675 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8676 target, index, buffer, offset, size);
8677
8678 try
8679 {
8680 gl::Context *context = gl::getNonLostContext();
8681
8682 if (context)
8683 {
8684 if (context->getClientVersion() < 3)
8685 {
8686 return gl::error(GL_INVALID_OPERATION);
8687 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008688
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008689 switch (target)
8690 {
8691 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008692 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008693 {
8694 return gl::error(GL_INVALID_VALUE);
8695 }
8696 break;
8697
8698 case GL_UNIFORM_BUFFER:
8699 if (index >= context->getMaximumCombinedUniformBufferBindings())
8700 {
8701 return gl::error(GL_INVALID_VALUE);
8702 }
8703 break;
8704
8705 default:
8706 return gl::error(GL_INVALID_ENUM);
8707 }
8708
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008709 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008710 {
8711 return gl::error(GL_INVALID_VALUE);
8712 }
8713
8714 switch (target)
8715 {
8716 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008717
8718 // size and offset must be a multiple of 4
8719 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8720 {
8721 return gl::error(GL_INVALID_VALUE);
8722 }
8723
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008724 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8725 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008726 break;
8727
8728 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008729
8730 // it is an error to bind an offset not a multiple of the alignment
8731 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8732 {
8733 return gl::error(GL_INVALID_VALUE);
8734 }
8735
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008736 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8737 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008738 break;
8739
8740 default:
8741 UNREACHABLE();
8742 }
8743 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008744 }
8745 catch(std::bad_alloc&)
8746 {
8747 return gl::error(GL_OUT_OF_MEMORY);
8748 }
8749}
8750
8751void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8752{
8753 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8754 target, index, buffer);
8755
8756 try
8757 {
8758 gl::Context *context = gl::getNonLostContext();
8759
8760 if (context)
8761 {
8762 if (context->getClientVersion() < 3)
8763 {
8764 return gl::error(GL_INVALID_OPERATION);
8765 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008766
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008767 switch (target)
8768 {
8769 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008770 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008771 {
8772 return gl::error(GL_INVALID_VALUE);
8773 }
8774 break;
8775
8776 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008777 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008778 {
8779 return gl::error(GL_INVALID_VALUE);
8780 }
8781 break;
8782
8783 default:
8784 return gl::error(GL_INVALID_ENUM);
8785 }
8786
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008787 switch (target)
8788 {
8789 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008790 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008791 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008792 break;
8793
8794 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008795 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008796 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008797 break;
8798
8799 default:
8800 UNREACHABLE();
8801 }
8802 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008803 }
8804 catch(std::bad_alloc&)
8805 {
8806 return gl::error(GL_OUT_OF_MEMORY);
8807 }
8808}
8809
8810void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8811{
8812 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8813 program, count, varyings, bufferMode);
8814
8815 try
8816 {
8817 gl::Context *context = gl::getNonLostContext();
8818
8819 if (context)
8820 {
8821 if (context->getClientVersion() < 3)
8822 {
8823 return gl::error(GL_INVALID_OPERATION);
8824 }
8825 }
8826
8827 UNIMPLEMENTED();
8828 }
8829 catch(std::bad_alloc&)
8830 {
8831 return gl::error(GL_OUT_OF_MEMORY);
8832 }
8833}
8834
8835void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8836{
8837 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8838 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8839 program, index, bufSize, length, size, type, name);
8840
8841 try
8842 {
8843 gl::Context *context = gl::getNonLostContext();
8844
8845 if (context)
8846 {
8847 if (context->getClientVersion() < 3)
8848 {
8849 return gl::error(GL_INVALID_OPERATION);
8850 }
8851 }
8852
8853 UNIMPLEMENTED();
8854 }
8855 catch(std::bad_alloc&)
8856 {
8857 return gl::error(GL_OUT_OF_MEMORY);
8858 }
8859}
8860
8861void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8862{
8863 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8864 index, size, type, stride, pointer);
8865
8866 try
8867 {
8868 gl::Context *context = gl::getNonLostContext();
8869
8870 if (context)
8871 {
8872 if (context->getClientVersion() < 3)
8873 {
8874 return gl::error(GL_INVALID_OPERATION);
8875 }
8876 }
8877
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008878 if (index >= gl::MAX_VERTEX_ATTRIBS)
8879 {
8880 return gl::error(GL_INVALID_VALUE);
8881 }
8882
8883 if (size < 1 || size > 4)
8884 {
8885 return gl::error(GL_INVALID_VALUE);
8886 }
8887
8888 switch (type)
8889 {
8890 case GL_BYTE:
8891 case GL_UNSIGNED_BYTE:
8892 case GL_SHORT:
8893 case GL_UNSIGNED_SHORT:
8894 case GL_INT:
8895 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008896 case GL_INT_2_10_10_10_REV:
8897 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008898 break;
8899 default:
8900 return gl::error(GL_INVALID_ENUM);
8901 }
8902
8903 if (stride < 0)
8904 {
8905 return gl::error(GL_INVALID_VALUE);
8906 }
8907
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008908 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8909 {
8910 return gl::error(GL_INVALID_OPERATION);
8911 }
8912
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008913 if (context)
8914 {
8915 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8916 stride, pointer);
8917 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008918 }
8919 catch(std::bad_alloc&)
8920 {
8921 return gl::error(GL_OUT_OF_MEMORY);
8922 }
8923}
8924
8925void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8926{
8927 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8928 index, pname, params);
8929
8930 try
8931 {
8932 gl::Context *context = gl::getNonLostContext();
8933
8934 if (context)
8935 {
8936 if (context->getClientVersion() < 3)
8937 {
8938 return gl::error(GL_INVALID_OPERATION);
8939 }
8940 }
8941
8942 UNIMPLEMENTED();
8943 }
8944 catch(std::bad_alloc&)
8945 {
8946 return gl::error(GL_OUT_OF_MEMORY);
8947 }
8948}
8949
8950void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8951{
8952 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8953 index, pname, params);
8954
8955 try
8956 {
8957 gl::Context *context = gl::getNonLostContext();
8958
8959 if (context)
8960 {
8961 if (context->getClientVersion() < 3)
8962 {
8963 return gl::error(GL_INVALID_OPERATION);
8964 }
8965 }
8966
8967 UNIMPLEMENTED();
8968 }
8969 catch(std::bad_alloc&)
8970 {
8971 return gl::error(GL_OUT_OF_MEMORY);
8972 }
8973}
8974
8975void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8976{
8977 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8978 index, x, y, z, w);
8979
8980 try
8981 {
8982 gl::Context *context = gl::getNonLostContext();
8983
8984 if (context)
8985 {
8986 if (context->getClientVersion() < 3)
8987 {
8988 return gl::error(GL_INVALID_OPERATION);
8989 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008990
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008991 if (index >= gl::MAX_VERTEX_ATTRIBS)
8992 {
8993 return gl::error(GL_INVALID_VALUE);
8994 }
8995
8996 GLint vals[4] = { x, y, z, w };
8997 context->setVertexAttribi(index, vals);
8998 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008999 }
9000 catch(std::bad_alloc&)
9001 {
9002 return gl::error(GL_OUT_OF_MEMORY);
9003 }
9004}
9005
9006void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
9007{
9008 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
9009 index, x, y, z, w);
9010
9011 try
9012 {
9013 gl::Context *context = gl::getNonLostContext();
9014
9015 if (context)
9016 {
9017 if (context->getClientVersion() < 3)
9018 {
9019 return gl::error(GL_INVALID_OPERATION);
9020 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009021
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009022 if (index >= gl::MAX_VERTEX_ATTRIBS)
9023 {
9024 return gl::error(GL_INVALID_VALUE);
9025 }
9026
9027 GLuint vals[4] = { x, y, z, w };
9028 context->setVertexAttribu(index, vals);
9029 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009030 }
9031 catch(std::bad_alloc&)
9032 {
9033 return gl::error(GL_OUT_OF_MEMORY);
9034 }
9035}
9036
9037void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9038{
9039 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9040
9041 try
9042 {
9043 gl::Context *context = gl::getNonLostContext();
9044
9045 if (context)
9046 {
9047 if (context->getClientVersion() < 3)
9048 {
9049 return gl::error(GL_INVALID_OPERATION);
9050 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009051
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009052 if (index >= gl::MAX_VERTEX_ATTRIBS)
9053 {
9054 return gl::error(GL_INVALID_VALUE);
9055 }
9056
9057 context->setVertexAttribi(index, v);
9058 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009059 }
9060 catch(std::bad_alloc&)
9061 {
9062 return gl::error(GL_OUT_OF_MEMORY);
9063 }
9064}
9065
9066void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9067{
9068 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9069
9070 try
9071 {
9072 gl::Context *context = gl::getNonLostContext();
9073
9074 if (context)
9075 {
9076 if (context->getClientVersion() < 3)
9077 {
9078 return gl::error(GL_INVALID_OPERATION);
9079 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009080
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009081 if (index >= gl::MAX_VERTEX_ATTRIBS)
9082 {
9083 return gl::error(GL_INVALID_VALUE);
9084 }
9085
9086 context->setVertexAttribu(index, v);
9087 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009088 }
9089 catch(std::bad_alloc&)
9090 {
9091 return gl::error(GL_OUT_OF_MEMORY);
9092 }
9093}
9094
9095void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9096{
9097 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9098 program, location, params);
9099
9100 try
9101 {
9102 gl::Context *context = gl::getNonLostContext();
9103
9104 if (context)
9105 {
9106 if (context->getClientVersion() < 3)
9107 {
9108 return gl::error(GL_INVALID_OPERATION);
9109 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009110
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009111 if (program == 0)
9112 {
9113 return gl::error(GL_INVALID_VALUE);
9114 }
9115
9116 gl::Program *programObject = context->getProgram(program);
9117
9118 if (!programObject || !programObject->isLinked())
9119 {
9120 return gl::error(GL_INVALID_OPERATION);
9121 }
9122
9123 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9124 if (!programBinary)
9125 {
9126 return gl::error(GL_INVALID_OPERATION);
9127 }
9128
9129 if (!programBinary->getUniformuiv(location, NULL, params))
9130 {
9131 return gl::error(GL_INVALID_OPERATION);
9132 }
9133 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009134 }
9135 catch(std::bad_alloc&)
9136 {
9137 return gl::error(GL_OUT_OF_MEMORY);
9138 }
9139}
9140
9141GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9142{
9143 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9144 program, name);
9145
9146 try
9147 {
9148 gl::Context *context = gl::getNonLostContext();
9149
9150 if (context)
9151 {
9152 if (context->getClientVersion() < 3)
9153 {
9154 return gl::error(GL_INVALID_OPERATION, 0);
9155 }
9156 }
9157
9158 UNIMPLEMENTED();
9159 }
9160 catch(std::bad_alloc&)
9161 {
9162 return gl::error(GL_OUT_OF_MEMORY, 0);
9163 }
9164
9165 return 0;
9166}
9167
9168void __stdcall glUniform1ui(GLint location, GLuint v0)
9169{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009170 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009171}
9172
9173void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9174{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009175 const GLuint xy[] = { v0, v1 };
9176 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009177}
9178
9179void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9180{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009181 const GLuint xyz[] = { v0, v1, v2 };
9182 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009183}
9184
9185void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9186{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009187 const GLuint xyzw[] = { v0, v1, v2, v3 };
9188 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009189}
9190
9191void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9192{
9193 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9194 location, count, value);
9195
9196 try
9197 {
9198 gl::Context *context = gl::getNonLostContext();
9199
9200 if (context)
9201 {
9202 if (context->getClientVersion() < 3)
9203 {
9204 return gl::error(GL_INVALID_OPERATION);
9205 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009206
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009207 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9208 if (!programBinary)
9209 {
9210 return gl::error(GL_INVALID_OPERATION);
9211 }
9212
9213 if (!programBinary->setUniform1uiv(location, count, value))
9214 {
9215 return gl::error(GL_INVALID_OPERATION);
9216 }
9217 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009218 }
9219 catch(std::bad_alloc&)
9220 {
9221 return gl::error(GL_OUT_OF_MEMORY);
9222 }
9223}
9224
9225void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9226{
9227 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9228 location, count, value);
9229
9230 try
9231 {
9232 gl::Context *context = gl::getNonLostContext();
9233
9234 if (context)
9235 {
9236 if (context->getClientVersion() < 3)
9237 {
9238 return gl::error(GL_INVALID_OPERATION);
9239 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009240
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009241 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9242 if (!programBinary)
9243 {
9244 return gl::error(GL_INVALID_OPERATION);
9245 }
9246
9247 if (!programBinary->setUniform2uiv(location, count, value))
9248 {
9249 return gl::error(GL_INVALID_OPERATION);
9250 }
9251 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009252 }
9253 catch(std::bad_alloc&)
9254 {
9255 return gl::error(GL_OUT_OF_MEMORY);
9256 }
9257}
9258
9259void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9260{
9261 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9262 location, count, value);
9263
9264 try
9265 {
9266 gl::Context *context = gl::getNonLostContext();
9267
9268 if (context)
9269 {
9270 if (context->getClientVersion() < 3)
9271 {
9272 return gl::error(GL_INVALID_OPERATION);
9273 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009274
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009275 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9276 if (!programBinary)
9277 {
9278 return gl::error(GL_INVALID_OPERATION);
9279 }
9280
9281 if (!programBinary->setUniform3uiv(location, count, value))
9282 {
9283 return gl::error(GL_INVALID_OPERATION);
9284 }
9285 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009286 }
9287 catch(std::bad_alloc&)
9288 {
9289 return gl::error(GL_OUT_OF_MEMORY);
9290 }
9291}
9292
9293void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9294{
9295 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9296 location, count, value);
9297
9298 try
9299 {
9300 gl::Context *context = gl::getNonLostContext();
9301
9302 if (context)
9303 {
9304 if (context->getClientVersion() < 3)
9305 {
9306 return gl::error(GL_INVALID_OPERATION);
9307 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009308
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009309 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9310 if (!programBinary)
9311 {
9312 return gl::error(GL_INVALID_OPERATION);
9313 }
9314
9315 if (!programBinary->setUniform4uiv(location, count, value))
9316 {
9317 return gl::error(GL_INVALID_OPERATION);
9318 }
9319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009320 }
9321 catch(std::bad_alloc&)
9322 {
9323 return gl::error(GL_OUT_OF_MEMORY);
9324 }
9325}
9326
9327void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9328{
9329 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9330 buffer, drawbuffer, value);
9331
9332 try
9333 {
9334 gl::Context *context = gl::getNonLostContext();
9335
9336 if (context)
9337 {
9338 if (context->getClientVersion() < 3)
9339 {
9340 return gl::error(GL_INVALID_OPERATION);
9341 }
9342 }
9343
9344 UNIMPLEMENTED();
9345 }
9346 catch(std::bad_alloc&)
9347 {
9348 return gl::error(GL_OUT_OF_MEMORY);
9349 }
9350}
9351
9352void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9353{
9354 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9355 buffer, drawbuffer, value);
9356
9357 try
9358 {
9359 gl::Context *context = gl::getNonLostContext();
9360
9361 if (context)
9362 {
9363 if (context->getClientVersion() < 3)
9364 {
9365 return gl::error(GL_INVALID_OPERATION);
9366 }
9367 }
9368
9369 UNIMPLEMENTED();
9370 }
9371 catch(std::bad_alloc&)
9372 {
9373 return gl::error(GL_OUT_OF_MEMORY);
9374 }
9375}
9376
9377void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9378{
9379 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9380 buffer, drawbuffer, value);
9381
9382 try
9383 {
9384 gl::Context *context = gl::getNonLostContext();
9385
9386 if (context)
9387 {
9388 if (context->getClientVersion() < 3)
9389 {
9390 return gl::error(GL_INVALID_OPERATION);
9391 }
9392 }
9393
9394 UNIMPLEMENTED();
9395 }
9396 catch(std::bad_alloc&)
9397 {
9398 return gl::error(GL_OUT_OF_MEMORY);
9399 }
9400}
9401
9402void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9403{
9404 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9405 buffer, drawbuffer, depth, stencil);
9406
9407 try
9408 {
9409 gl::Context *context = gl::getNonLostContext();
9410
9411 if (context)
9412 {
9413 if (context->getClientVersion() < 3)
9414 {
9415 return gl::error(GL_INVALID_OPERATION);
9416 }
9417 }
9418
9419 UNIMPLEMENTED();
9420 }
9421 catch(std::bad_alloc&)
9422 {
9423 return gl::error(GL_OUT_OF_MEMORY);
9424 }
9425}
9426
9427const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9428{
9429 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9430
9431 try
9432 {
9433 gl::Context *context = gl::getNonLostContext();
9434
9435 if (context)
9436 {
9437 if (context->getClientVersion() < 3)
9438 {
9439 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9440 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009441
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009442 if (name != GL_EXTENSIONS)
9443 {
9444 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9445 }
9446
9447 if (index >= context->getNumExtensions())
9448 {
9449 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9450 }
9451
9452 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9453 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009454 }
9455 catch(std::bad_alloc&)
9456 {
9457 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9458 }
9459
9460 return NULL;
9461}
9462
9463void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9464{
9465 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9466 readTarget, writeTarget, readOffset, writeOffset, size);
9467
9468 try
9469 {
9470 gl::Context *context = gl::getNonLostContext();
9471
9472 if (context)
9473 {
9474 if (context->getClientVersion() < 3)
9475 {
9476 return gl::error(GL_INVALID_OPERATION);
9477 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009478
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009479 gl::Buffer *readBuffer = NULL;
9480 switch (readTarget)
9481 {
9482 case GL_ARRAY_BUFFER:
9483 readBuffer = context->getArrayBuffer();
9484 break;
9485 case GL_COPY_READ_BUFFER:
9486 readBuffer = context->getCopyReadBuffer();
9487 break;
9488 case GL_COPY_WRITE_BUFFER:
9489 readBuffer = context->getCopyWriteBuffer();
9490 break;
9491 case GL_ELEMENT_ARRAY_BUFFER:
9492 readBuffer = context->getElementArrayBuffer();
9493 break;
9494 case GL_PIXEL_PACK_BUFFER:
9495 readBuffer = context->getPixelPackBuffer();
9496 break;
9497 case GL_PIXEL_UNPACK_BUFFER:
9498 readBuffer = context->getPixelUnpackBuffer();
9499 break;
9500 case GL_TRANSFORM_FEEDBACK_BUFFER:
9501 readBuffer = context->getGenericTransformFeedbackBuffer();
9502 break;
9503 case GL_UNIFORM_BUFFER:
9504 readBuffer = context->getGenericUniformBuffer();
9505 break;
9506 default:
9507 return gl::error(GL_INVALID_ENUM);
9508 }
9509
9510 gl::Buffer *writeBuffer = NULL;
9511 switch (writeTarget)
9512 {
9513 case GL_ARRAY_BUFFER:
9514 writeBuffer = context->getArrayBuffer();
9515 break;
9516 case GL_COPY_READ_BUFFER:
9517 writeBuffer = context->getCopyReadBuffer();
9518 break;
9519 case GL_COPY_WRITE_BUFFER:
9520 writeBuffer = context->getCopyWriteBuffer();
9521 break;
9522 case GL_ELEMENT_ARRAY_BUFFER:
9523 writeBuffer = context->getElementArrayBuffer();
9524 break;
9525 case GL_PIXEL_PACK_BUFFER:
9526 writeBuffer = context->getPixelPackBuffer();
9527 break;
9528 case GL_PIXEL_UNPACK_BUFFER:
9529 writeBuffer = context->getPixelUnpackBuffer();
9530 break;
9531 case GL_TRANSFORM_FEEDBACK_BUFFER:
9532 writeBuffer = context->getGenericTransformFeedbackBuffer();
9533 break;
9534 case GL_UNIFORM_BUFFER:
9535 writeBuffer = context->getGenericUniformBuffer();
9536 break;
9537 default:
9538 return gl::error(GL_INVALID_ENUM);
9539 }
9540
9541 if (!readBuffer || !writeBuffer)
9542 {
9543 return gl::error(GL_INVALID_OPERATION);
9544 }
9545
9546 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9547 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9548 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9549 {
9550 return gl::error(GL_INVALID_VALUE);
9551 }
9552
9553 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9554 {
9555 return gl::error(GL_INVALID_VALUE);
9556 }
9557
9558 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9559
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009560 // if size is zero, the copy is a successful no-op
9561 if (size > 0)
9562 {
9563 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9564 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009565 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009566 }
9567 catch(std::bad_alloc&)
9568 {
9569 return gl::error(GL_OUT_OF_MEMORY);
9570 }
9571}
9572
9573void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9574{
9575 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9576 program, uniformCount, uniformNames, uniformIndices);
9577
9578 try
9579 {
9580 gl::Context *context = gl::getNonLostContext();
9581
9582 if (context)
9583 {
9584 if (context->getClientVersion() < 3)
9585 {
9586 return gl::error(GL_INVALID_OPERATION);
9587 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009588
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009589 if (uniformCount < 0)
9590 {
9591 return gl::error(GL_INVALID_VALUE);
9592 }
9593
9594 gl::Program *programObject = context->getProgram(program);
9595
9596 if (!programObject)
9597 {
9598 if (context->getShader(program))
9599 {
9600 return gl::error(GL_INVALID_OPERATION);
9601 }
9602 else
9603 {
9604 return gl::error(GL_INVALID_VALUE);
9605 }
9606 }
9607
9608 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9609 if (!programObject->isLinked() || !programBinary)
9610 {
9611 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9612 {
9613 uniformIndices[uniformId] = GL_INVALID_INDEX;
9614 }
9615 }
9616 else
9617 {
9618 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9619 {
9620 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9621 }
9622 }
9623 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009624 }
9625 catch(std::bad_alloc&)
9626 {
9627 return gl::error(GL_OUT_OF_MEMORY);
9628 }
9629}
9630
9631void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9632{
9633 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9634 program, uniformCount, uniformIndices, pname, params);
9635
9636 try
9637 {
9638 gl::Context *context = gl::getNonLostContext();
9639
9640 if (context)
9641 {
9642 if (context->getClientVersion() < 3)
9643 {
9644 return gl::error(GL_INVALID_OPERATION);
9645 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009646
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009647 if (uniformCount < 0)
9648 {
9649 return gl::error(GL_INVALID_VALUE);
9650 }
9651
9652 gl::Program *programObject = context->getProgram(program);
9653
9654 if (!programObject)
9655 {
9656 if (context->getShader(program))
9657 {
9658 return gl::error(GL_INVALID_OPERATION);
9659 }
9660 else
9661 {
9662 return gl::error(GL_INVALID_VALUE);
9663 }
9664 }
9665
9666 switch (pname)
9667 {
9668 case GL_UNIFORM_TYPE:
9669 case GL_UNIFORM_SIZE:
9670 case GL_UNIFORM_NAME_LENGTH:
9671 case GL_UNIFORM_BLOCK_INDEX:
9672 case GL_UNIFORM_OFFSET:
9673 case GL_UNIFORM_ARRAY_STRIDE:
9674 case GL_UNIFORM_MATRIX_STRIDE:
9675 case GL_UNIFORM_IS_ROW_MAJOR:
9676 break;
9677 default:
9678 return gl::error(GL_INVALID_ENUM);
9679 }
9680
9681 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9682
9683 if (!programBinary && uniformCount > 0)
9684 {
9685 return gl::error(GL_INVALID_VALUE);
9686 }
9687
9688 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9689 {
9690 const GLuint index = uniformIndices[uniformId];
9691
9692 if (index >= (GLuint)programBinary->getActiveUniformCount())
9693 {
9694 return gl::error(GL_INVALID_VALUE);
9695 }
9696 }
9697
9698 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9699 {
9700 const GLuint index = uniformIndices[uniformId];
9701 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9702 }
9703 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009704 }
9705 catch(std::bad_alloc&)
9706 {
9707 return gl::error(GL_OUT_OF_MEMORY);
9708 }
9709}
9710
9711GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9712{
9713 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9714
9715 try
9716 {
9717 gl::Context *context = gl::getNonLostContext();
9718
9719 if (context)
9720 {
9721 if (context->getClientVersion() < 3)
9722 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009723 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009724 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009725
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009726 gl::Program *programObject = context->getProgram(program);
9727
9728 if (!programObject)
9729 {
9730 if (context->getShader(program))
9731 {
9732 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9733 }
9734 else
9735 {
9736 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9737 }
9738 }
9739
9740 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9741 if (!programBinary)
9742 {
9743 return GL_INVALID_INDEX;
9744 }
9745
9746 return programBinary->getUniformBlockIndex(uniformBlockName);
9747 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009748 }
9749 catch(std::bad_alloc&)
9750 {
9751 return gl::error(GL_OUT_OF_MEMORY, 0);
9752 }
9753
9754 return 0;
9755}
9756
9757void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9758{
9759 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9760 program, uniformBlockIndex, pname, params);
9761
9762 try
9763 {
9764 gl::Context *context = gl::getNonLostContext();
9765
9766 if (context)
9767 {
9768 if (context->getClientVersion() < 3)
9769 {
9770 return gl::error(GL_INVALID_OPERATION);
9771 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009772 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009773
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009774 if (!programObject)
9775 {
9776 if (context->getShader(program))
9777 {
9778 return gl::error(GL_INVALID_OPERATION);
9779 }
9780 else
9781 {
9782 return gl::error(GL_INVALID_VALUE);
9783 }
9784 }
9785
9786 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9787
9788 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9789 {
9790 return gl::error(GL_INVALID_VALUE);
9791 }
9792
9793 switch (pname)
9794 {
9795 case GL_UNIFORM_BLOCK_BINDING:
9796 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9797 break;
9798
9799 case GL_UNIFORM_BLOCK_DATA_SIZE:
9800 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9801 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9802 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9803 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9804 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9805 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9806 break;
9807
9808 default:
9809 return gl::error(GL_INVALID_ENUM);
9810 }
9811 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009812 }
9813 catch(std::bad_alloc&)
9814 {
9815 return gl::error(GL_OUT_OF_MEMORY);
9816 }
9817}
9818
9819void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9820{
9821 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9822 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9823
9824 try
9825 {
9826 gl::Context *context = gl::getNonLostContext();
9827
9828 if (context)
9829 {
9830 if (context->getClientVersion() < 3)
9831 {
9832 return gl::error(GL_INVALID_OPERATION);
9833 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009834
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009835 gl::Program *programObject = context->getProgram(program);
9836
9837 if (!programObject)
9838 {
9839 if (context->getShader(program))
9840 {
9841 return gl::error(GL_INVALID_OPERATION);
9842 }
9843 else
9844 {
9845 return gl::error(GL_INVALID_VALUE);
9846 }
9847 }
9848
9849 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9850
9851 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9852 {
9853 return gl::error(GL_INVALID_VALUE);
9854 }
9855
9856 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
9857 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009858 }
9859 catch(std::bad_alloc&)
9860 {
9861 return gl::error(GL_OUT_OF_MEMORY);
9862 }
9863}
9864
9865void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9866{
9867 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9868 program, uniformBlockIndex, uniformBlockBinding);
9869
9870 try
9871 {
9872 gl::Context *context = gl::getNonLostContext();
9873
9874 if (context)
9875 {
9876 if (context->getClientVersion() < 3)
9877 {
9878 return gl::error(GL_INVALID_OPERATION);
9879 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009880
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00009881 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
9882 {
9883 return gl::error(GL_INVALID_VALUE);
9884 }
9885
9886 gl::Program *programObject = context->getProgram(program);
9887
9888 if (!programObject)
9889 {
9890 if (context->getShader(program))
9891 {
9892 return gl::error(GL_INVALID_OPERATION);
9893 }
9894 else
9895 {
9896 return gl::error(GL_INVALID_VALUE);
9897 }
9898 }
9899
9900 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9901
9902 // if never linked, there won't be any uniform blocks
9903 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9904 {
9905 return gl::error(GL_INVALID_VALUE);
9906 }
9907
9908 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9909 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009910 }
9911 catch(std::bad_alloc&)
9912 {
9913 return gl::error(GL_OUT_OF_MEMORY);
9914 }
9915}
9916
9917void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9918{
9919 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9920 mode, first, count, instanceCount);
9921
9922 try
9923 {
9924 gl::Context *context = gl::getNonLostContext();
9925
9926 if (context)
9927 {
9928 if (context->getClientVersion() < 3)
9929 {
9930 return gl::error(GL_INVALID_OPERATION);
9931 }
9932 }
9933
9934 UNIMPLEMENTED();
9935 }
9936 catch(std::bad_alloc&)
9937 {
9938 return gl::error(GL_OUT_OF_MEMORY);
9939 }
9940}
9941
9942void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9943{
9944 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9945 mode, count, type, indices, instanceCount);
9946
9947 try
9948 {
9949 gl::Context *context = gl::getNonLostContext();
9950
9951 if (context)
9952 {
9953 if (context->getClientVersion() < 3)
9954 {
9955 return gl::error(GL_INVALID_OPERATION);
9956 }
9957 }
9958
9959 UNIMPLEMENTED();
9960 }
9961 catch(std::bad_alloc&)
9962 {
9963 return gl::error(GL_OUT_OF_MEMORY);
9964 }
9965}
9966
9967GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9968{
9969 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9970
9971 try
9972 {
9973 gl::Context *context = gl::getNonLostContext();
9974
9975 if (context)
9976 {
9977 if (context->getClientVersion() < 3)
9978 {
9979 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9980 }
9981 }
9982
9983 UNIMPLEMENTED();
9984 }
9985 catch(std::bad_alloc&)
9986 {
9987 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9988 }
9989
9990 return NULL;
9991}
9992
9993GLboolean __stdcall glIsSync(GLsync sync)
9994{
9995 EVENT("(GLsync sync = 0x%0.8p)", sync);
9996
9997 try
9998 {
9999 gl::Context *context = gl::getNonLostContext();
10000
10001 if (context)
10002 {
10003 if (context->getClientVersion() < 3)
10004 {
10005 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10006 }
10007 }
10008
10009 UNIMPLEMENTED();
10010 }
10011 catch(std::bad_alloc&)
10012 {
10013 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10014 }
10015
10016 return GL_FALSE;
10017}
10018
10019void __stdcall glDeleteSync(GLsync sync)
10020{
10021 EVENT("(GLsync sync = 0x%0.8p)", sync);
10022
10023 try
10024 {
10025 gl::Context *context = gl::getNonLostContext();
10026
10027 if (context)
10028 {
10029 if (context->getClientVersion() < 3)
10030 {
10031 return gl::error(GL_INVALID_OPERATION);
10032 }
10033 }
10034
10035 UNIMPLEMENTED();
10036 }
10037 catch(std::bad_alloc&)
10038 {
10039 return gl::error(GL_OUT_OF_MEMORY);
10040 }
10041}
10042
10043GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10044{
10045 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10046 sync, flags, timeout);
10047
10048 try
10049 {
10050 gl::Context *context = gl::getNonLostContext();
10051
10052 if (context)
10053 {
10054 if (context->getClientVersion() < 3)
10055 {
10056 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10057 }
10058 }
10059
10060 UNIMPLEMENTED();
10061 }
10062 catch(std::bad_alloc&)
10063 {
10064 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10065 }
10066
10067 return GL_FALSE;
10068}
10069
10070void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10071{
10072 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10073 sync, flags, timeout);
10074
10075 try
10076 {
10077 gl::Context *context = gl::getNonLostContext();
10078
10079 if (context)
10080 {
10081 if (context->getClientVersion() < 3)
10082 {
10083 return gl::error(GL_INVALID_OPERATION);
10084 }
10085 }
10086
10087 UNIMPLEMENTED();
10088 }
10089 catch(std::bad_alloc&)
10090 {
10091 return gl::error(GL_OUT_OF_MEMORY);
10092 }
10093}
10094
10095void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10096{
10097 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10098 pname, params);
10099
10100 try
10101 {
10102 gl::Context *context = gl::getNonLostContext();
10103
10104 if (context)
10105 {
10106 if (context->getClientVersion() < 3)
10107 {
10108 return gl::error(GL_INVALID_OPERATION);
10109 }
10110 }
10111
10112 UNIMPLEMENTED();
10113 }
10114 catch(std::bad_alloc&)
10115 {
10116 return gl::error(GL_OUT_OF_MEMORY);
10117 }
10118}
10119
10120void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10121{
10122 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10123 sync, pname, bufSize, length, values);
10124
10125 try
10126 {
10127 gl::Context *context = gl::getNonLostContext();
10128
10129 if (context)
10130 {
10131 if (context->getClientVersion() < 3)
10132 {
10133 return gl::error(GL_INVALID_OPERATION);
10134 }
10135 }
10136
10137 UNIMPLEMENTED();
10138 }
10139 catch(std::bad_alloc&)
10140 {
10141 return gl::error(GL_OUT_OF_MEMORY);
10142 }
10143}
10144
10145void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10146{
10147 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10148 target, index, data);
10149
10150 try
10151 {
10152 gl::Context *context = gl::getNonLostContext();
10153
10154 if (context)
10155 {
10156 if (context->getClientVersion() < 3)
10157 {
10158 return gl::error(GL_INVALID_OPERATION);
10159 }
10160 }
10161
10162 UNIMPLEMENTED();
10163 }
10164 catch(std::bad_alloc&)
10165 {
10166 return gl::error(GL_OUT_OF_MEMORY);
10167 }
10168}
10169
10170void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10171{
10172 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10173 target, pname, params);
10174
10175 try
10176 {
10177 gl::Context *context = gl::getNonLostContext();
10178
10179 if (context)
10180 {
10181 if (context->getClientVersion() < 3)
10182 {
10183 return gl::error(GL_INVALID_OPERATION);
10184 }
10185 }
10186
10187 UNIMPLEMENTED();
10188 }
10189 catch(std::bad_alloc&)
10190 {
10191 return gl::error(GL_OUT_OF_MEMORY);
10192 }
10193}
10194
10195void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10196{
10197 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10198
10199 try
10200 {
10201 gl::Context *context = gl::getNonLostContext();
10202
10203 if (context)
10204 {
10205 if (context->getClientVersion() < 3)
10206 {
10207 return gl::error(GL_INVALID_OPERATION);
10208 }
10209 }
10210
10211 UNIMPLEMENTED();
10212 }
10213 catch(std::bad_alloc&)
10214 {
10215 return gl::error(GL_OUT_OF_MEMORY);
10216 }
10217}
10218
10219void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10220{
10221 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10222
10223 try
10224 {
10225 gl::Context *context = gl::getNonLostContext();
10226
10227 if (context)
10228 {
10229 if (context->getClientVersion() < 3)
10230 {
10231 return gl::error(GL_INVALID_OPERATION);
10232 }
10233 }
10234
10235 UNIMPLEMENTED();
10236 }
10237 catch(std::bad_alloc&)
10238 {
10239 return gl::error(GL_OUT_OF_MEMORY);
10240 }
10241}
10242
10243GLboolean __stdcall glIsSampler(GLuint sampler)
10244{
10245 EVENT("(GLuint sampler = %u)", sampler);
10246
10247 try
10248 {
10249 gl::Context *context = gl::getNonLostContext();
10250
10251 if (context)
10252 {
10253 if (context->getClientVersion() < 3)
10254 {
10255 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10256 }
10257 }
10258
10259 UNIMPLEMENTED();
10260 }
10261 catch(std::bad_alloc&)
10262 {
10263 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10264 }
10265
10266 return GL_FALSE;
10267}
10268
10269void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10270{
10271 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10272
10273 try
10274 {
10275 gl::Context *context = gl::getNonLostContext();
10276
10277 if (context)
10278 {
10279 if (context->getClientVersion() < 3)
10280 {
10281 return gl::error(GL_INVALID_OPERATION);
10282 }
10283 }
10284
10285 UNIMPLEMENTED();
10286 }
10287 catch(std::bad_alloc&)
10288 {
10289 return gl::error(GL_OUT_OF_MEMORY);
10290 }
10291}
10292
10293void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10294{
10295 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10296
10297 try
10298 {
10299 gl::Context *context = gl::getNonLostContext();
10300
10301 if (context)
10302 {
10303 if (context->getClientVersion() < 3)
10304 {
10305 return gl::error(GL_INVALID_OPERATION);
10306 }
10307 }
10308
10309 UNIMPLEMENTED();
10310 }
10311 catch(std::bad_alloc&)
10312 {
10313 return gl::error(GL_OUT_OF_MEMORY);
10314 }
10315}
10316
10317void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10318{
10319 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10320 sampler, pname, param);
10321
10322 try
10323 {
10324 gl::Context *context = gl::getNonLostContext();
10325
10326 if (context)
10327 {
10328 if (context->getClientVersion() < 3)
10329 {
10330 return gl::error(GL_INVALID_OPERATION);
10331 }
10332 }
10333
10334 UNIMPLEMENTED();
10335 }
10336 catch(std::bad_alloc&)
10337 {
10338 return gl::error(GL_OUT_OF_MEMORY);
10339 }
10340}
10341
10342void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10343{
10344 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10345
10346 try
10347 {
10348 gl::Context *context = gl::getNonLostContext();
10349
10350 if (context)
10351 {
10352 if (context->getClientVersion() < 3)
10353 {
10354 return gl::error(GL_INVALID_OPERATION);
10355 }
10356 }
10357
10358 UNIMPLEMENTED();
10359 }
10360 catch(std::bad_alloc&)
10361 {
10362 return gl::error(GL_OUT_OF_MEMORY);
10363 }
10364}
10365
10366void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10367{
10368 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10369
10370 try
10371 {
10372 gl::Context *context = gl::getNonLostContext();
10373
10374 if (context)
10375 {
10376 if (context->getClientVersion() < 3)
10377 {
10378 return gl::error(GL_INVALID_OPERATION);
10379 }
10380 }
10381
10382 UNIMPLEMENTED();
10383 }
10384 catch(std::bad_alloc&)
10385 {
10386 return gl::error(GL_OUT_OF_MEMORY);
10387 }
10388}
10389
10390void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10391{
10392 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10393
10394 try
10395 {
10396 gl::Context *context = gl::getNonLostContext();
10397
10398 if (context)
10399 {
10400 if (context->getClientVersion() < 3)
10401 {
10402 return gl::error(GL_INVALID_OPERATION);
10403 }
10404 }
10405
10406 UNIMPLEMENTED();
10407 }
10408 catch(std::bad_alloc&)
10409 {
10410 return gl::error(GL_OUT_OF_MEMORY);
10411 }
10412}
10413
10414void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10415{
10416 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10417
10418 try
10419 {
10420 gl::Context *context = gl::getNonLostContext();
10421
10422 if (context)
10423 {
10424 if (context->getClientVersion() < 3)
10425 {
10426 return gl::error(GL_INVALID_OPERATION);
10427 }
10428 }
10429
10430 UNIMPLEMENTED();
10431 }
10432 catch(std::bad_alloc&)
10433 {
10434 return gl::error(GL_OUT_OF_MEMORY);
10435 }
10436}
10437
10438void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10439{
10440 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10441
10442 try
10443 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010444 if (index >= gl::MAX_VERTEX_ATTRIBS)
10445 {
10446 return gl::error(GL_INVALID_VALUE);
10447 }
10448
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010449 gl::Context *context = gl::getNonLostContext();
10450
10451 if (context)
10452 {
10453 if (context->getClientVersion() < 3)
10454 {
10455 return gl::error(GL_INVALID_OPERATION);
10456 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010457
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010458 context->setVertexAttribDivisor(index, divisor);
10459 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010460 }
10461 catch(std::bad_alloc&)
10462 {
10463 return gl::error(GL_OUT_OF_MEMORY);
10464 }
10465}
10466
10467void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10468{
10469 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10470
10471 try
10472 {
10473 gl::Context *context = gl::getNonLostContext();
10474
10475 if (context)
10476 {
10477 if (context->getClientVersion() < 3)
10478 {
10479 return gl::error(GL_INVALID_OPERATION);
10480 }
10481 }
10482
10483 UNIMPLEMENTED();
10484 }
10485 catch(std::bad_alloc&)
10486 {
10487 return gl::error(GL_OUT_OF_MEMORY);
10488 }
10489}
10490
10491void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10492{
10493 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10494
10495 try
10496 {
10497 gl::Context *context = gl::getNonLostContext();
10498
10499 if (context)
10500 {
10501 if (context->getClientVersion() < 3)
10502 {
10503 return gl::error(GL_INVALID_OPERATION);
10504 }
10505 }
10506
10507 UNIMPLEMENTED();
10508 }
10509 catch(std::bad_alloc&)
10510 {
10511 return gl::error(GL_OUT_OF_MEMORY);
10512 }
10513}
10514
10515void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10516{
10517 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10518
10519 try
10520 {
10521 gl::Context *context = gl::getNonLostContext();
10522
10523 if (context)
10524 {
10525 if (context->getClientVersion() < 3)
10526 {
10527 return gl::error(GL_INVALID_OPERATION);
10528 }
10529 }
10530
10531 UNIMPLEMENTED();
10532 }
10533 catch(std::bad_alloc&)
10534 {
10535 return gl::error(GL_OUT_OF_MEMORY);
10536 }
10537}
10538
10539GLboolean __stdcall glIsTransformFeedback(GLuint id)
10540{
10541 EVENT("(GLuint id = %u)", id);
10542
10543 try
10544 {
10545 gl::Context *context = gl::getNonLostContext();
10546
10547 if (context)
10548 {
10549 if (context->getClientVersion() < 3)
10550 {
10551 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10552 }
10553 }
10554
10555 UNIMPLEMENTED();
10556 }
10557 catch(std::bad_alloc&)
10558 {
10559 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10560 }
10561
10562 return GL_FALSE;
10563}
10564
10565void __stdcall glPauseTransformFeedback(void)
10566{
10567 EVENT("(void)");
10568
10569 try
10570 {
10571 gl::Context *context = gl::getNonLostContext();
10572
10573 if (context)
10574 {
10575 if (context->getClientVersion() < 3)
10576 {
10577 return gl::error(GL_INVALID_OPERATION);
10578 }
10579 }
10580
10581 UNIMPLEMENTED();
10582 }
10583 catch(std::bad_alloc&)
10584 {
10585 return gl::error(GL_OUT_OF_MEMORY);
10586 }
10587}
10588
10589void __stdcall glResumeTransformFeedback(void)
10590{
10591 EVENT("(void)");
10592
10593 try
10594 {
10595 gl::Context *context = gl::getNonLostContext();
10596
10597 if (context)
10598 {
10599 if (context->getClientVersion() < 3)
10600 {
10601 return gl::error(GL_INVALID_OPERATION);
10602 }
10603 }
10604
10605 UNIMPLEMENTED();
10606 }
10607 catch(std::bad_alloc&)
10608 {
10609 return gl::error(GL_OUT_OF_MEMORY);
10610 }
10611}
10612
10613void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10614{
10615 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10616 program, bufSize, length, binaryFormat, binary);
10617
10618 try
10619 {
10620 gl::Context *context = gl::getNonLostContext();
10621
10622 if (context)
10623 {
10624 if (context->getClientVersion() < 3)
10625 {
10626 return gl::error(GL_INVALID_OPERATION);
10627 }
10628 }
10629
10630 UNIMPLEMENTED();
10631 }
10632 catch(std::bad_alloc&)
10633 {
10634 return gl::error(GL_OUT_OF_MEMORY);
10635 }
10636}
10637
10638void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10639{
10640 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10641 program, binaryFormat, binary, length);
10642
10643 try
10644 {
10645 gl::Context *context = gl::getNonLostContext();
10646
10647 if (context)
10648 {
10649 if (context->getClientVersion() < 3)
10650 {
10651 return gl::error(GL_INVALID_OPERATION);
10652 }
10653 }
10654
10655 UNIMPLEMENTED();
10656 }
10657 catch(std::bad_alloc&)
10658 {
10659 return gl::error(GL_OUT_OF_MEMORY);
10660 }
10661}
10662
10663void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10664{
10665 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10666 program, pname, value);
10667
10668 try
10669 {
10670 gl::Context *context = gl::getNonLostContext();
10671
10672 if (context)
10673 {
10674 if (context->getClientVersion() < 3)
10675 {
10676 return gl::error(GL_INVALID_OPERATION);
10677 }
10678 }
10679
10680 UNIMPLEMENTED();
10681 }
10682 catch(std::bad_alloc&)
10683 {
10684 return gl::error(GL_OUT_OF_MEMORY);
10685 }
10686}
10687
10688void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10689{
10690 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10691 target, numAttachments, attachments);
10692
10693 try
10694 {
10695 gl::Context *context = gl::getNonLostContext();
10696
10697 if (context)
10698 {
10699 if (context->getClientVersion() < 3)
10700 {
10701 return gl::error(GL_INVALID_OPERATION);
10702 }
10703 }
10704
10705 UNIMPLEMENTED();
10706 }
10707 catch(std::bad_alloc&)
10708 {
10709 return gl::error(GL_OUT_OF_MEMORY);
10710 }
10711}
10712
10713void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10714{
10715 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10716 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10717 target, numAttachments, attachments, x, y, width, height);
10718
10719 try
10720 {
10721 gl::Context *context = gl::getNonLostContext();
10722
10723 if (context)
10724 {
10725 if (context->getClientVersion() < 3)
10726 {
10727 return gl::error(GL_INVALID_OPERATION);
10728 }
10729 }
10730
10731 UNIMPLEMENTED();
10732 }
10733 catch(std::bad_alloc&)
10734 {
10735 return gl::error(GL_OUT_OF_MEMORY);
10736 }
10737}
10738
10739void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10740{
10741 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10742 target, levels, internalformat, width, height);
10743
10744 try
10745 {
10746 gl::Context *context = gl::getNonLostContext();
10747
10748 if (context)
10749 {
10750 if (context->getClientVersion() < 3)
10751 {
10752 return gl::error(GL_INVALID_OPERATION);
10753 }
10754 }
10755
10756 UNIMPLEMENTED();
10757 }
10758 catch(std::bad_alloc&)
10759 {
10760 return gl::error(GL_OUT_OF_MEMORY);
10761 }
10762}
10763
10764void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10765{
10766 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10767 "GLsizei height = %d, GLsizei depth = %d)",
10768 target, levels, internalformat, width, height, depth);
10769
10770 try
10771 {
10772 gl::Context *context = gl::getNonLostContext();
10773
10774 if (context)
10775 {
10776 if (context->getClientVersion() < 3)
10777 {
10778 return gl::error(GL_INVALID_OPERATION);
10779 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010780 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010781 }
10782 catch(std::bad_alloc&)
10783 {
10784 return gl::error(GL_OUT_OF_MEMORY);
10785 }
10786}
10787
10788void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10789{
10790 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10791 "GLint* params = 0x%0.8p)",
10792 target, internalformat, pname, bufSize, params);
10793
10794 try
10795 {
10796 gl::Context *context = gl::getNonLostContext();
10797
10798 if (context)
10799 {
10800 if (context->getClientVersion() < 3)
10801 {
10802 return gl::error(GL_INVALID_OPERATION);
10803 }
10804 }
10805
10806 UNIMPLEMENTED();
10807 }
10808 catch(std::bad_alloc&)
10809 {
10810 return gl::error(GL_OUT_OF_MEMORY);
10811 }
10812}
10813
10814// Extension functions
10815
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010816void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10817 GLbitfield mask, GLenum filter)
10818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010819 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010820 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10821 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10822 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10823
10824 try
10825 {
10826 switch (filter)
10827 {
10828 case GL_NEAREST:
10829 break;
10830 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010832 }
10833
10834 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010837 }
10838
10839 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10840 {
10841 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010842 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010843 }
10844
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010845 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010846
10847 if (context)
10848 {
10849 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10850 {
10851 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010852 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010853 }
10854
10855 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10856 }
10857 }
10858 catch(std::bad_alloc&)
10859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010860 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010861 }
10862}
10863
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010864void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10865 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010867 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010868 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010869 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010870 target, level, internalformat, width, height, depth, border, format, type, pixels);
10871
10872 try
10873 {
10874 UNIMPLEMENTED(); // FIXME
10875 }
10876 catch(std::bad_alloc&)
10877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010879 }
10880}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010881
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010882void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10883 GLenum *binaryFormat, void *binary)
10884{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010885 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 +000010886 program, bufSize, length, binaryFormat, binary);
10887
10888 try
10889 {
10890 gl::Context *context = gl::getNonLostContext();
10891
10892 if (context)
10893 {
10894 gl::Program *programObject = context->getProgram(program);
10895
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010896 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010898 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010899 }
10900
10901 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10902
10903 if (!programBinary)
10904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010905 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010906 }
10907
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010908 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010910 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010911 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010912
10913 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010914 }
10915 }
10916 catch(std::bad_alloc&)
10917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010918 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010919 }
10920}
10921
10922void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10923 const void *binary, GLint length)
10924{
10925 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10926 program, binaryFormat, binary, length);
10927
10928 try
10929 {
10930 gl::Context *context = gl::getNonLostContext();
10931
10932 if (context)
10933 {
10934 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010936 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010937 }
10938
10939 gl::Program *programObject = context->getProgram(program);
10940
10941 if (!programObject)
10942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010943 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010944 }
10945
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010946 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010947 }
10948 }
10949 catch(std::bad_alloc&)
10950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010951 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010952 }
10953}
10954
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010955void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10956{
10957 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10958
10959 try
10960 {
10961 gl::Context *context = gl::getNonLostContext();
10962
10963 if (context)
10964 {
10965 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10966 {
10967 return gl::error(GL_INVALID_VALUE);
10968 }
10969
10970 if (context->getDrawFramebufferHandle() == 0)
10971 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010972 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010973 {
10974 return gl::error(GL_INVALID_OPERATION);
10975 }
10976
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010977 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010978 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010979 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010980 }
10981 }
10982 else
10983 {
10984 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10985 {
10986 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10987 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10988 {
10989 return gl::error(GL_INVALID_OPERATION);
10990 }
10991 }
10992 }
10993
10994 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10995
10996 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10997 {
10998 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10999 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000011000
11001 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
11002 {
11003 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
11004 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000011005 }
11006 }
11007 catch (std::bad_alloc&)
11008 {
11009 return gl::error(GL_OUT_OF_MEMORY);
11010 }
11011}
11012
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011013__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
11014{
11015 struct Extension
11016 {
11017 const char *name;
11018 __eglMustCastToProperFunctionPointerType address;
11019 };
11020
11021 static const Extension glExtensions[] =
11022 {
11023 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011024 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011025 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011026 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11027 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11028 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11029 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11030 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11031 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11032 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011033 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011034 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011035 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11036 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11037 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11038 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011039 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11040 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11041 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11042 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11043 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11044 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11045 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011046 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011047 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11048 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11049 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011050 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11051 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011052
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011053 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011054 {
11055 if (strcmp(procname, glExtensions[ext].name) == 0)
11056 {
11057 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11058 }
11059 }
11060
11061 return NULL;
11062}
11063
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011064// Non-public functions used by EGL
11065
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011066bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011067{
11068 EVENT("(egl::Surface* surface = 0x%0.8p)",
11069 surface);
11070
11071 try
11072 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011073 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011074
11075 if (context)
11076 {
11077 gl::Texture2D *textureObject = context->getTexture2D();
11078
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011079 if (textureObject->isImmutable())
11080 {
11081 return false;
11082 }
11083
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011084 if (textureObject)
11085 {
11086 textureObject->bindTexImage(surface);
11087 }
11088 }
11089 }
11090 catch(std::bad_alloc&)
11091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011092 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011093 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011094
11095 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011096}
11097
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011098}