blob: 8e3f4a5559fed92b5ea6f2302bb3a9af4818508b [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00003// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height, GLsizei depth)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000025{
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000026 if (level < 0 || width < 0 || height < 0 || depth < 0)
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000027 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +000041 if (gl::isPow2(width) && gl::isPow2(height) && gl::isPow2(depth))
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000042 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000225bool validateES3TexImageFormat(gl::Context *context, GLenum target, GLint level, GLint internalformat, bool isCompressed, bool isSubImage,
226 GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
227 GLint border, GLenum format, GLenum type)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000228{
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000229 // Validate image size
230 if (level < 0 || width < 0 || height < 0 || depth < 0 )
231 {
232 return gl::error(GL_INVALID_VALUE, false);
233 }
234
235 if (isCompressed)
236 {
237 if (width != 1 && width != 2 && width % 4 != 0)
238 {
239 return gl::error(GL_INVALID_OPERATION, false);
240 }
241
242 if (height != 1 && height != 2 && height % 4 != 0)
243 {
244 return gl::error(GL_INVALID_OPERATION, false);
245 }
246 }
247
248 // Verify zero border
249 if (border != 0)
250 {
251 return gl::error(GL_INVALID_VALUE, false);
252 }
253
254 // Validate dimensions based on Context limits and validate the texture
255 if (level > context->getMaximumTextureLevel())
256 {
257 return gl::error(GL_INVALID_VALUE, false);
258 }
259
260 gl::Texture *texture = NULL;
261 bool textureCompressed = false;
262 GLenum textureInternalFormat = GL_NONE;
263 GLint textureLevelWidth = 0;
264 GLint textureLevelHeight = 0;
265 GLint textureLevelDepth = 0;
266 switch (target)
267 {
268 case GL_TEXTURE_2D:
269 {
270 if (width > (context->getMaximum2DTextureDimension() >> level) ||
271 height > (context->getMaximum2DTextureDimension() >> level))
272 {
273 return gl::error(GL_INVALID_VALUE, false);
274 }
275
276 gl::Texture2D *texture2d = context->getTexture2D();
277 if (texture2d)
278 {
279 textureCompressed = texture2d->isCompressed(level);
280 textureInternalFormat = texture2d->getInternalFormat(level);
281 textureLevelWidth = texture2d->getWidth(level);
282 textureLevelHeight = texture2d->getHeight(level);
283 textureLevelDepth = 1;
284 texture = texture2d;
285 }
286 }
287 break;
288
289 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
290 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
291 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
292 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
293 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
294 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
295 {
296 if (width != height)
297 {
298 return gl::error(GL_INVALID_VALUE, false);
299 }
300
301 if (width > (context->getMaximumCubeTextureDimension() >> level))
302 {
303 return gl::error(GL_INVALID_VALUE, false);
304 }
305
306 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
307 if (textureCube)
308 {
309 textureCompressed = textureCube->isCompressed(target, level);
310 textureInternalFormat = textureCube->getInternalFormat(target, level);
311 textureLevelWidth = textureCube->getWidth(target, level);
312 textureLevelHeight = textureCube->getHeight(target, level);
313 textureLevelDepth = 1;
314 texture = textureCube;
315 }
316 }
317 break;
318
319 case GL_TEXTURE_3D:
320 {
321 if (width > (context->getMaximum3DTextureDimension() >> level) ||
322 height > (context->getMaximum3DTextureDimension() >> level) ||
323 depth > (context->getMaximum3DTextureDimension() >> level))
324 {
325 return gl::error(GL_INVALID_VALUE, false);
326 }
327
328 gl::Texture3D *texture3d = context->getTexture3D();
329 if (texture3d)
330 {
331 textureCompressed = texture3d->isCompressed(level);
332 textureInternalFormat = texture3d->getInternalFormat(level);
333 textureLevelWidth = texture3d->getWidth(level);
334 textureLevelHeight = texture3d->getHeight(level);
335 textureLevelDepth = texture3d->getDepth(level);
336 texture = texture3d;
337 }
338 }
339 break;
340
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +0000341 case GL_TEXTURE_2D_ARRAY:
342 {
343 if (width > (context->getMaximum2DTextureDimension() >> level) ||
344 height > (context->getMaximum2DTextureDimension() >> level) ||
345 depth > (context->getMaximum2DArrayTextureLayers() >> level))
346 {
347 return gl::error(GL_INVALID_VALUE, false);
348 }
349
350 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
351 if (texture2darray)
352 {
353 textureCompressed = texture2darray->isCompressed(level);
354 textureInternalFormat = texture2darray->getInternalFormat(level);
355 textureLevelWidth = texture2darray->getWidth(level);
356 textureLevelHeight = texture2darray->getHeight(level);
357 textureLevelDepth = texture2darray->getDepth(level);
358 texture = texture2darray;
359 }
360 }
361 break;
362
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000363 default:
364 return gl::error(GL_INVALID_ENUM, false);
365 }
366
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000367 if (!texture)
368 {
369 return gl::error(GL_INVALID_OPERATION, false);
370 }
371
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000372 if (texture->isImmutable())
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000373 {
374 return gl::error(GL_INVALID_OPERATION, false);
375 }
376
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000377 // Validate texture formats
378 GLenum actualInternalFormat = isSubImage ? textureInternalFormat : internalformat;
379 if (isCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000380 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000381 if (!gl::IsValidES3CompressedFormat(actualInternalFormat))
382 {
383 return gl::error(GL_INVALID_ENUM, false);
384 }
385
386 if (target == GL_TEXTURE_3D)
387 {
388 return gl::error(GL_INVALID_OPERATION, false);
389 }
390 }
391 else
392 {
393 GLenum err;
394 if (!gl::IsValidES3FormatCombination(actualInternalFormat, format, type, &err))
395 {
396 return gl::error(err, false);
397 }
398
399 if ((target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY) &&
400 (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL))
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000401 {
402 return gl::error(GL_INVALID_OPERATION, false);
403 }
404 }
405
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000406 // Validate sub image parameters
407 if (isSubImage)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000408 {
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000409 if (isCompressed != textureCompressed)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000410 {
411 return gl::error(GL_INVALID_OPERATION, false);
412 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000413
414 if (format != GL_NONE)
415 {
416 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
417 if (internalformat != textureInternalFormat)
418 {
419 return gl::error(GL_INVALID_OPERATION, false);
420 }
421 }
422
423 if (isCompressed)
424 {
425 if ((width % 4 != 0 && width != textureLevelWidth) ||
426 (height % 4 != 0 && height != textureLevelHeight))
427 {
428 return gl::error(GL_INVALID_OPERATION, false);
429 }
430 }
431
432 if (width == 0 || height == 0 || depth == 0)
433 {
434 return false;
435 }
436
437 if (xoffset < 0 || yoffset < 0 || zoffset < 0)
438 {
439 return gl::error(GL_INVALID_VALUE, false);
440 }
441
442 if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
443 std::numeric_limits<GLsizei>::max() - yoffset < height ||
444 std::numeric_limits<GLsizei>::max() - zoffset < depth)
445 {
446 return gl::error(GL_INVALID_VALUE, false);
447 }
448
449 if (xoffset + width > textureLevelWidth ||
450 yoffset + height > textureLevelHeight ||
451 zoffset + depth > textureLevelDepth)
452 {
453 return gl::error(GL_INVALID_VALUE, false);
454 }
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000455 }
456
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000457 return true;
458}
459
460bool validateCopyTexImageParameters(gl::Context *context, GLenum target, bool isCompressed, GLint level,
461 GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y,
462 GLsizei width, GLsizei height)
463{
464 if (level < 0 || xoffset < 0 || yoffset < 0 || zoffset < 0 || width < 0 || height < 0)
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000465 {
466 return gl::error(GL_INVALID_VALUE, false);
467 }
468
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +0000469 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
470 {
471 return gl::error(GL_INVALID_VALUE, false);
472 }
473
474 if (width == 0 || height == 0)
475 {
476 return false;
477 }
478
479 if (level > context->getMaximumTextureLevel())
480 {
481 return gl::error(GL_INVALID_VALUE, false);
482 }
483
484 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
485
486 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
487 {
488 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
489 }
490
491 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
492 {
493 return gl::error(GL_INVALID_OPERATION, false);
494 }
495
496 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
497 GLenum colorbufferFormat = source->getInternalFormat();
498 gl::Texture *texture = NULL;
499 GLenum textureFormat = GL_RGBA;
500 bool textureCompressed = false;
501 GLint textureLevelWidth = 0;
502 GLint textureLevelHeight = 0;
503 GLint textureLevelDepth = 0;
504 switch (target)
505 {
506 case GL_TEXTURE_2D:
507 {
508 gl::Texture2D *texture2d = context->getTexture2D();
509 if (texture2d)
510 {
511 textureFormat = gl::ExtractFormat(texture2d->getInternalFormat(level));
512 textureCompressed = texture2d->isCompressed(level);
513 textureLevelWidth = texture2d->getWidth(level);
514 textureLevelHeight = texture2d->getHeight(level);
515 textureLevelDepth = 1;
516 texture = texture2d;
517 }
518 }
519 break;
520
521 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
522 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
523 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
524 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
525 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
526 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
527 {
528 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
529 if (textureCube)
530 {
531 textureFormat = gl::ExtractFormat(textureCube->getInternalFormat(target, level));
532 textureCompressed = textureCube->isCompressed(target, level);
533 textureLevelWidth = textureCube->getWidth(target, level);
534 textureLevelHeight = textureCube->getHeight(target, level);
535 textureLevelDepth = 1;
536 texture = textureCube;
537 }
538 }
539 break;
540
541 case GL_TEXTURE_3D:
542 {
543 gl::Texture3D *texture3d = context->getTexture3D();
544 if (texture3d)
545 {
546 textureFormat = gl::ExtractFormat(texture3d->getInternalFormat(level));
547 textureCompressed = texture3d->isCompressed(level);
548 textureLevelWidth = texture3d->getWidth(level);
549 textureLevelHeight = texture3d->getHeight(level);
550 textureLevelDepth = texture3d->getDepth(level);
551 texture = texture3d;
552 }
553 }
554 break;
555
556 default:
557 return gl::error(GL_INVALID_ENUM, false);
558 }
559
560 if (!texture)
561 {
562 return gl::error(GL_INVALID_OPERATION, false);
563 }
564
565 if (isCompressed != textureCompressed)
566 {
567 return gl::error(GL_INVALID_OPERATION, false);
568 }
569
570 if (isCompressed)
571 {
572 if ((width % 4 != 0 && width != textureLevelWidth) ||
573 (height % 4 != 0 && height != textureLevelHeight))
574 {
575 return gl::error(GL_INVALID_OPERATION, false);
576 }
577 }
578
579 if (xoffset + width > textureLevelWidth ||
580 yoffset + height > textureLevelHeight ||
581 zoffset >= textureLevelDepth)
582 {
583 return gl::error(GL_INVALID_VALUE, false);
584 }
585
586 if (!gl::IsValidES3CopyTexImageCombination(textureFormat, colorbufferFormat))
587 {
588 return gl::error(GL_INVALID_OPERATION, false);
589 }
590
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +0000591 return true;
592}
593
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000594// check for combinations of format and type that are valid for ReadPixels
595bool validReadFormatType(GLenum format, GLenum type)
596{
597 switch (format)
598 {
599 case GL_RGBA:
600 switch (type)
601 {
602 case GL_UNSIGNED_BYTE:
603 break;
604 default:
605 return false;
606 }
607 break;
608 case GL_BGRA_EXT:
609 switch (type)
610 {
611 case GL_UNSIGNED_BYTE:
612 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
613 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
614 break;
615 default:
616 return false;
617 }
618 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000619 default:
620 return false;
621 }
622 return true;
623}
624
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625extern "C"
626{
627
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +0000628// OpenGL ES 2.0 functions
629
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000630void __stdcall glActiveTexture(GLenum texture)
631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000632 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000633
634 try
635 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000637
638 if (context)
639 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000640 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000643 }
644
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000645 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 }
647 }
648 catch(std::bad_alloc&)
649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000651 }
652}
653
654void __stdcall glAttachShader(GLuint program, GLuint shader)
655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000656 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000657
658 try
659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000661
662 if (context)
663 {
664 gl::Program *programObject = context->getProgram(program);
665 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000666
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000667 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000669 if (context->getShader(program))
670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000671 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000672 }
673 else
674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000675 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000676 }
677 }
678
679 if (!shaderObject)
680 {
681 if (context->getProgram(shader))
682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000683 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000684 }
685 else
686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000687 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000688 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000689 }
690
691 if (!programObject->attachShader(shaderObject))
692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000693 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000694 }
695 }
696 }
697 catch(std::bad_alloc&)
698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000700 }
701}
702
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000703void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
704{
705 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
706
707 try
708 {
709 switch (target)
710 {
711 case GL_ANY_SAMPLES_PASSED_EXT:
712 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
713 break;
714 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000715 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000716 }
717
718 if (id == 0)
719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000721 }
722
723 gl::Context *context = gl::getNonLostContext();
724
725 if (context)
726 {
727 context->beginQuery(target, id);
728 }
729 }
730 catch(std::bad_alloc&)
731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000732 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000733 }
734}
735
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000736void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000738 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739
740 try
741 {
742 if (index >= gl::MAX_VERTEX_ATTRIBS)
743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000744 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000745 }
746
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000747 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748
749 if (context)
750 {
751 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000752
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 if (!programObject)
754 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000755 if (context->getShader(program))
756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000757 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000758 }
759 else
760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000761 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000762 }
763 }
764
765 if (strncmp(name, "gl_", 3) == 0)
766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000767 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000768 }
769
770 programObject->bindAttributeLocation(index, name);
771 }
772 }
773 catch(std::bad_alloc&)
774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000776 }
777}
778
779void __stdcall glBindBuffer(GLenum target, GLuint buffer)
780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000781 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000782
783 try
784 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000785 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786
787 if (context)
788 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000789 // Check ES3 specific targets
790 switch (target)
791 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000792 case GL_COPY_READ_BUFFER:
793 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000794 case GL_PIXEL_PACK_BUFFER:
795 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000796 case GL_UNIFORM_BUFFER:
797 case GL_TRANSFORM_FEEDBACK_BUFFER:
798 if (context->getClientVersion() < 3)
799 {
800 return gl::error(GL_INVALID_ENUM);
801 }
802 }
803
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000804 switch (target)
805 {
806 case GL_ARRAY_BUFFER:
807 context->bindArrayBuffer(buffer);
808 return;
809 case GL_ELEMENT_ARRAY_BUFFER:
810 context->bindElementArrayBuffer(buffer);
811 return;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +0000812 case GL_COPY_READ_BUFFER:
813 context->bindCopyReadBuffer(buffer);
814 return;
815 case GL_COPY_WRITE_BUFFER:
816 context->bindCopyWriteBuffer(buffer);
817 return;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +0000818 case GL_PIXEL_PACK_BUFFER:
819 context->bindPixelPackBuffer(buffer);
820 return;
821 case GL_PIXEL_UNPACK_BUFFER:
822 context->bindPixelUnpackBuffer(buffer);
823 return;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000824 case GL_UNIFORM_BUFFER:
825 context->bindGenericUniformBuffer(buffer);
826 return;
827 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org7a1ebad2013-05-30 00:05:20 +0000828 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +0000829 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000832 }
833 }
834 }
835 catch(std::bad_alloc&)
836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000837 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000838 }
839}
840
841void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
842{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000843 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000844
845 try
846 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000847 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000849 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000850 }
851
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000852 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000853
854 if (context)
855 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000856 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
857 {
858 context->bindReadFramebuffer(framebuffer);
859 }
860
861 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
862 {
863 context->bindDrawFramebuffer(framebuffer);
864 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000865 }
866 }
867 catch(std::bad_alloc&)
868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000870 }
871}
872
873void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000875 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876
877 try
878 {
879 if (target != GL_RENDERBUFFER)
880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000881 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000882 }
883
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000884 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000885
886 if (context)
887 {
888 context->bindRenderbuffer(renderbuffer);
889 }
890 }
891 catch(std::bad_alloc&)
892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000893 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000894 }
895}
896
897void __stdcall glBindTexture(GLenum target, GLuint texture)
898{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000899 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900
901 try
902 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000903 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000904
905 if (context)
906 {
907 gl::Texture *textureObject = context->getTexture(texture);
908
909 if (textureObject && textureObject->getTarget() != target && texture != 0)
910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000911 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000912 }
913
914 switch (target)
915 {
916 case GL_TEXTURE_2D:
917 context->bindTexture2D(texture);
918 return;
919 case GL_TEXTURE_CUBE_MAP:
920 context->bindTextureCubeMap(texture);
921 return;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +0000922 case GL_TEXTURE_3D:
923 if (context->getClientVersion() < 3)
924 {
925 return gl::error(GL_INVALID_ENUM);
926 }
927 context->bindTexture3D(texture);
928 return;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +0000929 case GL_TEXTURE_2D_ARRAY:
930 if (context->getClientVersion() < 3)
931 {
932 return gl::error(GL_INVALID_ENUM);
933 }
934 context->bindTexture2DArray(texture);
935 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000936 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000937 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000938 }
939 }
940 }
941 catch(std::bad_alloc&)
942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000944 }
945}
946
947void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000949 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000950 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000951
952 try
953 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000954 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000955
956 if (context)
957 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000958 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959 }
960 }
961 catch(std::bad_alloc&)
962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964 }
965}
966
967void __stdcall glBlendEquation(GLenum mode)
968{
969 glBlendEquationSeparate(mode, mode);
970}
971
972void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
973{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000974 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000975
976 try
977 {
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000978 gl::Context *context = gl::getNonLostContext();
979
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980 switch (modeRGB)
981 {
982 case GL_FUNC_ADD:
983 case GL_FUNC_SUBTRACT:
984 case GL_FUNC_REVERSE_SUBTRACT:
985 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +0000986
987 case GL_MIN:
988 case GL_MAX:
989 if (context && context->getClientVersion() < 3)
990 {
991 return gl::error(GL_INVALID_ENUM);
992 }
993 break;
994
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000995 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000996 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000997 }
998
999 switch (modeAlpha)
1000 {
1001 case GL_FUNC_ADD:
1002 case GL_FUNC_SUBTRACT:
1003 case GL_FUNC_REVERSE_SUBTRACT:
1004 break;
shannon.woods%transgaming.com@gtempaccount.com00b6a0e2013-04-13 03:38:00 +00001005
1006 case GL_MIN:
1007 case GL_MAX:
1008 if (context && context->getClientVersion() < 3)
1009 {
1010 return gl::error(GL_INVALID_ENUM);
1011 }
1012 break;
1013
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001014 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001016 }
1017
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001018 if (context)
1019 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001020 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001021 }
1022 }
1023 catch(std::bad_alloc&)
1024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001025 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001026 }
1027}
1028
1029void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
1030{
1031 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
1032}
1033
1034void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
1035{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001036 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001037 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001038
1039 try
1040 {
1041 switch (srcRGB)
1042 {
1043 case GL_ZERO:
1044 case GL_ONE:
1045 case GL_SRC_COLOR:
1046 case GL_ONE_MINUS_SRC_COLOR:
1047 case GL_DST_COLOR:
1048 case GL_ONE_MINUS_DST_COLOR:
1049 case GL_SRC_ALPHA:
1050 case GL_ONE_MINUS_SRC_ALPHA:
1051 case GL_DST_ALPHA:
1052 case GL_ONE_MINUS_DST_ALPHA:
1053 case GL_CONSTANT_COLOR:
1054 case GL_ONE_MINUS_CONSTANT_COLOR:
1055 case GL_CONSTANT_ALPHA:
1056 case GL_ONE_MINUS_CONSTANT_ALPHA:
1057 case GL_SRC_ALPHA_SATURATE:
1058 break;
1059 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001060 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001061 }
1062
1063 switch (dstRGB)
1064 {
1065 case GL_ZERO:
1066 case GL_ONE:
1067 case GL_SRC_COLOR:
1068 case GL_ONE_MINUS_SRC_COLOR:
1069 case GL_DST_COLOR:
1070 case GL_ONE_MINUS_DST_COLOR:
1071 case GL_SRC_ALPHA:
1072 case GL_ONE_MINUS_SRC_ALPHA:
1073 case GL_DST_ALPHA:
1074 case GL_ONE_MINUS_DST_ALPHA:
1075 case GL_CONSTANT_COLOR:
1076 case GL_ONE_MINUS_CONSTANT_COLOR:
1077 case GL_CONSTANT_ALPHA:
1078 case GL_ONE_MINUS_CONSTANT_ALPHA:
1079 break;
1080 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001081 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001082 }
1083
1084 switch (srcAlpha)
1085 {
1086 case GL_ZERO:
1087 case GL_ONE:
1088 case GL_SRC_COLOR:
1089 case GL_ONE_MINUS_SRC_COLOR:
1090 case GL_DST_COLOR:
1091 case GL_ONE_MINUS_DST_COLOR:
1092 case GL_SRC_ALPHA:
1093 case GL_ONE_MINUS_SRC_ALPHA:
1094 case GL_DST_ALPHA:
1095 case GL_ONE_MINUS_DST_ALPHA:
1096 case GL_CONSTANT_COLOR:
1097 case GL_ONE_MINUS_CONSTANT_COLOR:
1098 case GL_CONSTANT_ALPHA:
1099 case GL_ONE_MINUS_CONSTANT_ALPHA:
1100 case GL_SRC_ALPHA_SATURATE:
1101 break;
1102 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001103 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001104 }
1105
1106 switch (dstAlpha)
1107 {
1108 case GL_ZERO:
1109 case GL_ONE:
1110 case GL_SRC_COLOR:
1111 case GL_ONE_MINUS_SRC_COLOR:
1112 case GL_DST_COLOR:
1113 case GL_ONE_MINUS_DST_COLOR:
1114 case GL_SRC_ALPHA:
1115 case GL_ONE_MINUS_SRC_ALPHA:
1116 case GL_DST_ALPHA:
1117 case GL_ONE_MINUS_DST_ALPHA:
1118 case GL_CONSTANT_COLOR:
1119 case GL_ONE_MINUS_CONSTANT_COLOR:
1120 case GL_CONSTANT_ALPHA:
1121 case GL_ONE_MINUS_CONSTANT_ALPHA:
1122 break;
1123 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001125 }
1126
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001127 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
1128 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
1129
1130 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
1131 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
1132
1133 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001134 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +00001135 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001136 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001137 }
1138
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001140
1141 if (context)
1142 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001143 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144 }
1145 }
1146 catch(std::bad_alloc&)
1147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001148 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001149 }
1150}
1151
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001152void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001154 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001155 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001156
1157 try
1158 {
1159 if (size < 0)
1160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001161 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001162 }
1163
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001164 gl::Context *context = gl::getNonLostContext();
1165
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166 switch (usage)
1167 {
1168 case GL_STREAM_DRAW:
1169 case GL_STATIC_DRAW:
1170 case GL_DYNAMIC_DRAW:
1171 break;
shannon.woods%transgaming.com@gtempaccount.comf2db40b2013-04-13 03:37:09 +00001172
1173 case GL_STREAM_READ:
1174 case GL_STREAM_COPY:
1175 case GL_STATIC_READ:
1176 case GL_STATIC_COPY:
1177 case GL_DYNAMIC_READ:
1178 case GL_DYNAMIC_COPY:
1179 if (context && context->getClientVersion() < 3)
1180 {
1181 return gl::error(GL_INVALID_ENUM);
1182 }
1183 break;
1184
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001185 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001186 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001187 }
1188
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001189 if (context)
1190 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001191 // Check ES3 specific targets
1192 switch (target)
1193 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001194 case GL_COPY_READ_BUFFER:
1195 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001196 case GL_PIXEL_PACK_BUFFER:
1197 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001198 case GL_UNIFORM_BUFFER:
1199 case GL_TRANSFORM_FEEDBACK_BUFFER:
1200 if (context->getClientVersion() < 3)
1201 {
1202 return gl::error(GL_INVALID_ENUM);
1203 }
1204 }
1205
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001206 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001207
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001208 switch (target)
1209 {
1210 case GL_ARRAY_BUFFER:
1211 buffer = context->getArrayBuffer();
1212 break;
1213 case GL_ELEMENT_ARRAY_BUFFER:
1214 buffer = context->getElementArrayBuffer();
1215 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001216 case GL_COPY_READ_BUFFER:
1217 buffer = context->getCopyReadBuffer();
1218 break;
1219 case GL_COPY_WRITE_BUFFER:
1220 buffer = context->getCopyWriteBuffer();
1221 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001222 case GL_PIXEL_PACK_BUFFER:
1223 buffer = context->getPixelPackBuffer();
1224 break;
1225 case GL_PIXEL_UNPACK_BUFFER:
1226 buffer = context->getPixelUnpackBuffer();
1227 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001228 case GL_TRANSFORM_FEEDBACK_BUFFER:
1229 buffer = context->getGenericTransformFeedbackBuffer();
1230 break;
1231 case GL_UNIFORM_BUFFER:
1232 buffer = context->getGenericUniformBuffer();
1233 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001234 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001235 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001236 }
1237
1238 if (!buffer)
1239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001240 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001241 }
1242
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001243 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001244 }
1245 }
1246 catch(std::bad_alloc&)
1247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001249 }
1250}
1251
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001252void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001254 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001255 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001256
1257 try
1258 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001259 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001261 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001262 }
1263
daniel@transgaming.comd4620a32010-03-21 04:31:28 +00001264 if (data == NULL)
1265 {
1266 return;
1267 }
1268
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001270
1271 if (context)
1272 {
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001273 // Check ES3 specific targets
1274 switch (target)
1275 {
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001276 case GL_COPY_READ_BUFFER:
1277 case GL_COPY_WRITE_BUFFER:
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001278 case GL_PIXEL_PACK_BUFFER:
1279 case GL_PIXEL_UNPACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001280 case GL_UNIFORM_BUFFER:
1281 case GL_TRANSFORM_FEEDBACK_BUFFER:
1282 if (context->getClientVersion() < 3)
1283 {
1284 return gl::error(GL_INVALID_ENUM);
1285 }
1286 }
1287
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001288 gl::Buffer *buffer;
1289
1290 switch (target)
1291 {
1292 case GL_ARRAY_BUFFER:
1293 buffer = context->getArrayBuffer();
1294 break;
1295 case GL_ELEMENT_ARRAY_BUFFER:
1296 buffer = context->getElementArrayBuffer();
1297 break;
shannon.woods%transgaming.com@gtempaccount.com51171882013-04-13 03:39:10 +00001298 case GL_COPY_READ_BUFFER:
1299 buffer = context->getCopyReadBuffer();
1300 break;
1301 case GL_COPY_WRITE_BUFFER:
1302 buffer = context->getCopyWriteBuffer();
1303 break;
shannon.woods%transgaming.com@gtempaccount.comc926e5f2013-04-13 03:39:18 +00001304 case GL_PIXEL_PACK_BUFFER:
1305 buffer = context->getPixelPackBuffer();
1306 break;
1307 case GL_PIXEL_UNPACK_BUFFER:
1308 buffer = context->getPixelUnpackBuffer();
1309 break;
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00001310 case GL_TRANSFORM_FEEDBACK_BUFFER:
1311 buffer = context->getGenericTransformFeedbackBuffer();
1312 break;
1313 case GL_UNIFORM_BUFFER:
1314 buffer = context->getGenericUniformBuffer();
1315 break;
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001316 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001317 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001318 }
1319
1320 if (!buffer)
1321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001322 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001323 }
1324
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001325 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001327 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001328 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +00001329
1330 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 }
1333 catch(std::bad_alloc&)
1334 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001335 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001336 }
1337}
1338
1339GLenum __stdcall glCheckFramebufferStatus(GLenum target)
1340{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001341 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342
1343 try
1344 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001345 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001347 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001348 }
1349
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001351
1352 if (context)
1353 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001354 gl::Framebuffer *framebuffer = NULL;
1355 if (target == GL_READ_FRAMEBUFFER_ANGLE)
1356 {
1357 framebuffer = context->getReadFramebuffer();
1358 }
1359 else
1360 {
1361 framebuffer = context->getDrawFramebuffer();
1362 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001363
1364 return framebuffer->completeness();
1365 }
1366 }
1367 catch(std::bad_alloc&)
1368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001369 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001370 }
1371
1372 return 0;
1373}
1374
1375void __stdcall glClear(GLbitfield mask)
1376{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001377 EVENT("(GLbitfield mask = 0x%X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001378
1379 try
1380 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001382
1383 if (context)
1384 {
1385 context->clear(mask);
1386 }
1387 }
1388 catch(std::bad_alloc&)
1389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001390 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001391 }
1392}
1393
1394void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001396 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001397 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001398
1399 try
1400 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001401 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001402
1403 if (context)
1404 {
1405 context->setClearColor(red, green, blue, alpha);
1406 }
1407 }
1408 catch(std::bad_alloc&)
1409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001410 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001411 }
1412}
1413
1414void __stdcall glClearDepthf(GLclampf depth)
1415{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001416 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001417
1418 try
1419 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001420 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001421
1422 if (context)
1423 {
1424 context->setClearDepth(depth);
1425 }
1426 }
1427 catch(std::bad_alloc&)
1428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430 }
1431}
1432
1433void __stdcall glClearStencil(GLint s)
1434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001435 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001436
1437 try
1438 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001440
1441 if (context)
1442 {
1443 context->setClearStencil(s);
1444 }
1445 }
1446 catch(std::bad_alloc&)
1447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 }
1450}
1451
1452void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
1453{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00001454 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001455 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456
1457 try
1458 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001459 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001460
1461 if (context)
1462 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00001463 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465 }
1466 catch(std::bad_alloc&)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469 }
1470}
1471
1472void __stdcall glCompileShader(GLuint shader)
1473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001474 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001475
1476 try
1477 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001478 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001479
1480 if (context)
1481 {
1482 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001484 if (!shaderObject)
1485 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001486 if (context->getProgram(shader))
1487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001488 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001489 }
1490 else
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +00001493 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001494 }
1495
1496 shaderObject->compile();
1497 }
1498 }
1499 catch(std::bad_alloc&)
1500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001501 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001502 }
1503}
1504
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001505void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1506 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001508 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001509 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001510 target, level, internalformat, width, height, border, imageSize, data);
1511
1512 try
1513 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001514 if (!validImageSize(level, width, height, 1) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001516 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001517 }
1518
daniel@transgaming.com01868132010-08-24 19:21:17 +00001519 switch (internalformat)
1520 {
1521 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1522 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001523 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1524 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001525 break;
1526 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001527 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001528 }
1529
1530 if (border != 0)
1531 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001532 return gl::error(GL_INVALID_OPERATION);
1533 }
1534
1535 if (width != 1 && width != 2 && width % 4 != 0)
1536 {
1537 return gl::error(GL_INVALID_OPERATION);
1538 }
1539
1540 if (height != 1 && height != 2 && height % 4 != 0)
1541 {
1542 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001543 }
1544
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001545 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001546
1547 if (context)
1548 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001549 if (level > context->getMaximumTextureLevel())
1550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001552 }
1553
1554 switch (target)
1555 {
1556 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001557 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1558 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001561 }
1562 break;
1563 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1564 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1565 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1566 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1567 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1568 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1569 if (width != height)
1570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001571 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001572 }
1573
1574 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1575 height > (context->getMaximumCubeTextureDimension() >> level))
1576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001577 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001578 }
1579 break;
1580 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001581 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001582 }
1583
gman@chromium.org50c526d2011-08-10 05:19:44 +00001584 switch (internalformat) {
1585 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1586 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1587 if (!context->supportsDXT1Textures())
1588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001589 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001590 }
1591 break;
1592 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1593 if (!context->supportsDXT3Textures())
1594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001596 }
1597 break;
1598 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1599 if (!context->supportsDXT5Textures())
1600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001601 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001602 }
1603 break;
1604 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001605 }
1606
1607 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001610 }
1611
1612 if (target == GL_TEXTURE_2D)
1613 {
1614 gl::Texture2D *texture = context->getTexture2D();
1615
1616 if (!texture)
1617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001618 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001619 }
1620
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001621 if (texture->isImmutable())
1622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001624 }
1625
daniel@transgaming.com01868132010-08-24 19:21:17 +00001626 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1627 }
1628 else
1629 {
1630 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1631
1632 if (!texture)
1633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001634 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001635 }
1636
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001637 if (texture->isImmutable())
1638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001639 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001640 }
1641
daniel@transgaming.com01868132010-08-24 19:21:17 +00001642 switch (target)
1643 {
1644 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1645 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1646 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1647 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1648 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1649 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1650 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1651 break;
1652 default: UNREACHABLE();
1653 }
1654 }
1655 }
1656
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657 }
1658 catch(std::bad_alloc&)
1659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001660 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001661 }
1662}
1663
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001664void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1665 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001667 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001668 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001669 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001670 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1671
1672 try
1673 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001674 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001676 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001677 }
1678
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001679 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height, 1) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001682 }
1683
daniel@transgaming.com01868132010-08-24 19:21:17 +00001684 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001685 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001686 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1687 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001688 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1689 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001690 break;
1691 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001692 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001693 }
1694
daniel@transgaming.com01868132010-08-24 19:21:17 +00001695 if (width == 0 || height == 0 || data == NULL)
1696 {
1697 return;
1698 }
1699
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001700 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001701
1702 if (context)
1703 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001704 if (level > context->getMaximumTextureLevel())
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001707 }
1708
gman@chromium.org50c526d2011-08-10 05:19:44 +00001709 switch (format) {
1710 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1711 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1712 if (!context->supportsDXT1Textures())
1713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001714 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001715 }
1716 break;
1717 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1718 if (!context->supportsDXT3Textures())
1719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001720 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001721 }
1722 break;
1723 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1724 if (!context->supportsDXT5Textures())
1725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001726 return gl::error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
gman@chromium.org50c526d2011-08-10 05:19:44 +00001727 }
1728 break;
1729 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001730 }
1731
1732 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001735 }
1736
1737 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001739 return gl::error(GL_INVALID_OPERATION); // we wait to check the offsets until this point, because the multiple-of-four restriction
gman@chromium.org50c526d2011-08-10 05:19:44 +00001740 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001741 }
1742
1743 if (target == GL_TEXTURE_2D)
1744 {
1745 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001746 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001747 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001748 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001749 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001750 }
1751 else if (gl::IsCubemapTextureTarget(target))
1752 {
1753 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001754 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001755 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001756 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001757 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001758 }
1759 else
1760 {
1761 UNREACHABLE();
1762 }
1763 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001764 }
1765 catch(std::bad_alloc&)
1766 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001767 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001768 }
1769}
1770
1771void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1772{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001773 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001774 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001775 target, level, internalformat, x, y, width, height, border);
1776
1777 try
1778 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00001779 if (!validImageSize(level, width, height, 1))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001782 }
1783
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001784 if (border != 0)
1785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001787 }
1788
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001790
1791 if (context)
1792 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001793 if (level > context->getMaximumTextureLevel())
1794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001795 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001796 }
1797
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001798 switch (target)
1799 {
1800 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00001801 if (width > (context->getMaximum2DTextureDimension() >> level) ||
1802 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001804 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001805 }
1806 break;
1807 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1808 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1809 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1810 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1811 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1812 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1813 if (width != height)
1814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001816 }
1817
1818 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1819 height > (context->getMaximumCubeTextureDimension() >> level))
1820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001822 }
1823 break;
1824 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001825 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001826 }
1827
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001828 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001829
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001830 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001832 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001833 }
1834
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001835 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001837 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001838 }
1839
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001840 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001841 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001842
1843 // [OpenGL ES 2.0.24] table 3.9
1844 switch (internalformat)
1845 {
1846 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001847 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001848 colorbufferFormat != GL_RGBA4 &&
1849 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001850 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001851 colorbufferFormat != GL_RGBA8_OES)
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001854 }
1855 break;
1856 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001857 case GL_RGB:
1858 if (colorbufferFormat != GL_RGB565 &&
1859 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001860 colorbufferFormat != GL_RGBA4 &&
1861 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001862 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001863 colorbufferFormat != GL_RGBA8_OES)
1864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001865 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001866 }
1867 break;
1868 case GL_LUMINANCE_ALPHA:
1869 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001870 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001871 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001872 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001873 colorbufferFormat != GL_RGBA8_OES)
1874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001875 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001876 }
1877 break;
1878 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1879 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001880 if (context->supportsDXT1Textures())
1881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001882 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001883 }
1884 else
1885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001886 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001887 }
1888 break;
1889 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1890 if (context->supportsDXT3Textures())
1891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001892 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001893 }
1894 else
1895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001896 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001897 }
1898 break;
1899 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1900 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001902 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001903 }
1904 else
1905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001906 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001907 }
1908 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001909 case GL_DEPTH_COMPONENT:
1910 case GL_DEPTH_COMPONENT16:
1911 case GL_DEPTH_COMPONENT32_OES:
1912 case GL_DEPTH_STENCIL_OES:
1913 case GL_DEPTH24_STENCIL8_OES:
1914 if (context->supportsDepthTextures())
1915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001916 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001917 }
1918 else
1919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001921 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001922 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001923 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001924 }
1925
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001926 if (target == GL_TEXTURE_2D)
1927 {
1928 gl::Texture2D *texture = context->getTexture2D();
1929
1930 if (!texture)
1931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001932 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001933 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001934
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001935 if (texture->isImmutable())
1936 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001937 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001938 }
1939
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001940 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001941 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001942 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001943 {
1944 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1945
1946 if (!texture)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001949 }
1950
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001951 if (texture->isImmutable())
1952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001953 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001954 }
1955
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001956 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001957 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001958 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961 catch(std::bad_alloc&)
1962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001963 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001964 }
1965}
1966
1967void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1968{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001969 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001970 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 target, level, xoffset, yoffset, x, y, width, height);
1972
1973 try
1974 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001975 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001977 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001978 }
1979
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001980 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001983 }
1984
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001985 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001988 }
1989
1990 if (width == 0 || height == 0)
1991 {
1992 return;
1993 }
1994
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001996
1997 if (context)
1998 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001999 if (level > context->getMaximumTextureLevel())
2000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00002002 }
2003
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002004 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002005
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002006 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00002009 }
2010
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002011 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002013 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00002014 }
2015
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002016 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00002017 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002018 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002019 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002020
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002021 if (target == GL_TEXTURE_2D)
2022 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002023 gl::Texture2D *tex2d = context->getTexture2D();
2024
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002025 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002026 {
2027 return; // error already registered by validateSubImageParams
2028 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002029 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002030 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002031 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002032 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002033 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002034 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2035
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002036 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002037 {
2038 return; // error already registered by validateSubImageParams
2039 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002040 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00002041 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002042 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002043 else UNREACHABLE();
2044
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002045 // [OpenGL ES 2.0.24] table 3.9
2046 switch (textureFormat)
2047 {
2048 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002049 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002050 colorbufferFormat != GL_RGBA4 &&
2051 colorbufferFormat != GL_RGB5_A1 &&
2052 colorbufferFormat != GL_RGBA8_OES)
2053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002054 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002055 }
2056 break;
2057 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002058 case GL_RGB:
2059 if (colorbufferFormat != GL_RGB565 &&
2060 colorbufferFormat != GL_RGB8_OES &&
2061 colorbufferFormat != GL_RGBA4 &&
2062 colorbufferFormat != GL_RGB5_A1 &&
2063 colorbufferFormat != GL_RGBA8_OES)
2064 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002065 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002066 }
2067 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002068 case GL_LUMINANCE_ALPHA:
2069 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00002070 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002071 colorbufferFormat != GL_RGB5_A1 &&
2072 colorbufferFormat != GL_RGBA8_OES)
2073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002074 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002075 }
2076 break;
2077 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
2078 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00002079 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
2080 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002081 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002082 case GL_DEPTH_COMPONENT:
2083 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002084 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002085 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002086 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00002087 }
2088
shannon.woods%transgaming.com@gtempaccount.com95996562013-04-13 03:44:58 +00002089 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002090 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00002092
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002093 catch(std::bad_alloc&)
2094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097}
2098
2099GLuint __stdcall glCreateProgram(void)
2100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002101 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002102
2103 try
2104 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002105 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002106
2107 if (context)
2108 {
2109 return context->createProgram();
2110 }
2111 }
2112 catch(std::bad_alloc&)
2113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002114 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115 }
2116
2117 return 0;
2118}
2119
2120GLuint __stdcall glCreateShader(GLenum type)
2121{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002122 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002123
2124 try
2125 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002126 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002127
2128 if (context)
2129 {
2130 switch (type)
2131 {
2132 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002133 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002134 return context->createShader(type);
2135 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002136 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002137 }
2138 }
2139 }
2140 catch(std::bad_alloc&)
2141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002142 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002143 }
2144
2145 return 0;
2146}
2147
2148void __stdcall glCullFace(GLenum mode)
2149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002150 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002151
2152 try
2153 {
2154 switch (mode)
2155 {
2156 case GL_FRONT:
2157 case GL_BACK:
2158 case GL_FRONT_AND_BACK:
2159 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002160 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002161
2162 if (context)
2163 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002164 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165 }
2166 }
2167 break;
2168 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002169 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002170 }
2171 }
2172 catch(std::bad_alloc&)
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002175 }
2176}
2177
2178void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
2179{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002180 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002181
2182 try
2183 {
2184 if (n < 0)
2185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002186 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002187 }
2188
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002189 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002190
2191 if (context)
2192 {
2193 for (int i = 0; i < n; i++)
2194 {
2195 context->deleteBuffer(buffers[i]);
2196 }
2197 }
2198 }
2199 catch(std::bad_alloc&)
2200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002202 }
2203}
2204
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002205void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
2206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002207 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002208
2209 try
2210 {
2211 if (n < 0)
2212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002213 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002214 }
2215
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002216 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002217
2218 if (context)
2219 {
2220 for (int i = 0; i < n; i++)
2221 {
2222 context->deleteFence(fences[i]);
2223 }
2224 }
2225 }
2226 catch(std::bad_alloc&)
2227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002228 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002229 }
2230}
2231
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
2233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002234 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002235
2236 try
2237 {
2238 if (n < 0)
2239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002240 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002241 }
2242
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002243 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002244
2245 if (context)
2246 {
2247 for (int i = 0; i < n; i++)
2248 {
2249 if (framebuffers[i] != 0)
2250 {
2251 context->deleteFramebuffer(framebuffers[i]);
2252 }
2253 }
2254 }
2255 }
2256 catch(std::bad_alloc&)
2257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 }
2260}
2261
2262void __stdcall glDeleteProgram(GLuint program)
2263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002264 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265
2266 try
2267 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002268 if (program == 0)
2269 {
2270 return;
2271 }
2272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002274
2275 if (context)
2276 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002277 if (!context->getProgram(program))
2278 {
2279 if(context->getShader(program))
2280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002281 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002282 }
2283 else
2284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002286 }
2287 }
2288
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002289 context->deleteProgram(program);
2290 }
2291 }
2292 catch(std::bad_alloc&)
2293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002294 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002295 }
2296}
2297
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002298void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
2299{
2300 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
2301
2302 try
2303 {
2304 if (n < 0)
2305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002307 }
2308
2309 gl::Context *context = gl::getNonLostContext();
2310
2311 if (context)
2312 {
2313 for (int i = 0; i < n; i++)
2314 {
2315 context->deleteQuery(ids[i]);
2316 }
2317 }
2318 }
2319 catch(std::bad_alloc&)
2320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002321 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002322 }
2323}
2324
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
2326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002327 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328
2329 try
2330 {
2331 if (n < 0)
2332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002333 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334 }
2335
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002336 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002337
2338 if (context)
2339 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00002340 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002341 {
2342 context->deleteRenderbuffer(renderbuffers[i]);
2343 }
2344 }
2345 }
2346 catch(std::bad_alloc&)
2347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002348 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002349 }
2350}
2351
2352void __stdcall glDeleteShader(GLuint shader)
2353{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002354 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002355
2356 try
2357 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002358 if (shader == 0)
2359 {
2360 return;
2361 }
2362
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002363 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002364
2365 if (context)
2366 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002367 if (!context->getShader(shader))
2368 {
2369 if(context->getProgram(shader))
2370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002371 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002372 }
2373 else
2374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00002376 }
2377 }
2378
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379 context->deleteShader(shader);
2380 }
2381 }
2382 catch(std::bad_alloc&)
2383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385 }
2386}
2387
2388void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
2389{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002390 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391
2392 try
2393 {
2394 if (n < 0)
2395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002396 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002397 }
2398
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002399 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002400
2401 if (context)
2402 {
2403 for (int i = 0; i < n; i++)
2404 {
2405 if (textures[i] != 0)
2406 {
2407 context->deleteTexture(textures[i]);
2408 }
2409 }
2410 }
2411 }
2412 catch(std::bad_alloc&)
2413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002414 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415 }
2416}
2417
2418void __stdcall glDepthFunc(GLenum func)
2419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002420 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421
2422 try
2423 {
2424 switch (func)
2425 {
2426 case GL_NEVER:
2427 case GL_ALWAYS:
2428 case GL_LESS:
2429 case GL_LEQUAL:
2430 case GL_EQUAL:
2431 case GL_GREATER:
2432 case GL_GEQUAL:
2433 case GL_NOTEQUAL:
2434 break;
2435 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002436 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002437 }
2438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440
2441 if (context)
2442 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002443 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 }
2445 }
2446 catch(std::bad_alloc&)
2447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 }
2450}
2451
2452void __stdcall glDepthMask(GLboolean flag)
2453{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00002454 EVENT("(GLboolean flag = %u)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002455
2456 try
2457 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002458 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002459
2460 if (context)
2461 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002462 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002463 }
2464 }
2465 catch(std::bad_alloc&)
2466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 }
2469}
2470
2471void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
2472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002473 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474
2475 try
2476 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002477 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478
2479 if (context)
2480 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002481 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 }
2483 }
2484 catch(std::bad_alloc&)
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 }
2488}
2489
2490void __stdcall glDetachShader(GLuint program, GLuint shader)
2491{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002492 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002493
2494 try
2495 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002496 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497
2498 if (context)
2499 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002500
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002501 gl::Program *programObject = context->getProgram(program);
2502 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002503
2504 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002506 gl::Shader *shaderByProgramHandle;
2507 shaderByProgramHandle = context->getShader(program);
2508 if (!shaderByProgramHandle)
2509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002510 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002511 }
2512 else
2513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002515 }
2516 }
2517
2518 if (!shaderObject)
2519 {
2520 gl::Program *programByShaderHandle = context->getProgram(shader);
2521 if (!programByShaderHandle)
2522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002523 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002524 }
2525 else
2526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002527 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002528 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530
2531 if (!programObject->detachShader(shaderObject))
2532 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002533 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002534 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 }
2536 }
2537 catch(std::bad_alloc&)
2538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002539 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002540 }
2541}
2542
2543void __stdcall glDisable(GLenum cap)
2544{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002545 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002546
2547 try
2548 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002549 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550
2551 if (context)
2552 {
2553 switch (cap)
2554 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002555 case GL_CULL_FACE: context->setCullFace(false); break;
2556 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2557 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2558 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2559 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2560 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2561 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2562 case GL_BLEND: context->setBlend(false); break;
2563 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002565 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 }
2567 }
2568 }
2569 catch(std::bad_alloc&)
2570 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002571 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002572 }
2573}
2574
2575void __stdcall glDisableVertexAttribArray(GLuint index)
2576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002577 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002578
2579 try
2580 {
2581 if (index >= gl::MAX_VERTEX_ATTRIBS)
2582 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002583 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002584 }
2585
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002587
2588 if (context)
2589 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002590 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591 }
2592 }
2593 catch(std::bad_alloc&)
2594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002596 }
2597}
2598
2599void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002601 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602
2603 try
2604 {
2605 if (count < 0 || first < 0)
2606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002608 }
2609
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002611
2612 if (context)
2613 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002614 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615 }
2616 }
2617 catch(std::bad_alloc&)
2618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620 }
2621}
2622
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002623void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2624{
2625 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2626
2627 try
2628 {
2629 if (count < 0 || first < 0 || primcount < 0)
2630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002631 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002632 }
2633
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002634 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002635 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002636 gl::Context *context = gl::getNonLostContext();
2637
2638 if (context)
2639 {
2640 context->drawArrays(mode, first, count, primcount);
2641 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002642 }
2643 }
2644 catch(std::bad_alloc&)
2645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002646 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002647 }
2648}
2649
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002650void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002652 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002653 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002654
2655 try
2656 {
2657 if (count < 0)
2658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002659 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002660 }
2661
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002662 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002663
2664 if (context)
2665 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002666 switch (type)
2667 {
2668 case GL_UNSIGNED_BYTE:
2669 case GL_UNSIGNED_SHORT:
2670 break;
2671 case GL_UNSIGNED_INT:
2672 if (!context->supports32bitIndices())
2673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002675 }
2676 break;
2677 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002678 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002679 }
2680
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002681 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682 }
2683 }
2684 catch(std::bad_alloc&)
2685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002687 }
2688}
2689
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002690void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2691{
2692 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2693 mode, count, type, indices, primcount);
2694
2695 try
2696 {
2697 if (count < 0 || primcount < 0)
2698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002699 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002700 }
2701
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002702 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002703 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002704 gl::Context *context = gl::getNonLostContext();
2705
2706 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002707 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002708 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002709 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002710 case GL_UNSIGNED_BYTE:
2711 case GL_UNSIGNED_SHORT:
2712 break;
2713 case GL_UNSIGNED_INT:
2714 if (!context->supports32bitIndices())
2715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002717 }
2718 break;
2719 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002720 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002721 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002722
2723 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002724 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002725 }
2726 }
2727 catch(std::bad_alloc&)
2728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002729 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002730 }
2731}
2732
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002733void __stdcall glEnable(GLenum cap)
2734{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002735 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002736
2737 try
2738 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002739 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740
2741 if (context)
2742 {
2743 switch (cap)
2744 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002745 case GL_CULL_FACE: context->setCullFace(true); break;
2746 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2747 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2748 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2749 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2750 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2751 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2752 case GL_BLEND: context->setBlend(true); break;
2753 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002754 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002756 }
2757 }
2758 }
2759 catch(std::bad_alloc&)
2760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002762 }
2763}
2764
2765void __stdcall glEnableVertexAttribArray(GLuint index)
2766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002767 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002768
2769 try
2770 {
2771 if (index >= gl::MAX_VERTEX_ATTRIBS)
2772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002773 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002774 }
2775
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002776 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002777
2778 if (context)
2779 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002780 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002781 }
2782 }
2783 catch(std::bad_alloc&)
2784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002786 }
2787}
2788
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002789void __stdcall glEndQueryEXT(GLenum target)
2790{
2791 EVENT("GLenum target = 0x%X)", target);
2792
2793 try
2794 {
2795 switch (target)
2796 {
2797 case GL_ANY_SAMPLES_PASSED_EXT:
2798 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2799 break;
2800 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002801 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002802 }
2803
2804 gl::Context *context = gl::getNonLostContext();
2805
2806 if (context)
2807 {
2808 context->endQuery(target);
2809 }
2810 }
2811 catch(std::bad_alloc&)
2812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002813 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002814 }
2815}
2816
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002817void __stdcall glFinishFenceNV(GLuint fence)
2818{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002819 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002820
2821 try
2822 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002823 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002824
2825 if (context)
2826 {
2827 gl::Fence* fenceObject = context->getFence(fence);
2828
2829 if (fenceObject == NULL)
2830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002831 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002832 }
2833
2834 fenceObject->finishFence();
2835 }
2836 }
2837 catch(std::bad_alloc&)
2838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002839 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002840 }
2841}
2842
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002843void __stdcall glFinish(void)
2844{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002845 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002846
2847 try
2848 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002849 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002850
2851 if (context)
2852 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002853 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002854 }
2855 }
2856 catch(std::bad_alloc&)
2857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002858 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002859 }
2860}
2861
2862void __stdcall glFlush(void)
2863{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002864 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002865
2866 try
2867 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002869
2870 if (context)
2871 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002872 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873 }
2874 }
2875 catch(std::bad_alloc&)
2876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002878 }
2879}
2880
2881void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2882{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002883 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002884 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002885
2886 try
2887 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002888 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002889 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002892 }
2893
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002894 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002895
2896 if (context)
2897 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002898 gl::Framebuffer *framebuffer = NULL;
2899 GLuint framebufferHandle = 0;
2900 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2901 {
2902 framebuffer = context->getReadFramebuffer();
2903 framebufferHandle = context->getReadFramebufferHandle();
2904 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002905 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002906 {
2907 framebuffer = context->getDrawFramebuffer();
2908 framebufferHandle = context->getDrawFramebufferHandle();
2909 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002910
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002911 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002913 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002914 }
2915
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002916 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002917 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002918 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2919
2920 if (colorAttachment >= context->getMaximumRenderTargets())
2921 {
2922 return gl::error(GL_INVALID_VALUE);
2923 }
2924
2925 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2926 }
2927 else
2928 {
2929 switch (attachment)
2930 {
2931 case GL_DEPTH_ATTACHMENT:
2932 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2933 break;
2934 case GL_STENCIL_ATTACHMENT:
2935 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2936 break;
2937 default:
2938 return gl::error(GL_INVALID_ENUM);
2939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 }
2941 }
2942 }
2943 catch(std::bad_alloc&)
2944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002946 }
2947}
2948
2949void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002951 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002952 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953
2954 try
2955 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002956 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002958 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 }
2960
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962
2963 if (context)
2964 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002965 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2966 {
2967 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2968
2969 if (colorAttachment >= context->getMaximumRenderTargets())
2970 {
2971 return gl::error(GL_INVALID_VALUE);
2972 }
2973 }
2974 else
2975 {
2976 switch (attachment)
2977 {
2978 case GL_DEPTH_ATTACHMENT:
2979 case GL_STENCIL_ATTACHMENT:
2980 break;
2981 default:
2982 return gl::error(GL_INVALID_ENUM);
2983 }
2984 }
2985
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002986 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002987 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002988 textarget = GL_NONE;
2989 }
2990 else
2991 {
2992 gl::Texture *tex = context->getTexture(texture);
2993
2994 if (tex == NULL)
2995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002996 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002997 }
2998
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 switch (textarget)
3000 {
3001 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003003 if (tex->getTarget() != GL_TEXTURE_2D)
3004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003005 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003006 }
3007 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003008 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003010 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003011 }
3012 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003014
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003015 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003016 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003017 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003018 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003019 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003020 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003021 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003022 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
3023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003024 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003025 }
3026 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003027 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003029 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003030 }
3031 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003032 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00003033
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003035 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003036 }
3037
3038 if (level != 0)
3039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003040 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003041 }
3042 }
3043
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003044 gl::Framebuffer *framebuffer = NULL;
3045 GLuint framebufferHandle = 0;
3046 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3047 {
3048 framebuffer = context->getReadFramebuffer();
3049 framebufferHandle = context->getReadFramebufferHandle();
3050 }
3051 else
3052 {
3053 framebuffer = context->getDrawFramebuffer();
3054 framebufferHandle = context->getDrawFramebufferHandle();
3055 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003056
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003057 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003059 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060 }
3061
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003062 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003063 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003064 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3065
3066 if (colorAttachment >= context->getMaximumRenderTargets())
3067 {
3068 return gl::error(GL_INVALID_VALUE);
3069 }
3070
3071 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
3072 }
3073 else
3074 {
3075 switch (attachment)
3076 {
3077 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
3078 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
3079 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003080 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 }
3082 }
3083 catch(std::bad_alloc&)
3084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086 }
3087}
3088
3089void __stdcall glFrontFace(GLenum mode)
3090{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003091 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003092
3093 try
3094 {
3095 switch (mode)
3096 {
3097 case GL_CW:
3098 case GL_CCW:
3099 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003100 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101
3102 if (context)
3103 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003104 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105 }
3106 }
3107 break;
3108 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003109 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003110 }
3111 }
3112 catch(std::bad_alloc&)
3113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003115 }
3116}
3117
3118void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
3119{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003120 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003121
3122 try
3123 {
3124 if (n < 0)
3125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003126 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003127 }
3128
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003129 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003130
3131 if (context)
3132 {
3133 for (int i = 0; i < n; i++)
3134 {
3135 buffers[i] = context->createBuffer();
3136 }
3137 }
3138 }
3139 catch(std::bad_alloc&)
3140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003141 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003142 }
3143}
3144
3145void __stdcall glGenerateMipmap(GLenum target)
3146{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003147 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003148
3149 try
3150 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003151 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003152
3153 if (context)
3154 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003155 switch (target)
3156 {
3157 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003158 {
3159 gl::Texture2D *tex2d = context->getTexture2D();
3160
daniel@transgaming.com92f49922012-05-09 15:49:19 +00003161 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003163 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003164 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003165 if (tex2d->isDepth(0))
3166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003167 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00003168 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003169
3170 tex2d->generateMipmaps();
3171 break;
3172 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003173
3174 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003175 {
3176 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
3177
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00003178 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003180 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00003181 }
3182
3183 texcube->generateMipmaps();
3184 break;
3185 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003186
shannon.woods%transgaming.com@gtempaccount.com86740a92013-04-13 03:45:24 +00003187 case GL_TEXTURE_3D:
3188 {
3189 if (context->getClientVersion() < 3)
3190 {
3191 return gl::error(GL_INVALID_ENUM);
3192 }
3193
3194 gl::Texture3D *tex3D = context->getTexture3D();
3195 if (tex3D->isCompressed(0))
3196 {
3197 return gl::error(GL_INVALID_OPERATION);
3198 }
3199
3200 tex3D->generateMipmaps();
3201 break;
3202 }
3203
shannonwoods@chromium.org30aa1a92013-05-30 00:03:13 +00003204 case GL_TEXTURE_2D_ARRAY:
3205 {
3206 if (context->getClientVersion() < 3)
3207 {
3208 return gl::error(GL_INVALID_ENUM);
3209 }
3210
3211 gl::Texture2DArray *tex2darr = context->getTexture2DArray();
3212 if (tex2darr->isCompressed(0))
3213 {
3214 return gl::error(GL_INVALID_OPERATION);
3215 }
3216
3217 tex2darr->generateMipmaps();
3218 break;
3219 }
3220
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003221 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003222 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003223 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00003224 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003225 }
3226 catch(std::bad_alloc&)
3227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003228 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003229 }
3230}
3231
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003232void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
3233{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003234 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003235
3236 try
3237 {
3238 if (n < 0)
3239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003240 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003241 }
3242
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003243 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003244
3245 if (context)
3246 {
3247 for (int i = 0; i < n; i++)
3248 {
3249 fences[i] = context->createFence();
3250 }
3251 }
3252 }
3253 catch(std::bad_alloc&)
3254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003255 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003256 }
3257}
3258
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
3260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003261 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003262
3263 try
3264 {
3265 if (n < 0)
3266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003268 }
3269
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271
3272 if (context)
3273 {
3274 for (int i = 0; i < n; i++)
3275 {
3276 framebuffers[i] = context->createFramebuffer();
3277 }
3278 }
3279 }
3280 catch(std::bad_alloc&)
3281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 }
3284}
3285
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003286void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
3287{
3288 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
3289
3290 try
3291 {
3292 if (n < 0)
3293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003294 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003295 }
3296
3297 gl::Context *context = gl::getNonLostContext();
3298
3299 if (context)
3300 {
3301 for (int i = 0; i < n; i++)
3302 {
3303 ids[i] = context->createQuery();
3304 }
3305 }
3306 }
3307 catch(std::bad_alloc&)
3308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003310 }
3311}
3312
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
3314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003315 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316
3317 try
3318 {
3319 if (n < 0)
3320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322 }
3323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325
3326 if (context)
3327 {
3328 for (int i = 0; i < n; i++)
3329 {
3330 renderbuffers[i] = context->createRenderbuffer();
3331 }
3332 }
3333 }
3334 catch(std::bad_alloc&)
3335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003337 }
3338}
3339
3340void __stdcall glGenTextures(GLsizei n, GLuint* textures)
3341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003342 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343
3344 try
3345 {
3346 if (n < 0)
3347 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003348 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003349 }
3350
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003351 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352
3353 if (context)
3354 {
3355 for (int i = 0; i < n; i++)
3356 {
3357 textures[i] = context->createTexture();
3358 }
3359 }
3360 }
3361 catch(std::bad_alloc&)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365}
3366
daniel@transgaming.com85423182010-04-22 13:35:27 +00003367void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003369 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00003370 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 program, index, bufsize, length, size, type, name);
3372
3373 try
3374 {
3375 if (bufsize < 0)
3376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003377 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003378 }
3379
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00003381
3382 if (context)
3383 {
3384 gl::Program *programObject = context->getProgram(program);
3385
3386 if (!programObject)
3387 {
3388 if (context->getShader(program))
3389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003391 }
3392 else
3393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003394 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003395 }
3396 }
3397
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003398 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00003399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003400 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00003401 }
3402
3403 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
3404 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405 }
3406 catch(std::bad_alloc&)
3407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003408 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 }
3410}
3411
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003412void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003414 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003415 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416 program, index, bufsize, length, size, type, name);
3417
3418 try
3419 {
3420 if (bufsize < 0)
3421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003422 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 }
3424
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003425 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003426
3427 if (context)
3428 {
3429 gl::Program *programObject = context->getProgram(program);
3430
3431 if (!programObject)
3432 {
3433 if (context->getShader(program))
3434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003435 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003436 }
3437 else
3438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003440 }
3441 }
3442
3443 if (index >= (GLuint)programObject->getActiveUniformCount())
3444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003445 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003446 }
3447
3448 programObject->getActiveUniform(index, bufsize, length, size, type, name);
3449 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003450 }
3451 catch(std::bad_alloc&)
3452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 }
3455}
3456
3457void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
3458{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003459 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003460 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003461
3462 try
3463 {
3464 if (maxcount < 0)
3465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003466 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003467 }
3468
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003469 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003470
3471 if (context)
3472 {
3473 gl::Program *programObject = context->getProgram(program);
3474
3475 if (!programObject)
3476 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003477 if (context->getShader(program))
3478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003479 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003480 }
3481 else
3482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003483 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00003484 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003485 }
3486
3487 return programObject->getAttachedShaders(maxcount, count, shaders);
3488 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003489 }
3490 catch(std::bad_alloc&)
3491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003493 }
3494}
3495
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003496int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003498 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003499
3500 try
3501 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003503
3504 if (context)
3505 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003506
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003507 gl::Program *programObject = context->getProgram(program);
3508
3509 if (!programObject)
3510 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003511 if (context->getShader(program))
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003514 }
3515 else
3516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003517 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00003518 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003519 }
3520
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003521 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003522 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00003525 }
3526
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003527 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003528 }
3529 }
3530 catch(std::bad_alloc&)
3531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003532 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003533 }
3534
3535 return -1;
3536}
3537
3538void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
3539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003540 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541
3542 try
3543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003545
3546 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003547 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003548 if (!(context->getBooleanv(pname, params)))
3549 {
3550 GLenum nativeType;
3551 unsigned int numParams = 0;
3552 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003553 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003554
3555 if (numParams == 0)
3556 return; // it is known that the pname is valid, but there are no parameters to return
3557
3558 if (nativeType == GL_FLOAT)
3559 {
3560 GLfloat *floatParams = NULL;
3561 floatParams = new GLfloat[numParams];
3562
3563 context->getFloatv(pname, floatParams);
3564
3565 for (unsigned int i = 0; i < numParams; ++i)
3566 {
3567 if (floatParams[i] == 0.0f)
3568 params[i] = GL_FALSE;
3569 else
3570 params[i] = GL_TRUE;
3571 }
3572
3573 delete [] floatParams;
3574 }
3575 else if (nativeType == GL_INT)
3576 {
3577 GLint *intParams = NULL;
3578 intParams = new GLint[numParams];
3579
3580 context->getIntegerv(pname, intParams);
3581
3582 for (unsigned int i = 0; i < numParams; ++i)
3583 {
3584 if (intParams[i] == 0)
3585 params[i] = GL_FALSE;
3586 else
3587 params[i] = GL_TRUE;
3588 }
3589
3590 delete [] intParams;
3591 }
3592 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593 }
3594 }
3595 catch(std::bad_alloc&)
3596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003597 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598 }
3599}
3600
3601void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003603 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604
3605 try
3606 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003608
3609 if (context)
3610 {
3611 gl::Buffer *buffer;
3612
3613 switch (target)
3614 {
3615 case GL_ARRAY_BUFFER:
3616 buffer = context->getArrayBuffer();
3617 break;
3618 case GL_ELEMENT_ARRAY_BUFFER:
3619 buffer = context->getElementArrayBuffer();
3620 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003621 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003622 }
3623
3624 if (!buffer)
3625 {
3626 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003627 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003628 }
3629
3630 switch (pname)
3631 {
3632 case GL_BUFFER_USAGE:
3633 *params = buffer->usage();
3634 break;
3635 case GL_BUFFER_SIZE:
3636 *params = buffer->size();
3637 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003638 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003639 }
3640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641 }
3642 catch(std::bad_alloc&)
3643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003645 }
3646}
3647
3648GLenum __stdcall glGetError(void)
3649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003650 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003651
3652 gl::Context *context = gl::getContext();
3653
3654 if (context)
3655 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003656 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003657 }
3658
3659 return GL_NO_ERROR;
3660}
3661
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003662void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003664 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003665
3666 try
3667 {
3668
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003669 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003670
3671 if (context)
3672 {
3673 gl::Fence *fenceObject = context->getFence(fence);
3674
3675 if (fenceObject == NULL)
3676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003677 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003678 }
3679
3680 fenceObject->getFenceiv(pname, params);
3681 }
3682 }
3683 catch(std::bad_alloc&)
3684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003685 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003686 }
3687}
3688
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003689void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003691 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003692
3693 try
3694 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003695 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003696
3697 if (context)
3698 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003699 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003700 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003701 GLenum nativeType;
3702 unsigned int numParams = 0;
3703 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003704 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003705
3706 if (numParams == 0)
3707 return; // it is known that the pname is valid, but that there are no parameters to return.
3708
3709 if (nativeType == GL_BOOL)
3710 {
3711 GLboolean *boolParams = NULL;
3712 boolParams = new GLboolean[numParams];
3713
3714 context->getBooleanv(pname, boolParams);
3715
3716 for (unsigned int i = 0; i < numParams; ++i)
3717 {
3718 if (boolParams[i] == GL_FALSE)
3719 params[i] = 0.0f;
3720 else
3721 params[i] = 1.0f;
3722 }
3723
3724 delete [] boolParams;
3725 }
3726 else if (nativeType == GL_INT)
3727 {
3728 GLint *intParams = NULL;
3729 intParams = new GLint[numParams];
3730
3731 context->getIntegerv(pname, intParams);
3732
3733 for (unsigned int i = 0; i < numParams; ++i)
3734 {
3735 params[i] = (GLfloat)intParams[i];
3736 }
3737
3738 delete [] intParams;
3739 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003740 }
3741 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003742 }
3743 catch(std::bad_alloc&)
3744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003746 }
3747}
3748
3749void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003751 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003752 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003753
3754 try
3755 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003756 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003757
3758 if (context)
3759 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003760 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003763 }
3764
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003765 gl::Framebuffer *framebuffer = NULL;
3766 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3767 {
3768 if(context->getReadFramebufferHandle() == 0)
3769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003770 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003771 }
3772
3773 framebuffer = context->getReadFramebuffer();
3774 }
3775 else
3776 {
3777 if (context->getDrawFramebufferHandle() == 0)
3778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003779 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003780 }
3781
3782 framebuffer = context->getDrawFramebuffer();
3783 }
3784
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003785 GLenum attachmentType;
3786 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003787
3788 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003789 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003790 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3791
3792 if (colorAttachment >= context->getMaximumRenderTargets())
3793 {
3794 return gl::error(GL_INVALID_ENUM);
3795 }
3796
3797 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3798 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3799 }
3800 else
3801 {
3802 switch (attachment)
3803 {
3804 case GL_DEPTH_ATTACHMENT:
3805 attachmentType = framebuffer->getDepthbufferType();
3806 attachmentHandle = framebuffer->getDepthbufferHandle();
3807 break;
3808 case GL_STENCIL_ATTACHMENT:
3809 attachmentType = framebuffer->getStencilbufferType();
3810 attachmentHandle = framebuffer->getStencilbufferHandle();
3811 break;
3812 default: return gl::error(GL_INVALID_ENUM);
3813 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003814 }
3815
3816 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003817 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003818 {
3819 attachmentObjectType = attachmentType;
3820 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003821 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003822 {
3823 attachmentObjectType = GL_TEXTURE;
3824 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003825 else
3826 {
3827 UNREACHABLE();
3828 return;
3829 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003830
3831 switch (pname)
3832 {
3833 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3834 *params = attachmentObjectType;
3835 break;
3836 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3837 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3838 {
3839 *params = attachmentHandle;
3840 }
3841 else
3842 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003843 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003844 }
3845 break;
3846 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3847 if (attachmentObjectType == GL_TEXTURE)
3848 {
3849 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3850 }
3851 else
3852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003854 }
3855 break;
3856 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3857 if (attachmentObjectType == GL_TEXTURE)
3858 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003859 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003860 {
3861 *params = attachmentType;
3862 }
3863 else
3864 {
3865 *params = 0;
3866 }
3867 }
3868 else
3869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003871 }
3872 break;
3873 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003874 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003875 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003876 }
3877 }
3878 catch(std::bad_alloc&)
3879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003881 }
3882}
3883
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003884GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3885{
3886 EVENT("()");
3887
3888 try
3889 {
3890 gl::Context *context = gl::getContext();
3891
3892 if (context)
3893 {
3894 return context->getResetStatus();
3895 }
3896
3897 return GL_NO_ERROR;
3898 }
3899 catch(std::bad_alloc&)
3900 {
3901 return GL_OUT_OF_MEMORY;
3902 }
3903}
3904
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003905void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3906{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003907 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003908
3909 try
3910 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003912
3913 if (context)
3914 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003915 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003916 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003917 GLenum nativeType;
3918 unsigned int numParams = 0;
3919 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003922 if (numParams == 0)
3923 return; // it is known that pname is valid, but there are no parameters to return
3924
3925 if (nativeType == GL_BOOL)
3926 {
3927 GLboolean *boolParams = NULL;
3928 boolParams = new GLboolean[numParams];
3929
3930 context->getBooleanv(pname, boolParams);
3931
3932 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003933 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003934 if (boolParams[i] == GL_FALSE)
3935 params[i] = 0;
3936 else
3937 params[i] = 1;
3938 }
3939
3940 delete [] boolParams;
3941 }
3942 else if (nativeType == GL_FLOAT)
3943 {
3944 GLfloat *floatParams = NULL;
3945 floatParams = new GLfloat[numParams];
3946
3947 context->getFloatv(pname, floatParams);
3948
3949 for (unsigned int i = 0; i < numParams; ++i)
3950 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003951 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003952 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003953 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003954 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003955 else
3956 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003957 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003958
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003959 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003961 }
3962 }
3963 }
3964 catch(std::bad_alloc&)
3965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003967 }
3968}
3969
3970void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3971{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003972 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003973
3974 try
3975 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003976 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003977
3978 if (context)
3979 {
3980 gl::Program *programObject = context->getProgram(program);
3981
3982 if (!programObject)
3983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003984 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985 }
3986
3987 switch (pname)
3988 {
3989 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003990 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003991 return;
3992 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003993 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003994 return;
3995 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003996 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997 return;
3998 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003999 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004000 return;
4001 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004002 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004003 return;
4004 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004005 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004006 return;
4007 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004008 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004009 return;
4010 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004011 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004012 return;
4013 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004014 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004015 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004016 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004017 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004018 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004020 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004021 }
4022 }
4023 }
4024 catch(std::bad_alloc&)
4025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004026 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004027 }
4028}
4029
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004030void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004031{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004032 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004033 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004034
4035 try
4036 {
4037 if (bufsize < 0)
4038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004039 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004040 }
4041
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004042 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004043
4044 if (context)
4045 {
4046 gl::Program *programObject = context->getProgram(program);
4047
4048 if (!programObject)
4049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004051 }
4052
4053 programObject->getInfoLog(bufsize, length, infolog);
4054 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055 }
4056 catch(std::bad_alloc&)
4057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004058 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004059 }
4060}
4061
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004062void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4063{
4064 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4065
4066 try
4067 {
4068 switch (pname)
4069 {
4070 case GL_CURRENT_QUERY_EXT:
4071 break;
4072 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004074 }
4075
4076 gl::Context *context = gl::getNonLostContext();
4077
4078 if (context)
4079 {
4080 params[0] = context->getActiveQuery(target);
4081 }
4082 }
4083 catch(std::bad_alloc&)
4084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004086 }
4087}
4088
4089void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4090{
4091 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4092
4093 try
4094 {
4095 switch (pname)
4096 {
4097 case GL_QUERY_RESULT_EXT:
4098 case GL_QUERY_RESULT_AVAILABLE_EXT:
4099 break;
4100 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004102 }
4103 gl::Context *context = gl::getNonLostContext();
4104
4105 if (context)
4106 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004107 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4108
4109 if (!queryObject)
4110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004111 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004112 }
4113
4114 if (context->getActiveQuery(queryObject->getType()) == id)
4115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004116 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004117 }
4118
4119 switch(pname)
4120 {
4121 case GL_QUERY_RESULT_EXT:
4122 params[0] = queryObject->getResult();
4123 break;
4124 case GL_QUERY_RESULT_AVAILABLE_EXT:
4125 params[0] = queryObject->isResultAvailable();
4126 break;
4127 default:
4128 ASSERT(false);
4129 }
4130 }
4131 }
4132 catch(std::bad_alloc&)
4133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004134 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004135 }
4136}
4137
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4139{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004140 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141
4142 try
4143 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004144 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004145
4146 if (context)
4147 {
4148 if (target != GL_RENDERBUFFER)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004151 }
4152
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004153 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004155 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004156 }
4157
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004158 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004159
4160 switch (pname)
4161 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004162 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4163 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4164 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4165 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4166 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4167 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4168 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4169 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4170 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004171 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004172 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004173 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004174 *params = renderbuffer->getSamples();
4175 }
4176 else
4177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004178 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004179 }
4180 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004181 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004182 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004183 }
4184 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004185 }
4186 catch(std::bad_alloc&)
4187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004188 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004189 }
4190}
4191
4192void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4193{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004194 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004195
4196 try
4197 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004198 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199
4200 if (context)
4201 {
4202 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004203
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004204 if (!shaderObject)
4205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004206 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207 }
4208
4209 switch (pname)
4210 {
4211 case GL_SHADER_TYPE:
4212 *params = shaderObject->getType();
4213 return;
4214 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004215 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216 return;
4217 case GL_COMPILE_STATUS:
4218 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4219 return;
4220 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004221 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004222 return;
4223 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004224 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004225 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004226 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4227 *params = shaderObject->getTranslatedSourceLength();
4228 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004229 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004230 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004231 }
4232 }
4233 }
4234 catch(std::bad_alloc&)
4235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004237 }
4238}
4239
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004240void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004242 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004243 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004244
4245 try
4246 {
4247 if (bufsize < 0)
4248 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004249 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004250 }
4251
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004252 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004253
4254 if (context)
4255 {
4256 gl::Shader *shaderObject = context->getShader(shader);
4257
4258 if (!shaderObject)
4259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004261 }
4262
4263 shaderObject->getInfoLog(bufsize, length, infolog);
4264 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004265 }
4266 catch(std::bad_alloc&)
4267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004268 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269 }
4270}
4271
4272void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4273{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004274 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004275 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276
4277 try
4278 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004279 switch (shadertype)
4280 {
4281 case GL_VERTEX_SHADER:
4282 case GL_FRAGMENT_SHADER:
4283 break;
4284 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004286 }
4287
4288 switch (precisiontype)
4289 {
4290 case GL_LOW_FLOAT:
4291 case GL_MEDIUM_FLOAT:
4292 case GL_HIGH_FLOAT:
4293 // Assume IEEE 754 precision
4294 range[0] = 127;
4295 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004296 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004297 break;
4298 case GL_LOW_INT:
4299 case GL_MEDIUM_INT:
4300 case GL_HIGH_INT:
4301 // Some (most) hardware only supports single-precision floating-point numbers,
4302 // which can accurately represent integers up to +/-16777216
4303 range[0] = 24;
4304 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004305 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004306 break;
4307 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004309 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004310 }
4311 catch(std::bad_alloc&)
4312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 }
4315}
4316
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004317void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004319 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004320 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321
4322 try
4323 {
4324 if (bufsize < 0)
4325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004326 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 }
4328
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004329 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004330
4331 if (context)
4332 {
4333 gl::Shader *shaderObject = context->getShader(shader);
4334
4335 if (!shaderObject)
4336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004338 }
4339
4340 shaderObject->getSource(bufsize, length, source);
4341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004342 }
4343 catch(std::bad_alloc&)
4344 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004345 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004346 }
4347}
4348
zmo@google.coma574f782011-10-03 21:45:23 +00004349void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4350{
4351 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4352 shader, bufsize, length, source);
4353
4354 try
4355 {
4356 if (bufsize < 0)
4357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004358 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004359 }
4360
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004361 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004362
4363 if (context)
4364 {
4365 gl::Shader *shaderObject = context->getShader(shader);
4366
4367 if (!shaderObject)
4368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004369 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004370 }
4371
4372 shaderObject->getTranslatedSource(bufsize, length, source);
4373 }
4374 }
4375 catch(std::bad_alloc&)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004378 }
4379}
4380
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381const GLubyte* __stdcall glGetString(GLenum name)
4382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004383 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384
4385 try
4386 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 switch (name)
4390 {
4391 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004392 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004393 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004394 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004395 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004396 if (context->getClientVersion() == 2)
4397 {
4398 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4399 }
4400 else
4401 {
4402 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4403 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004405 if (context->getClientVersion() == 2)
4406 {
4407 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4408 }
4409 else
4410 {
4411 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4412 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004413 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004414 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004416 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004417 }
4418 }
4419 catch(std::bad_alloc&)
4420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004421 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423}
4424
4425void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4426{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004427 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428
4429 try
4430 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004431 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004432
4433 if (context)
4434 {
4435 gl::Texture *texture;
4436
4437 switch (target)
4438 {
4439 case GL_TEXTURE_2D:
4440 texture = context->getTexture2D();
4441 break;
4442 case GL_TEXTURE_CUBE_MAP:
4443 texture = context->getTextureCubeMap();
4444 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004445 case GL_TEXTURE_3D:
4446 if (context->getClientVersion() < 3)
4447 {
4448 return gl::error(GL_INVALID_ENUM);
4449 }
4450 texture = context->getTexture3D();
4451 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004452 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004453 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004454 }
4455
4456 switch (pname)
4457 {
4458 case GL_TEXTURE_MAG_FILTER:
4459 *params = (GLfloat)texture->getMagFilter();
4460 break;
4461 case GL_TEXTURE_MIN_FILTER:
4462 *params = (GLfloat)texture->getMinFilter();
4463 break;
4464 case GL_TEXTURE_WRAP_S:
4465 *params = (GLfloat)texture->getWrapS();
4466 break;
4467 case GL_TEXTURE_WRAP_T:
4468 *params = (GLfloat)texture->getWrapT();
4469 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004470 case GL_TEXTURE_WRAP_R:
4471 if (context->getClientVersion() < 3)
4472 {
4473 return gl::error(GL_INVALID_ENUM);
4474 }
4475 *params = (GLfloat)texture->getWrapR();
4476 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004477 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4478 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4479 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004480 case GL_TEXTURE_USAGE_ANGLE:
4481 *params = (GLfloat)texture->getUsage();
4482 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004483 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4484 if (!context->supportsTextureFilterAnisotropy())
4485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004487 }
4488 *params = (GLfloat)texture->getMaxAnisotropy();
4489 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004492 }
4493 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004494 }
4495 catch(std::bad_alloc&)
4496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004497 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498 }
4499}
4500
4501void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004503 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504
4505 try
4506 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004508
4509 if (context)
4510 {
4511 gl::Texture *texture;
4512
4513 switch (target)
4514 {
4515 case GL_TEXTURE_2D:
4516 texture = context->getTexture2D();
4517 break;
4518 case GL_TEXTURE_CUBE_MAP:
4519 texture = context->getTextureCubeMap();
4520 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004521 case GL_TEXTURE_3D:
4522 if (context->getClientVersion() < 3)
4523 {
4524 return gl::error(GL_INVALID_ENUM);
4525 }
4526 texture = context->getTexture3D();
4527 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004528 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004529 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004530 }
4531
4532 switch (pname)
4533 {
4534 case GL_TEXTURE_MAG_FILTER:
4535 *params = texture->getMagFilter();
4536 break;
4537 case GL_TEXTURE_MIN_FILTER:
4538 *params = texture->getMinFilter();
4539 break;
4540 case GL_TEXTURE_WRAP_S:
4541 *params = texture->getWrapS();
4542 break;
4543 case GL_TEXTURE_WRAP_T:
4544 *params = texture->getWrapT();
4545 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004546 case GL_TEXTURE_WRAP_R:
4547 if (context->getClientVersion() < 3)
4548 {
4549 return gl::error(GL_INVALID_ENUM);
4550 }
4551 *params = texture->getWrapR();
4552 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004553 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4554 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4555 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004556 case GL_TEXTURE_USAGE_ANGLE:
4557 *params = texture->getUsage();
4558 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004559 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4560 if (!context->supportsTextureFilterAnisotropy())
4561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004562 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004563 }
4564 *params = (GLint)texture->getMaxAnisotropy();
4565 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004568 }
4569 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004570 }
4571 catch(std::bad_alloc&)
4572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 }
4575}
4576
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004577void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4578{
4579 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4580 program, location, bufSize, params);
4581
4582 try
4583 {
4584 if (bufSize < 0)
4585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004587 }
4588
4589 gl::Context *context = gl::getNonLostContext();
4590
4591 if (context)
4592 {
4593 if (program == 0)
4594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004595 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004596 }
4597
4598 gl::Program *programObject = context->getProgram(program);
4599
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004600 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004602 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004603 }
4604
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004605 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4606 if (!programBinary)
4607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004608 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004609 }
4610
4611 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004614 }
4615 }
4616 }
4617 catch(std::bad_alloc&)
4618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004619 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004620 }
4621}
4622
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004623void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004625 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004626
4627 try
4628 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004629 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004630
4631 if (context)
4632 {
4633 if (program == 0)
4634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004635 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004636 }
4637
4638 gl::Program *programObject = context->getProgram(program);
4639
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004640 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004642 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004643 }
4644
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004645 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4646 if (!programBinary)
4647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004648 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004649 }
4650
4651 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004653 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004654 }
4655 }
4656 }
4657 catch(std::bad_alloc&)
4658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004660 }
4661}
4662
4663void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4664{
4665 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4666 program, location, bufSize, params);
4667
4668 try
4669 {
4670 if (bufSize < 0)
4671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004672 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004673 }
4674
4675 gl::Context *context = gl::getNonLostContext();
4676
4677 if (context)
4678 {
4679 if (program == 0)
4680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004682 }
4683
4684 gl::Program *programObject = context->getProgram(program);
4685
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004686 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004689 }
4690
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004691 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4692 if (!programBinary)
4693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004694 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004695 }
4696
4697 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004699 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004700 }
4701 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004702 }
4703 catch(std::bad_alloc&)
4704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004706 }
4707}
4708
4709void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4710{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004711 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004712
4713 try
4714 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004715 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004716
4717 if (context)
4718 {
4719 if (program == 0)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004722 }
4723
4724 gl::Program *programObject = context->getProgram(program);
4725
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004726 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004728 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004729 }
4730
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004731 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4732 if (!programBinary)
4733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004734 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004735 }
4736
4737 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004739 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004740 }
4741 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004742 }
4743 catch(std::bad_alloc&)
4744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746 }
4747}
4748
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004749int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004751 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004752
4753 try
4754 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004755 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756
4757 if (strstr(name, "gl_") == name)
4758 {
4759 return -1;
4760 }
4761
4762 if (context)
4763 {
4764 gl::Program *programObject = context->getProgram(program);
4765
4766 if (!programObject)
4767 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004768 if (context->getShader(program))
4769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004770 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004771 }
4772 else
4773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004774 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004775 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004778 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004779 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004781 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004784 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004785 }
4786 }
4787 catch(std::bad_alloc&)
4788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004789 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790 }
4791
4792 return -1;
4793}
4794
4795void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004797 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798
4799 try
4800 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004801 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
daniel@transgaming.come0078962010-04-15 20:45:08 +00004803 if (context)
4804 {
4805 if (index >= gl::MAX_VERTEX_ATTRIBS)
4806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004807 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004808 }
4809
daniel@transgaming.com83921382011-01-08 05:46:00 +00004810 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004811
daniel@transgaming.come0078962010-04-15 20:45:08 +00004812 switch (pname)
4813 {
4814 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004815 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004816 break;
4817 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004818 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004819 break;
4820 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004821 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004822 break;
4823 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004824 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004825 break;
4826 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004827 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004828 break;
4829 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004830 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004831 break;
4832 case GL_CURRENT_VERTEX_ATTRIB:
4833 for (int i = 0; i < 4; ++i)
4834 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004835 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004836 }
4837 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004838 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4839 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4840 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004841 *params = (GLfloat)attribState.mDivisor;
4842 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004843 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004844 }
4845 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846 }
4847 catch(std::bad_alloc&)
4848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004849 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004850 }
4851}
4852
4853void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4854{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004855 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004856
4857 try
4858 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004859 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860
daniel@transgaming.come0078962010-04-15 20:45:08 +00004861 if (context)
4862 {
4863 if (index >= gl::MAX_VERTEX_ATTRIBS)
4864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004866 }
4867
daniel@transgaming.com83921382011-01-08 05:46:00 +00004868 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004869
daniel@transgaming.come0078962010-04-15 20:45:08 +00004870 switch (pname)
4871 {
4872 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004873 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004874 break;
4875 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004876 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004877 break;
4878 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004879 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004880 break;
4881 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004882 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004883 break;
4884 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004885 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004886 break;
4887 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004888 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004889 break;
4890 case GL_CURRENT_VERTEX_ATTRIB:
4891 for (int i = 0; i < 4; ++i)
4892 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004893 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004894 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4895 }
4896 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004897 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4898 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4899 // the same constant.
4900 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004901 *params = (GLint)attribState.mDivisor;
4902 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004903 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004904 }
4905 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004906 }
4907 catch(std::bad_alloc&)
4908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004909 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004910 }
4911}
4912
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004913void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004914{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004915 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916
4917 try
4918 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004919 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004920
daniel@transgaming.come0078962010-04-15 20:45:08 +00004921 if (context)
4922 {
4923 if (index >= gl::MAX_VERTEX_ATTRIBS)
4924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004925 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004926 }
4927
4928 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004930 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004931 }
4932
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004933 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004934 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004935 }
4936 catch(std::bad_alloc&)
4937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939 }
4940}
4941
4942void __stdcall glHint(GLenum target, GLenum mode)
4943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004944 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004945
4946 try
4947 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004948 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004949 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004950 case GL_FASTEST:
4951 case GL_NICEST:
4952 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004953 break;
4954 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004955 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004956 }
4957
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004958 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004959 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004960 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004961 case GL_GENERATE_MIPMAP_HINT:
4962 if (context) context->setGenerateMipmapHint(mode);
4963 break;
4964 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4965 if (context) context->setFragmentShaderDerivativeHint(mode);
4966 break;
4967 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004968 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004969 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971 catch(std::bad_alloc&)
4972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004973 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004974 }
4975}
4976
4977GLboolean __stdcall glIsBuffer(GLuint buffer)
4978{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004979 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004980
4981 try
4982 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004983 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984
4985 if (context && buffer)
4986 {
4987 gl::Buffer *bufferObject = context->getBuffer(buffer);
4988
4989 if (bufferObject)
4990 {
4991 return GL_TRUE;
4992 }
4993 }
4994 }
4995 catch(std::bad_alloc&)
4996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004997 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998 }
4999
5000 return GL_FALSE;
5001}
5002
5003GLboolean __stdcall glIsEnabled(GLenum cap)
5004{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005005 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005006
5007 try
5008 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005009 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005010
5011 if (context)
5012 {
5013 switch (cap)
5014 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005015 case GL_CULL_FACE: return context->isCullFaceEnabled();
5016 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5017 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5018 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5019 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5020 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5021 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5022 case GL_BLEND: return context->isBlendEnabled();
5023 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005024 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005025 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005026 }
5027 }
5028 }
5029 catch(std::bad_alloc&)
5030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005031 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032 }
5033
5034 return false;
5035}
5036
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005037GLboolean __stdcall glIsFenceNV(GLuint fence)
5038{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005039 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005040
5041 try
5042 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005043 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005044
5045 if (context)
5046 {
5047 gl::Fence *fenceObject = context->getFence(fence);
5048
5049 if (fenceObject == NULL)
5050 {
5051 return GL_FALSE;
5052 }
5053
5054 return fenceObject->isFence();
5055 }
5056 }
5057 catch(std::bad_alloc&)
5058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005059 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005060 }
5061
5062 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005063}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005064
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005067 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068
5069 try
5070 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005072
5073 if (context && framebuffer)
5074 {
5075 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5076
5077 if (framebufferObject)
5078 {
5079 return GL_TRUE;
5080 }
5081 }
5082 }
5083 catch(std::bad_alloc&)
5084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005085 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005086 }
5087
5088 return GL_FALSE;
5089}
5090
5091GLboolean __stdcall glIsProgram(GLuint program)
5092{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005093 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094
5095 try
5096 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005097 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005098
5099 if (context && program)
5100 {
5101 gl::Program *programObject = context->getProgram(program);
5102
5103 if (programObject)
5104 {
5105 return GL_TRUE;
5106 }
5107 }
5108 }
5109 catch(std::bad_alloc&)
5110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005111 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005112 }
5113
5114 return GL_FALSE;
5115}
5116
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005117GLboolean __stdcall glIsQueryEXT(GLuint id)
5118{
5119 EVENT("(GLuint id = %d)", id);
5120
5121 try
5122 {
5123 if (id == 0)
5124 {
5125 return GL_FALSE;
5126 }
5127
5128 gl::Context *context = gl::getNonLostContext();
5129
5130 if (context)
5131 {
5132 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5133
5134 if (queryObject)
5135 {
5136 return GL_TRUE;
5137 }
5138 }
5139 }
5140 catch(std::bad_alloc&)
5141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005142 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005143 }
5144
5145 return GL_FALSE;
5146}
5147
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5149{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005150 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005151
5152 try
5153 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005154 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005155
5156 if (context && renderbuffer)
5157 {
5158 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5159
5160 if (renderbufferObject)
5161 {
5162 return GL_TRUE;
5163 }
5164 }
5165 }
5166 catch(std::bad_alloc&)
5167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005168 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005169 }
5170
5171 return GL_FALSE;
5172}
5173
5174GLboolean __stdcall glIsShader(GLuint shader)
5175{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005176 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177
5178 try
5179 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005181
5182 if (context && shader)
5183 {
5184 gl::Shader *shaderObject = context->getShader(shader);
5185
5186 if (shaderObject)
5187 {
5188 return GL_TRUE;
5189 }
5190 }
5191 }
5192 catch(std::bad_alloc&)
5193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005195 }
5196
5197 return GL_FALSE;
5198}
5199
5200GLboolean __stdcall glIsTexture(GLuint texture)
5201{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005202 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005203
5204 try
5205 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005206 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207
5208 if (context && texture)
5209 {
5210 gl::Texture *textureObject = context->getTexture(texture);
5211
5212 if (textureObject)
5213 {
5214 return GL_TRUE;
5215 }
5216 }
5217 }
5218 catch(std::bad_alloc&)
5219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005220 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005221 }
5222
5223 return GL_FALSE;
5224}
5225
5226void __stdcall glLineWidth(GLfloat width)
5227{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005228 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229
5230 try
5231 {
5232 if (width <= 0.0f)
5233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005234 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005235 }
5236
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005237 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005238
5239 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005240 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005241 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005242 }
5243 }
5244 catch(std::bad_alloc&)
5245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005247 }
5248}
5249
5250void __stdcall glLinkProgram(GLuint program)
5251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005252 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253
5254 try
5255 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005256 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005257
5258 if (context)
5259 {
5260 gl::Program *programObject = context->getProgram(program);
5261
5262 if (!programObject)
5263 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005264 if (context->getShader(program))
5265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005266 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005267 }
5268 else
5269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005271 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005272 }
5273
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005274 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005275 }
5276 }
5277 catch(std::bad_alloc&)
5278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005280 }
5281}
5282
5283void __stdcall glPixelStorei(GLenum pname, GLint param)
5284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005285 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005286
5287 try
5288 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005290
5291 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005292 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005293 switch (pname)
5294 {
5295 case GL_UNPACK_ALIGNMENT:
5296 if (param != 1 && param != 2 && param != 4 && param != 8)
5297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005298 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005299 }
5300
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005301 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005302 break;
5303
5304 case GL_PACK_ALIGNMENT:
5305 if (param != 1 && param != 2 && param != 4 && param != 8)
5306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005308 }
5309
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005310 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005311 break;
5312
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005313 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5314 context->setPackReverseRowOrder(param != 0);
5315 break;
5316
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005317 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005320 }
5321 }
5322 catch(std::bad_alloc&)
5323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005324 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 }
5326}
5327
5328void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5329{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005330 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005331
5332 try
5333 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005335
5336 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005337 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005338 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005339 }
5340 }
5341 catch(std::bad_alloc&)
5342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005344 }
5345}
5346
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005347void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5348 GLenum format, GLenum type, GLsizei bufSize,
5349 GLvoid *data)
5350{
5351 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5352 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5353 x, y, width, height, format, type, bufSize, data);
5354
5355 try
5356 {
5357 if (width < 0 || height < 0 || bufSize < 0)
5358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005359 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005360 }
5361
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005362 gl::Context *context = gl::getNonLostContext();
5363
5364 if (context)
5365 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005366 GLenum currentFormat, currentType;
5367
5368 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5369 // and attempting to read back if that's the case is an error. The error will be registered
5370 // by getCurrentReadFormat.
5371 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5372 return;
5373
5374 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005376 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005377 }
5378
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005379 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5380 }
5381 }
5382 catch(std::bad_alloc&)
5383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005384 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005385 }
5386}
5387
5388void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5389 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005390{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005391 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005392 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005393 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005394
5395 try
5396 {
5397 if (width < 0 || height < 0)
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005400 }
5401
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005402 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005403
5404 if (context)
5405 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005406 GLenum currentFormat, currentType;
5407
5408 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5409 // and attempting to read back if that's the case is an error. The error will be registered
5410 // by getCurrentReadFormat.
5411 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5412 return;
5413
5414 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005417 }
5418
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005419 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005420 }
5421 }
5422 catch(std::bad_alloc&)
5423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005425 }
5426}
5427
5428void __stdcall glReleaseShaderCompiler(void)
5429{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005430 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005431
5432 try
5433 {
5434 gl::Shader::releaseCompiler();
5435 }
5436 catch(std::bad_alloc&)
5437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440}
5441
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005442void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005444 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005445 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005446
5447 try
5448 {
5449 switch (target)
5450 {
5451 case GL_RENDERBUFFER:
5452 break;
5453 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455 }
5456
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005457 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005460 }
5461
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005462 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465 }
5466
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005467 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468
5469 if (context)
5470 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005471 if (width > context->getMaximumRenderbufferDimension() ||
5472 height > context->getMaximumRenderbufferDimension() ||
5473 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005475 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005476 }
5477
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005478 GLuint handle = context->getRenderbufferHandle();
5479 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005482 }
5483
5484 switch (internalformat)
5485 {
5486 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 case GL_RGBA4:
5488 case GL_RGB5_A1:
5489 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005490 case GL_RGB8_OES:
5491 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005492 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005493 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005494 break;
5495 case GL_SRGB8_ALPHA8:
5496 case GL_RGB10_A2:
5497 case GL_RG8:
5498 case GL_R8:
5499 if (context->getClientVersion() < 3)
5500 {
5501 return gl::error(GL_INVALID_ENUM);
5502 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005503 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005506 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005507
5508 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005509 }
5510 }
5511 catch(std::bad_alloc&)
5512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005514 }
5515}
5516
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005517void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5518{
5519 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5520}
5521
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5523{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005524 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525
5526 try
5527 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005528 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005529
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 if (context)
5531 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005532 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005533 }
5534 }
5535 catch(std::bad_alloc&)
5536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005537 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005538 }
5539}
5540
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005541void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5542{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005543 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005544
5545 try
5546 {
5547 if (condition != GL_ALL_COMPLETED_NV)
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005550 }
5551
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005552 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005553
5554 if (context)
5555 {
5556 gl::Fence *fenceObject = context->getFence(fence);
5557
5558 if (fenceObject == NULL)
5559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005560 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005561 }
5562
5563 fenceObject->setFence(condition);
5564 }
5565 }
5566 catch(std::bad_alloc&)
5567 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005568 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005569 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005570}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005571
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005572void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5573{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005574 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005575
5576 try
5577 {
5578 if (width < 0 || height < 0)
5579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005580 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005581 }
5582
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005583 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005584
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585 if (context)
5586 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005587 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588 }
5589 }
5590 catch(std::bad_alloc&)
5591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005593 }
5594}
5595
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005596void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005598 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005599 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005600 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601
5602 try
5603 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005604 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 }
5607 catch(std::bad_alloc&)
5608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005610 }
5611}
5612
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005613void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005615 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005616 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617
5618 try
5619 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005620 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005625 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626
5627 if (context)
5628 {
5629 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005630
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005631 if (!shaderObject)
5632 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005633 if (context->getProgram(shader))
5634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005635 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005636 }
5637 else
5638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005641 }
5642
5643 shaderObject->setSource(count, string, length);
5644 }
5645 }
5646 catch(std::bad_alloc&)
5647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
5650}
5651
5652void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5653{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005654 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655}
5656
5657void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5658{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005659 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005660
5661 try
5662 {
5663 switch (face)
5664 {
5665 case GL_FRONT:
5666 case GL_BACK:
5667 case GL_FRONT_AND_BACK:
5668 break;
5669 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671 }
5672
5673 switch (func)
5674 {
5675 case GL_NEVER:
5676 case GL_ALWAYS:
5677 case GL_LESS:
5678 case GL_LEQUAL:
5679 case GL_EQUAL:
5680 case GL_GEQUAL:
5681 case GL_GREATER:
5682 case GL_NOTEQUAL:
5683 break;
5684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005686 }
5687
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005688 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005689
5690 if (context)
5691 {
5692 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5693 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005694 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005695 }
5696
5697 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5698 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005699 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 }
5702 }
5703 catch(std::bad_alloc&)
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707}
5708
5709void __stdcall glStencilMask(GLuint mask)
5710{
5711 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5712}
5713
5714void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005716 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005717
5718 try
5719 {
5720 switch (face)
5721 {
5722 case GL_FRONT:
5723 case GL_BACK:
5724 case GL_FRONT_AND_BACK:
5725 break;
5726 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005727 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005728 }
5729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005731
5732 if (context)
5733 {
5734 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5735 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005736 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005737 }
5738
5739 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5740 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005741 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005742 }
5743 }
5744 }
5745 catch(std::bad_alloc&)
5746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005748 }
5749}
5750
5751void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5752{
5753 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5754}
5755
5756void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005758 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005759 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005760
5761 try
5762 {
5763 switch (face)
5764 {
5765 case GL_FRONT:
5766 case GL_BACK:
5767 case GL_FRONT_AND_BACK:
5768 break;
5769 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005771 }
5772
5773 switch (fail)
5774 {
5775 case GL_ZERO:
5776 case GL_KEEP:
5777 case GL_REPLACE:
5778 case GL_INCR:
5779 case GL_DECR:
5780 case GL_INVERT:
5781 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005782 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005783 break;
5784 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005785 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005786 }
5787
5788 switch (zfail)
5789 {
5790 case GL_ZERO:
5791 case GL_KEEP:
5792 case GL_REPLACE:
5793 case GL_INCR:
5794 case GL_DECR:
5795 case GL_INVERT:
5796 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005797 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005798 break;
5799 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005801 }
5802
5803 switch (zpass)
5804 {
5805 case GL_ZERO:
5806 case GL_KEEP:
5807 case GL_REPLACE:
5808 case GL_INCR:
5809 case GL_DECR:
5810 case GL_INVERT:
5811 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005812 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005813 break;
5814 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005816 }
5817
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005818 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005819
5820 if (context)
5821 {
5822 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5823 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005824 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005825 }
5826
5827 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5828 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005829 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005830 }
5831 }
5832 }
5833 catch(std::bad_alloc&)
5834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836 }
5837}
5838
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005839GLboolean __stdcall glTestFenceNV(GLuint fence)
5840{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005841 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005842
5843 try
5844 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005845 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005846
5847 if (context)
5848 {
5849 gl::Fence *fenceObject = context->getFence(fence);
5850
5851 if (fenceObject == NULL)
5852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005853 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005854 }
5855
5856 return fenceObject->testFence();
5857 }
5858 }
5859 catch(std::bad_alloc&)
5860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005861 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005862 }
5863
5864 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005865}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005866
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005867void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5868 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005870 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005871 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005872 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005873
5874 try
5875 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005876 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005879 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005880
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005881 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005884 }
5885
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005886 // validate <type> by itself (used as secondary key below)
5887 switch (type)
5888 {
5889 case GL_UNSIGNED_BYTE:
5890 case GL_UNSIGNED_SHORT_5_6_5:
5891 case GL_UNSIGNED_SHORT_4_4_4_4:
5892 case GL_UNSIGNED_SHORT_5_5_5_1:
5893 case GL_UNSIGNED_SHORT:
5894 case GL_UNSIGNED_INT:
5895 case GL_UNSIGNED_INT_24_8_OES:
5896 case GL_HALF_FLOAT_OES:
5897 case GL_FLOAT:
5898 break;
5899 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005901 }
5902
5903 // validate <format> + <type> combinations
5904 // - invalid <format> -> sets INVALID_ENUM
5905 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005906 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005907 {
5908 case GL_ALPHA:
5909 case GL_LUMINANCE:
5910 case GL_LUMINANCE_ALPHA:
5911 switch (type)
5912 {
5913 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005914 case GL_FLOAT:
5915 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005916 break;
5917 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005918 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005919 }
5920 break;
5921 case GL_RGB:
5922 switch (type)
5923 {
5924 case GL_UNSIGNED_BYTE:
5925 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005926 case GL_FLOAT:
5927 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005928 break;
5929 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005931 }
5932 break;
5933 case GL_RGBA:
5934 switch (type)
5935 {
5936 case GL_UNSIGNED_BYTE:
5937 case GL_UNSIGNED_SHORT_4_4_4_4:
5938 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005939 case GL_FLOAT:
5940 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941 break;
5942 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944 }
5945 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005946 case GL_BGRA_EXT:
5947 switch (type)
5948 {
5949 case GL_UNSIGNED_BYTE:
5950 break;
5951 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005952 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005953 }
5954 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005955 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5956 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005957 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5958 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005959 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005960 case GL_DEPTH_COMPONENT:
5961 switch (type)
5962 {
5963 case GL_UNSIGNED_SHORT:
5964 case GL_UNSIGNED_INT:
5965 break;
5966 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005967 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005968 }
5969 break;
5970 case GL_DEPTH_STENCIL_OES:
5971 switch (type)
5972 {
5973 case GL_UNSIGNED_INT_24_8_OES:
5974 break;
5975 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005976 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005977 }
5978 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005979 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005980 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981 }
5982
5983 if (border != 0)
5984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005986 }
5987
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005988 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005989
5990 if (context)
5991 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005992 if (level > context->getMaximumTextureLevel())
5993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005995 }
5996
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005997 switch (target)
5998 {
5999 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006000 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6001 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006003 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006004 }
6005 break;
6006 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6007 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6008 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6009 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6010 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6011 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6012 if (width != height)
6013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006014 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006015 }
6016
6017 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6018 height > (context->getMaximumCubeTextureDimension() >> level))
6019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006020 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006021 }
6022 break;
6023 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006024 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006025 }
6026
gman@chromium.org50c526d2011-08-10 05:19:44 +00006027 switch (format) {
6028 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6029 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6030 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006031 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006032 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006033 }
6034 else
6035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006036 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006037 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006038 break;
6039 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6040 if (context->supportsDXT3Textures())
6041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006042 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006043 }
6044 else
6045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006046 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006047 }
6048 break;
6049 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6050 if (context->supportsDXT5Textures())
6051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006052 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006053 }
6054 else
6055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006056 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006057 }
6058 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006059 case GL_DEPTH_COMPONENT:
6060 case GL_DEPTH_STENCIL_OES:
6061 if (!context->supportsDepthTextures())
6062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006063 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006064 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006065 if (target != GL_TEXTURE_2D)
6066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006067 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006068 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006069 // OES_depth_texture supports loading depth data and multiple levels,
6070 // but ANGLE_depth_texture does not
6071 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006073 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006074 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006075 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006076 default:
6077 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006078 }
6079
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006080 if (type == GL_FLOAT)
6081 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006082 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006084 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006085 }
6086 }
6087 else if (type == GL_HALF_FLOAT_OES)
6088 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006089 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006091 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006092 }
6093 }
6094
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006095 if (target == GL_TEXTURE_2D)
6096 {
6097 gl::Texture2D *texture = context->getTexture2D();
6098
6099 if (!texture)
6100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006102 }
6103
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006104 if (texture->isImmutable())
6105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006106 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006107 }
6108
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006109 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006110 }
6111 else
6112 {
6113 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6114
6115 if (!texture)
6116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006117 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006118 }
6119
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006120 if (texture->isImmutable())
6121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006122 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006123 }
6124
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006125 switch (target)
6126 {
6127 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006128 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006129 break;
6130 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006131 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006132 break;
6133 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006134 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006135 break;
6136 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006137 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006138 break;
6139 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006140 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006141 break;
6142 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00006143 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006144 break;
6145 default: UNREACHABLE();
6146 }
6147 }
6148 }
6149 }
6150 catch(std::bad_alloc&)
6151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006152 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006153 }
6154}
6155
6156void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6157{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006158 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6159
6160 try
6161 {
6162 gl::Context *context = gl::getNonLostContext();
6163
6164 if (context)
6165 {
6166 gl::Texture *texture;
6167
6168 switch (target)
6169 {
6170 case GL_TEXTURE_2D:
6171 texture = context->getTexture2D();
6172 break;
6173 case GL_TEXTURE_CUBE_MAP:
6174 texture = context->getTextureCubeMap();
6175 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006176 case GL_TEXTURE_3D:
6177 if (context->getClientVersion() < 3)
6178 {
6179 return gl::error(GL_INVALID_ENUM);
6180 }
6181 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006182 case GL_TEXTURE_2D_ARRAY:
6183 if (context->getClientVersion() < 3)
6184 {
6185 return gl::error(GL_INVALID_ENUM);
6186 }
6187 texture = context->getTexture2DArray();
6188 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006189 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006190 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006191 }
6192
6193 switch (pname)
6194 {
6195 case GL_TEXTURE_WRAP_S:
6196 if (!texture->setWrapS((GLenum)param))
6197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006199 }
6200 break;
6201 case GL_TEXTURE_WRAP_T:
6202 if (!texture->setWrapT((GLenum)param))
6203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006204 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006205 }
6206 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006207 case GL_TEXTURE_WRAP_R:
6208 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6209 {
6210 return gl::error(GL_INVALID_ENUM);
6211 }
6212 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006213 case GL_TEXTURE_MIN_FILTER:
6214 if (!texture->setMinFilter((GLenum)param))
6215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006216 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006217 }
6218 break;
6219 case GL_TEXTURE_MAG_FILTER:
6220 if (!texture->setMagFilter((GLenum)param))
6221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006222 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006223 }
6224 break;
6225 case GL_TEXTURE_USAGE_ANGLE:
6226 if (!texture->setUsage((GLenum)param))
6227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006229 }
6230 break;
6231 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6232 if (!context->supportsTextureFilterAnisotropy())
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006235 }
6236 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006239 }
6240 break;
6241 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006242 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006243 }
6244 }
6245 }
6246 catch(std::bad_alloc&)
6247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006248 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006249 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006250}
6251
6252void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6253{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006254 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006255}
6256
6257void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006259 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006260
6261 try
6262 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006263 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006264
6265 if (context)
6266 {
6267 gl::Texture *texture;
6268
6269 switch (target)
6270 {
6271 case GL_TEXTURE_2D:
6272 texture = context->getTexture2D();
6273 break;
6274 case GL_TEXTURE_CUBE_MAP:
6275 texture = context->getTextureCubeMap();
6276 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006277 case GL_TEXTURE_3D:
6278 if (context->getClientVersion() < 3)
6279 {
6280 return gl::error(GL_INVALID_ENUM);
6281 }
6282 texture = context->getTexture3D();
6283 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006284 case GL_TEXTURE_2D_ARRAY:
6285 if (context->getClientVersion() < 3)
6286 {
6287 return gl::error(GL_INVALID_ENUM);
6288 }
6289 texture = context->getTexture2DArray();
6290 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006291 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006292 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006293 }
6294
6295 switch (pname)
6296 {
6297 case GL_TEXTURE_WRAP_S:
6298 if (!texture->setWrapS((GLenum)param))
6299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006300 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006301 }
6302 break;
6303 case GL_TEXTURE_WRAP_T:
6304 if (!texture->setWrapT((GLenum)param))
6305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006306 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006307 }
6308 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006309 case GL_TEXTURE_WRAP_R:
6310 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6311 {
6312 return gl::error(GL_INVALID_ENUM);
6313 }
6314 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006315 case GL_TEXTURE_MIN_FILTER:
6316 if (!texture->setMinFilter((GLenum)param))
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320 break;
6321 case GL_TEXTURE_MAG_FILTER:
6322 if (!texture->setMagFilter((GLenum)param))
6323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006325 }
6326 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006327 case GL_TEXTURE_USAGE_ANGLE:
6328 if (!texture->setUsage((GLenum)param))
6329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006331 }
6332 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006333 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6334 if (!context->supportsTextureFilterAnisotropy())
6335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006336 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006337 }
6338 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006341 }
6342 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006344 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006345 }
6346 }
6347 }
6348 catch(std::bad_alloc&)
6349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006351 }
6352}
6353
6354void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6355{
6356 glTexParameteri(target, pname, *params);
6357}
6358
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006359void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6360{
6361 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6362 target, levels, internalformat, width, height);
6363
6364 try
6365 {
6366 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6367 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006368 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006369 }
6370
6371 if (width < 1 || height < 1 || levels < 1)
6372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006374 }
6375
6376 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006379 }
6380
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006381 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006383 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006384 }
6385
6386 GLenum format = gl::ExtractFormat(internalformat);
6387 GLenum type = gl::ExtractType(internalformat);
6388
6389 if (format == GL_NONE || type == GL_NONE)
6390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006392 }
6393
6394 gl::Context *context = gl::getNonLostContext();
6395
6396 if (context)
6397 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006398 switch (target)
6399 {
6400 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006401 if (width > context->getMaximum2DTextureDimension() ||
6402 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006404 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006405 }
6406 break;
6407 case GL_TEXTURE_CUBE_MAP:
6408 if (width > context->getMaximumCubeTextureDimension() ||
6409 height > context->getMaximumCubeTextureDimension())
6410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006412 }
6413 break;
6414 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006415 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006416 }
6417
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006418 if (levels != 1 && !context->supportsNonPower2Texture())
6419 {
6420 if (!gl::isPow2(width) || !gl::isPow2(height))
6421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006423 }
6424 }
6425
daniel@transgaming.come1077362011-11-11 04:16:50 +00006426 switch (internalformat)
6427 {
6428 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6429 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6430 if (!context->supportsDXT1Textures())
6431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006432 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006433 }
6434 break;
6435 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6436 if (!context->supportsDXT3Textures())
6437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006439 }
6440 break;
6441 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6442 if (!context->supportsDXT5Textures())
6443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006444 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006445 }
6446 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006447 case GL_RGBA32F_EXT:
6448 case GL_RGB32F_EXT:
6449 case GL_ALPHA32F_EXT:
6450 case GL_LUMINANCE32F_EXT:
6451 case GL_LUMINANCE_ALPHA32F_EXT:
6452 if (!context->supportsFloat32Textures())
6453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006455 }
6456 break;
6457 case GL_RGBA16F_EXT:
6458 case GL_RGB16F_EXT:
6459 case GL_ALPHA16F_EXT:
6460 case GL_LUMINANCE16F_EXT:
6461 case GL_LUMINANCE_ALPHA16F_EXT:
6462 if (!context->supportsFloat16Textures())
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006465 }
6466 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006467 case GL_DEPTH_COMPONENT16:
6468 case GL_DEPTH_COMPONENT32_OES:
6469 case GL_DEPTH24_STENCIL8_OES:
6470 if (!context->supportsDepthTextures())
6471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006472 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006473 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006474 if (target != GL_TEXTURE_2D)
6475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006476 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006477 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006478 // ANGLE_depth_texture only supports 1-level textures
6479 if (levels != 1)
6480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006482 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006483 break;
6484 default:
6485 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006486 }
6487
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006488 if (target == GL_TEXTURE_2D)
6489 {
6490 gl::Texture2D *texture = context->getTexture2D();
6491
6492 if (!texture || texture->id() == 0)
6493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006494 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006495 }
6496
6497 if (texture->isImmutable())
6498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006499 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006500 }
6501
6502 texture->storage(levels, internalformat, width, height);
6503 }
6504 else if (target == GL_TEXTURE_CUBE_MAP)
6505 {
6506 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6507
6508 if (!texture || texture->id() == 0)
6509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006511 }
6512
6513 if (texture->isImmutable())
6514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006516 }
6517
6518 texture->storage(levels, internalformat, width);
6519 }
6520 else UNREACHABLE();
6521 }
6522 }
6523 catch(std::bad_alloc&)
6524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006526 }
6527}
6528
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006529void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6530 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006532 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006533 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006534 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006535 target, level, xoffset, yoffset, width, height, format, type, pixels);
6536
6537 try
6538 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006539 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006541 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006542 }
6543
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006544 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006546 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006547 }
6548
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006549 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006551 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006552 }
6553
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006554 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006555 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006556 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006557 }
6558
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006560
6561 if (context)
6562 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006563 if (level > context->getMaximumTextureLevel())
6564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006565 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006566 }
6567
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006568 if (format == GL_FLOAT)
6569 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006570 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006572 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006573 }
6574 }
6575 else if (format == GL_HALF_FLOAT_OES)
6576 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006577 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006580 }
6581 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006582 else if (gl::IsDepthTexture(format))
6583 {
6584 if (!context->supportsDepthTextures())
6585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006587 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006588 if (target != GL_TEXTURE_2D)
6589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006590 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006591 }
6592 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006593 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006594 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006595
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006596 if (width == 0 || height == 0 || pixels == NULL)
6597 {
6598 return;
6599 }
6600
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006601 if (target == GL_TEXTURE_2D)
6602 {
6603 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006604 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006605 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006606 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006607 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006608 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006609 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006610 {
6611 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006612 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006613 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006614 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006615 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006616 }
6617 else
6618 {
6619 UNREACHABLE();
6620 }
6621 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006622 }
6623 catch(std::bad_alloc&)
6624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006626 }
6627}
6628
6629void __stdcall glUniform1f(GLint location, GLfloat x)
6630{
6631 glUniform1fv(location, 1, &x);
6632}
6633
6634void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006636 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006637
6638 try
6639 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006640 if (count < 0)
6641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643 }
6644
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006645 if (location == -1)
6646 {
6647 return;
6648 }
6649
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006650 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006651
6652 if (context)
6653 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006654 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006655 if (!programBinary)
6656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006657 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006658 }
6659
6660 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006662 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006663 }
6664 }
6665 }
6666 catch(std::bad_alloc&)
6667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006669 }
6670}
6671
6672void __stdcall glUniform1i(GLint location, GLint x)
6673{
6674 glUniform1iv(location, 1, &x);
6675}
6676
6677void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6678{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006679 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006680
6681 try
6682 {
6683 if (count < 0)
6684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006685 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006686 }
6687
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006688 if (location == -1)
6689 {
6690 return;
6691 }
6692
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006693 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006694
6695 if (context)
6696 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006697 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006698 if (!programBinary)
6699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006700 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006701 }
6702
6703 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006705 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006706 }
6707 }
6708 }
6709 catch(std::bad_alloc&)
6710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006711 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006712 }
6713}
6714
6715void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6716{
6717 GLfloat xy[2] = {x, y};
6718
6719 glUniform2fv(location, 1, (GLfloat*)&xy);
6720}
6721
6722void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6723{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006724 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006725
6726 try
6727 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006728 if (count < 0)
6729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006731 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006732
6733 if (location == -1)
6734 {
6735 return;
6736 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006737
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006738 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006739
6740 if (context)
6741 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006742 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006743 if (!programBinary)
6744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006745 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006746 }
6747
6748 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006750 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006751 }
6752 }
6753 }
6754 catch(std::bad_alloc&)
6755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006756 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006757 }
6758}
6759
6760void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6761{
6762 GLint xy[4] = {x, y};
6763
6764 glUniform2iv(location, 1, (GLint*)&xy);
6765}
6766
6767void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6768{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006769 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006770
6771 try
6772 {
6773 if (count < 0)
6774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006775 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006776 }
6777
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006778 if (location == -1)
6779 {
6780 return;
6781 }
6782
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006783 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006784
6785 if (context)
6786 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006787 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006788 if (!programBinary)
6789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006790 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006791 }
6792
6793 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006795 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006796 }
6797 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006798 }
6799 catch(std::bad_alloc&)
6800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006801 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006802 }
6803}
6804
6805void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6806{
6807 GLfloat xyz[3] = {x, y, z};
6808
6809 glUniform3fv(location, 1, (GLfloat*)&xyz);
6810}
6811
6812void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6813{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006814 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006815
6816 try
6817 {
6818 if (count < 0)
6819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006820 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006821 }
6822
6823 if (location == -1)
6824 {
6825 return;
6826 }
6827
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006828 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006829
6830 if (context)
6831 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006832 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006833 if (!programBinary)
6834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006835 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006836 }
6837
6838 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006840 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006841 }
6842 }
6843 }
6844 catch(std::bad_alloc&)
6845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006846 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006847 }
6848}
6849
6850void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6851{
6852 GLint xyz[3] = {x, y, z};
6853
6854 glUniform3iv(location, 1, (GLint*)&xyz);
6855}
6856
6857void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6858{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006859 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006860
6861 try
6862 {
6863 if (count < 0)
6864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006865 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006866 }
6867
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006868 if (location == -1)
6869 {
6870 return;
6871 }
6872
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006873 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006874
6875 if (context)
6876 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006877 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006878 if (!programBinary)
6879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006880 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006881 }
6882
6883 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006886 }
6887 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006888 }
6889 catch(std::bad_alloc&)
6890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006891 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006892 }
6893}
6894
6895void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6896{
6897 GLfloat xyzw[4] = {x, y, z, w};
6898
6899 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6900}
6901
6902void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006904 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006905
6906 try
6907 {
6908 if (count < 0)
6909 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006910 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006911 }
6912
6913 if (location == -1)
6914 {
6915 return;
6916 }
6917
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006919
6920 if (context)
6921 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006922 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006923 if (!programBinary)
6924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006925 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006926 }
6927
6928 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006931 }
6932 }
6933 }
6934 catch(std::bad_alloc&)
6935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006937 }
6938}
6939
6940void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6941{
6942 GLint xyzw[4] = {x, y, z, w};
6943
6944 glUniform4iv(location, 1, (GLint*)&xyzw);
6945}
6946
6947void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006949 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006950
6951 try
6952 {
6953 if (count < 0)
6954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006955 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006956 }
6957
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006958 if (location == -1)
6959 {
6960 return;
6961 }
6962
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006964
6965 if (context)
6966 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006967 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006968 if (!programBinary)
6969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006970 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006971 }
6972
6973 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006975 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006976 }
6977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006978 }
6979 catch(std::bad_alloc&)
6980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006981 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006982 }
6983}
6984
6985void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6986{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00006987 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006988 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006989
6990 try
6991 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00006992 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006995 }
6996
6997 if (location == -1)
6998 {
6999 return;
7000 }
7001
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007002 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007003
7004 if (context)
7005 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007006 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7007 {
7008 return gl::error(GL_INVALID_VALUE);
7009 }
7010
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007011 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007012 if (!programBinary)
7013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007014 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007015 }
7016
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007017 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007019 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007020 }
7021 }
7022 }
7023 catch(std::bad_alloc&)
7024 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007025 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007026 }
7027}
7028
7029void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7030{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007031 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007032 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007033
7034 try
7035 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007036 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007038 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007039 }
7040
7041 if (location == -1)
7042 {
7043 return;
7044 }
7045
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007047
7048 if (context)
7049 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007050 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7051 {
7052 return gl::error(GL_INVALID_VALUE);
7053 }
7054
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007055 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007056 if (!programBinary)
7057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007058 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007059 }
7060
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007061 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007063 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007064 }
7065 }
7066 }
7067 catch(std::bad_alloc&)
7068 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007069 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007070 }
7071}
7072
7073void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7074{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007075 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007076 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007077
7078 try
7079 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007080 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007083 }
7084
7085 if (location == -1)
7086 {
7087 return;
7088 }
7089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007091
7092 if (context)
7093 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007094 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7095 {
7096 return gl::error(GL_INVALID_VALUE);
7097 }
7098
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007099 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007100 if (!programBinary)
7101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007102 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007103 }
7104
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007105 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007107 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007108 }
7109 }
7110 }
7111 catch(std::bad_alloc&)
7112 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007113 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007114 }
7115}
7116
7117void __stdcall glUseProgram(GLuint program)
7118{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007119 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007120
7121 try
7122 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007123 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007124
7125 if (context)
7126 {
7127 gl::Program *programObject = context->getProgram(program);
7128
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007129 if (!programObject && program != 0)
7130 {
7131 if (context->getShader(program))
7132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007133 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007134 }
7135 else
7136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007137 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007138 }
7139 }
7140
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007141 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007143 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007144 }
7145
7146 context->useProgram(program);
7147 }
7148 }
7149 catch(std::bad_alloc&)
7150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007151 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007152 }
7153}
7154
7155void __stdcall glValidateProgram(GLuint program)
7156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007157 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007158
7159 try
7160 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007161 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007162
7163 if (context)
7164 {
7165 gl::Program *programObject = context->getProgram(program);
7166
7167 if (!programObject)
7168 {
7169 if (context->getShader(program))
7170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007171 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007172 }
7173 else
7174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007176 }
7177 }
7178
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007179 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007180 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007181 }
7182 catch(std::bad_alloc&)
7183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007184 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007185 }
7186}
7187
7188void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7189{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007190 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007191
7192 try
7193 {
7194 if (index >= gl::MAX_VERTEX_ATTRIBS)
7195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007196 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007197 }
7198
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007199 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007200
7201 if (context)
7202 {
7203 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007204 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007205 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007206 }
7207 catch(std::bad_alloc&)
7208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007210 }
7211}
7212
7213void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007215 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007216
7217 try
7218 {
7219 if (index >= gl::MAX_VERTEX_ATTRIBS)
7220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007222 }
7223
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007225
7226 if (context)
7227 {
7228 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007229 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007230 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007231 }
7232 catch(std::bad_alloc&)
7233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007235 }
7236}
7237
7238void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7239{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007240 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007241
7242 try
7243 {
7244 if (index >= gl::MAX_VERTEX_ATTRIBS)
7245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007246 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007247 }
7248
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007249 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007250
7251 if (context)
7252 {
7253 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007254 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007255 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007256 }
7257 catch(std::bad_alloc&)
7258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007260 }
7261}
7262
7263void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007265 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007266
7267 try
7268 {
7269 if (index >= gl::MAX_VERTEX_ATTRIBS)
7270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007271 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007272 }
7273
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007275
7276 if (context)
7277 {
7278 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007279 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007281 }
7282 catch(std::bad_alloc&)
7283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007285 }
7286}
7287
7288void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7289{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007290 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007291
7292 try
7293 {
7294 if (index >= gl::MAX_VERTEX_ATTRIBS)
7295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007297 }
7298
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007299 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007300
7301 if (context)
7302 {
7303 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007304 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007305 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007306 }
7307 catch(std::bad_alloc&)
7308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007309 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007310 }
7311}
7312
7313void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7314{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007315 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007316
7317 try
7318 {
7319 if (index >= gl::MAX_VERTEX_ATTRIBS)
7320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007321 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007322 }
7323
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007325
7326 if (context)
7327 {
7328 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007329 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007330 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007331 }
7332 catch(std::bad_alloc&)
7333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007334 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007335 }
7336}
7337
7338void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7339{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007340 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007341
7342 try
7343 {
7344 if (index >= gl::MAX_VERTEX_ATTRIBS)
7345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007346 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007347 }
7348
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007350
7351 if (context)
7352 {
7353 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007354 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007355 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007356 }
7357 catch(std::bad_alloc&)
7358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007359 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007360 }
7361}
7362
7363void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7364{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007365 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007366
7367 try
7368 {
7369 if (index >= gl::MAX_VERTEX_ATTRIBS)
7370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007371 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007372 }
7373
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007374 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007375
7376 if (context)
7377 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007378 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007379 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007380 }
7381 catch(std::bad_alloc&)
7382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007383 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007384 }
7385}
7386
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007387void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7388{
7389 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7390
7391 try
7392 {
7393 if (index >= gl::MAX_VERTEX_ATTRIBS)
7394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007395 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007396 }
7397
7398 gl::Context *context = gl::getNonLostContext();
7399
7400 if (context)
7401 {
7402 context->setVertexAttribDivisor(index, divisor);
7403 }
7404 }
7405 catch(std::bad_alloc&)
7406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007407 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007408 }
7409}
7410
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007411void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007413 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007414 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007415 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007416
7417 try
7418 {
7419 if (index >= gl::MAX_VERTEX_ATTRIBS)
7420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007421 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007422 }
7423
7424 if (size < 1 || size > 4)
7425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007427 }
7428
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007429 gl::Context *context = gl::getNonLostContext();
7430
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007431 switch (type)
7432 {
7433 case GL_BYTE:
7434 case GL_UNSIGNED_BYTE:
7435 case GL_SHORT:
7436 case GL_UNSIGNED_SHORT:
7437 case GL_FIXED:
7438 case GL_FLOAT:
7439 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007440 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007441 case GL_INT:
7442 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007443 case GL_INT_2_10_10_10_REV:
7444 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007445 if (context && context->getClientVersion() < 3)
7446 {
7447 return gl::error(GL_INVALID_ENUM);
7448 }
7449 else
7450 {
7451 break;
7452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007453 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007455 }
7456
7457 if (stride < 0)
7458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007459 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007460 }
7461
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007462 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7463 {
7464 return gl::error(GL_INVALID_OPERATION);
7465 }
7466
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007467 if (context)
7468 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007469 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7470 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007471 }
7472 }
7473 catch(std::bad_alloc&)
7474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007475 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007476 }
7477}
7478
7479void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7480{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007481 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007482
7483 try
7484 {
7485 if (width < 0 || height < 0)
7486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007487 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007488 }
7489
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007490 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007491
7492 if (context)
7493 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007494 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007495 }
7496 }
7497 catch(std::bad_alloc&)
7498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007499 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007500 }
7501}
7502
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007503// OpenGL ES 3.0 functions
7504
7505void __stdcall glReadBuffer(GLenum mode)
7506{
7507 EVENT("(GLenum mode = 0x%X)", mode);
7508
7509 try
7510 {
7511 gl::Context *context = gl::getNonLostContext();
7512
7513 if (context)
7514 {
7515 if (context->getClientVersion() < 3)
7516 {
7517 return gl::error(GL_INVALID_OPERATION);
7518 }
7519 }
7520
7521 UNIMPLEMENTED();
7522 }
7523 catch(std::bad_alloc&)
7524 {
7525 return gl::error(GL_OUT_OF_MEMORY);
7526 }
7527}
7528
7529void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7530{
7531 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7532 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7533
7534 try
7535 {
7536 gl::Context *context = gl::getNonLostContext();
7537
7538 if (context)
7539 {
7540 if (context->getClientVersion() < 3)
7541 {
7542 return gl::error(GL_INVALID_OPERATION);
7543 }
7544 }
7545
7546 UNIMPLEMENTED();
7547 }
7548 catch(std::bad_alloc&)
7549 {
7550 return gl::error(GL_OUT_OF_MEMORY);
7551 }
7552}
7553
7554void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7555{
7556 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7557 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7558 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7559 target, level, internalformat, width, height, depth, border, format, type, pixels);
7560
7561 try
7562 {
7563 gl::Context *context = gl::getNonLostContext();
7564
7565 if (context)
7566 {
7567 if (context->getClientVersion() < 3)
7568 {
7569 return gl::error(GL_INVALID_OPERATION);
7570 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007571
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007572 // validateES3TexImageFormat sets the error code if there is an error
7573 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7574 0, 0, 0, width, height, depth, border, format, type))
7575 {
7576 return;
7577 }
7578
7579 switch(target)
7580 {
7581 case GL_TEXTURE_3D:
7582 {
7583 gl::Texture3D *texture = context->getTexture3D();
7584 texture->setImage(level, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7585 }
7586 break;
7587
7588 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007589 {
7590 gl::Texture2DArray *texture = context->getTexture2DArray();
7591 texture->setImage(level, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7592 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007593 break;
7594
7595 default:
7596 return gl::error(GL_INVALID_ENUM);
7597 }
7598 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007599 }
7600 catch(std::bad_alloc&)
7601 {
7602 return gl::error(GL_OUT_OF_MEMORY);
7603 }
7604}
7605
7606void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
7607{
7608 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7609 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7610 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7611 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7612
7613 try
7614 {
7615 gl::Context *context = gl::getNonLostContext();
7616
7617 if (context)
7618 {
7619 if (context->getClientVersion() < 3)
7620 {
7621 return gl::error(GL_INVALID_OPERATION);
7622 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007623
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007624 if (!pixels)
7625 {
7626 return gl::error(GL_INVALID_VALUE);
7627 }
7628
7629 // validateES3TexImageFormat sets the error code if there is an error
7630 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7631 xoffset, yoffset, zoffset, width, height, depth, 0,
7632 format, type))
7633 {
7634 return;
7635 }
7636
7637 switch(target)
7638 {
7639 case GL_TEXTURE_3D:
7640 {
7641 gl::Texture3D *texture = context->getTexture3D();
7642 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7643 }
7644 break;
7645
7646 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007647 {
7648 gl::Texture2DArray *texture = context->getTexture2DArray();
7649 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7650 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007651 break;
7652
7653 default:
7654 return gl::error(GL_INVALID_ENUM);
7655 }
7656 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007657 }
7658 catch(std::bad_alloc&)
7659 {
7660 return gl::error(GL_OUT_OF_MEMORY);
7661 }
7662}
7663
7664void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7665{
7666 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7667 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7668 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7669
7670 try
7671 {
7672 gl::Context *context = gl::getNonLostContext();
7673
7674 if (context)
7675 {
7676 if (context->getClientVersion() < 3)
7677 {
7678 return gl::error(GL_INVALID_OPERATION);
7679 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007680
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007681 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7682 x, y, width, height))
7683 {
7684 return;
7685 }
7686
7687 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7688 gl::Texture *texture = NULL;
7689 switch (target)
7690 {
7691 case GL_TEXTURE_3D:
7692 texture = context->getTexture3D();
7693 break;
7694
7695 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007696 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007697 break;
7698
7699 default:
7700 return gl::error(GL_INVALID_ENUM);
7701 }
7702
7703 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007705 }
7706 catch(std::bad_alloc&)
7707 {
7708 return gl::error(GL_OUT_OF_MEMORY);
7709 }
7710}
7711
7712void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7713{
7714 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7715 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7716 "const GLvoid* data = 0x%0.8p)",
7717 target, level, internalformat, width, height, depth, border, imageSize, data);
7718
7719 try
7720 {
7721 gl::Context *context = gl::getNonLostContext();
7722
7723 if (context)
7724 {
7725 if (context->getClientVersion() < 3)
7726 {
7727 return gl::error(GL_INVALID_OPERATION);
7728 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007729
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007730 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, internalformat))
7731 {
7732 return gl::error(GL_INVALID_VALUE);
7733 }
7734
7735 // validateES3TexImageFormat sets the error code if there is an error
7736 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7737 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7738 {
7739 return;
7740 }
7741
7742 switch(target)
7743 {
7744 case GL_TEXTURE_3D:
7745 {
7746 gl::Texture3D *texture = context->getTexture3D();
7747 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7748 }
7749 break;
7750
7751 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007752 {
7753 gl::Texture2DArray *texture = context->getTexture2DArray();
7754 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7755 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007756 break;
7757
7758 default:
7759 return gl::error(GL_INVALID_ENUM);
7760 }
7761 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007762 }
7763 catch(std::bad_alloc&)
7764 {
7765 return gl::error(GL_OUT_OF_MEMORY);
7766 }
7767}
7768
7769void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
7770{
7771 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7772 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7773 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7774 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7775
7776 try
7777 {
7778 gl::Context *context = gl::getNonLostContext();
7779
7780 if (context)
7781 {
7782 if (context->getClientVersion() < 3)
7783 {
7784 return gl::error(GL_INVALID_OPERATION);
7785 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007786
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007787 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, format))
7788 {
7789 return gl::error(GL_INVALID_VALUE);
7790 }
7791
7792 if (!data)
7793 {
7794 return gl::error(GL_INVALID_VALUE);
7795 }
7796
7797 // validateES3TexImageFormat sets the error code if there is an error
7798 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7799 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7800 {
7801 return;
7802 }
7803
7804 switch(target)
7805 {
7806 case GL_TEXTURE_3D:
7807 {
7808 gl::Texture3D *texture = context->getTexture3D();
7809 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7810 format, imageSize, data);
7811 }
7812 break;
7813
7814 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007815 {
7816 gl::Texture2DArray *texture = context->getTexture2DArray();
7817 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7818 format, imageSize, data);
7819 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007820 break;
7821
7822 default:
7823 return gl::error(GL_INVALID_ENUM);
7824 }
7825 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007826 }
7827 catch(std::bad_alloc&)
7828 {
7829 return gl::error(GL_OUT_OF_MEMORY);
7830 }
7831}
7832
7833void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7834{
7835 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7836
7837 try
7838 {
7839 gl::Context *context = gl::getNonLostContext();
7840
7841 if (context)
7842 {
7843 if (context->getClientVersion() < 3)
7844 {
7845 return gl::error(GL_INVALID_OPERATION);
7846 }
7847 }
7848
7849 UNIMPLEMENTED();
7850 }
7851 catch(std::bad_alloc&)
7852 {
7853 return gl::error(GL_OUT_OF_MEMORY);
7854 }
7855}
7856
7857void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7858{
7859 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7860
7861 try
7862 {
7863 gl::Context *context = gl::getNonLostContext();
7864
7865 if (context)
7866 {
7867 if (context->getClientVersion() < 3)
7868 {
7869 return gl::error(GL_INVALID_OPERATION);
7870 }
7871 }
7872
7873 UNIMPLEMENTED();
7874 }
7875 catch(std::bad_alloc&)
7876 {
7877 return gl::error(GL_OUT_OF_MEMORY);
7878 }
7879}
7880
7881GLboolean __stdcall glIsQuery(GLuint id)
7882{
7883 EVENT("(GLuint id = %u)", id);
7884
7885 try
7886 {
7887 gl::Context *context = gl::getNonLostContext();
7888
7889 if (context)
7890 {
7891 if (context->getClientVersion() < 3)
7892 {
7893 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7894 }
7895 }
7896
7897 UNIMPLEMENTED();
7898 }
7899 catch(std::bad_alloc&)
7900 {
7901 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7902 }
7903
7904 return GL_FALSE;
7905}
7906
7907void __stdcall glBeginQuery(GLenum target, GLuint id)
7908{
7909 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7910
7911 try
7912 {
7913 gl::Context *context = gl::getNonLostContext();
7914
7915 if (context)
7916 {
7917 if (context->getClientVersion() < 3)
7918 {
7919 return gl::error(GL_INVALID_OPERATION);
7920 }
7921 }
7922
7923 UNIMPLEMENTED();
7924 }
7925 catch(std::bad_alloc&)
7926 {
7927 return gl::error(GL_OUT_OF_MEMORY);
7928 }
7929}
7930
7931void __stdcall glEndQuery(GLenum target)
7932{
7933 EVENT("(GLenum target = 0x%X)", target);
7934
7935 try
7936 {
7937 gl::Context *context = gl::getNonLostContext();
7938
7939 if (context)
7940 {
7941 if (context->getClientVersion() < 3)
7942 {
7943 return gl::error(GL_INVALID_OPERATION);
7944 }
7945 }
7946
7947 UNIMPLEMENTED();
7948 }
7949 catch(std::bad_alloc&)
7950 {
7951 return gl::error(GL_OUT_OF_MEMORY);
7952 }
7953}
7954
7955void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7956{
7957 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7958
7959 try
7960 {
7961 gl::Context *context = gl::getNonLostContext();
7962
7963 if (context)
7964 {
7965 if (context->getClientVersion() < 3)
7966 {
7967 return gl::error(GL_INVALID_OPERATION);
7968 }
7969 }
7970
7971 UNIMPLEMENTED();
7972 }
7973 catch(std::bad_alloc&)
7974 {
7975 return gl::error(GL_OUT_OF_MEMORY);
7976 }
7977}
7978
7979void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7980{
7981 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7982
7983 try
7984 {
7985 gl::Context *context = gl::getNonLostContext();
7986
7987 if (context)
7988 {
7989 if (context->getClientVersion() < 3)
7990 {
7991 return gl::error(GL_INVALID_OPERATION);
7992 }
7993 }
7994
7995 UNIMPLEMENTED();
7996 }
7997 catch(std::bad_alloc&)
7998 {
7999 return gl::error(GL_OUT_OF_MEMORY);
8000 }
8001}
8002
8003GLboolean __stdcall glUnmapBuffer(GLenum target)
8004{
8005 EVENT("(GLenum target = 0x%X)", target);
8006
8007 try
8008 {
8009 gl::Context *context = gl::getNonLostContext();
8010
8011 if (context)
8012 {
8013 if (context->getClientVersion() < 3)
8014 {
8015 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8016 }
8017 }
8018
8019 UNIMPLEMENTED();
8020 }
8021 catch(std::bad_alloc&)
8022 {
8023 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8024 }
8025
8026 return GL_FALSE;
8027}
8028
8029void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8030{
8031 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8032
8033 try
8034 {
8035 gl::Context *context = gl::getNonLostContext();
8036
8037 if (context)
8038 {
8039 if (context->getClientVersion() < 3)
8040 {
8041 return gl::error(GL_INVALID_OPERATION);
8042 }
8043 }
8044
8045 UNIMPLEMENTED();
8046 }
8047 catch(std::bad_alloc&)
8048 {
8049 return gl::error(GL_OUT_OF_MEMORY);
8050 }
8051}
8052
8053void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8054{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008055 try
8056 {
8057 gl::Context *context = gl::getNonLostContext();
8058
8059 if (context)
8060 {
8061 if (context->getClientVersion() < 3)
8062 {
8063 return gl::error(GL_INVALID_OPERATION);
8064 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008065
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008066 glDrawBuffersEXT(n, bufs);
8067 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008068 }
8069 catch(std::bad_alloc&)
8070 {
8071 return gl::error(GL_OUT_OF_MEMORY);
8072 }
8073}
8074
8075void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8076{
8077 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8078 location, count, transpose, value);
8079
8080 try
8081 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008082 if (count < 0)
8083 {
8084 return gl::error(GL_INVALID_VALUE);
8085 }
8086
8087 if (location == -1)
8088 {
8089 return;
8090 }
8091
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008092 gl::Context *context = gl::getNonLostContext();
8093
8094 if (context)
8095 {
8096 if (context->getClientVersion() < 3)
8097 {
8098 return gl::error(GL_INVALID_OPERATION);
8099 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008100
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008101 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8102 if (!programBinary)
8103 {
8104 return gl::error(GL_INVALID_OPERATION);
8105 }
8106
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008107 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008108 {
8109 return gl::error(GL_INVALID_OPERATION);
8110 }
8111 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008112 }
8113 catch(std::bad_alloc&)
8114 {
8115 return gl::error(GL_OUT_OF_MEMORY);
8116 }
8117}
8118
8119void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8120{
8121 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8122 location, count, transpose, value);
8123
8124 try
8125 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008126 if (count < 0)
8127 {
8128 return gl::error(GL_INVALID_VALUE);
8129 }
8130
8131 if (location == -1)
8132 {
8133 return;
8134 }
8135
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008136 gl::Context *context = gl::getNonLostContext();
8137
8138 if (context)
8139 {
8140 if (context->getClientVersion() < 3)
8141 {
8142 return gl::error(GL_INVALID_OPERATION);
8143 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008144
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008145 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8146 if (!programBinary)
8147 {
8148 return gl::error(GL_INVALID_OPERATION);
8149 }
8150
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008151 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008152 {
8153 return gl::error(GL_INVALID_OPERATION);
8154 }
8155 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008156 }
8157 catch(std::bad_alloc&)
8158 {
8159 return gl::error(GL_OUT_OF_MEMORY);
8160 }
8161}
8162
8163void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8164{
8165 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8166 location, count, transpose, value);
8167
8168 try
8169 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008170 if (count < 0)
8171 {
8172 return gl::error(GL_INVALID_VALUE);
8173 }
8174
8175 if (location == -1)
8176 {
8177 return;
8178 }
8179
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008180 gl::Context *context = gl::getNonLostContext();
8181
8182 if (context)
8183 {
8184 if (context->getClientVersion() < 3)
8185 {
8186 return gl::error(GL_INVALID_OPERATION);
8187 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008188
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008189 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8190 if (!programBinary)
8191 {
8192 return gl::error(GL_INVALID_OPERATION);
8193 }
8194
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008195 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008196 {
8197 return gl::error(GL_INVALID_OPERATION);
8198 }
8199 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008200 }
8201 catch(std::bad_alloc&)
8202 {
8203 return gl::error(GL_OUT_OF_MEMORY);
8204 }
8205}
8206
8207void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8208{
8209 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8210 location, count, transpose, value);
8211
8212 try
8213 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008214 if (count < 0)
8215 {
8216 return gl::error(GL_INVALID_VALUE);
8217 }
8218
8219 if (location == -1)
8220 {
8221 return;
8222 }
8223
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008224 gl::Context *context = gl::getNonLostContext();
8225
8226 if (context)
8227 {
8228 if (context->getClientVersion() < 3)
8229 {
8230 return gl::error(GL_INVALID_OPERATION);
8231 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008232
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008233 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8234 if (!programBinary)
8235 {
8236 return gl::error(GL_INVALID_OPERATION);
8237 }
8238
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008239 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008240 {
8241 return gl::error(GL_INVALID_OPERATION);
8242 }
8243 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008244 }
8245 catch(std::bad_alloc&)
8246 {
8247 return gl::error(GL_OUT_OF_MEMORY);
8248 }
8249}
8250
8251void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8252{
8253 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8254 location, count, transpose, value);
8255
8256 try
8257 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008258 if (count < 0)
8259 {
8260 return gl::error(GL_INVALID_VALUE);
8261 }
8262
8263 if (location == -1)
8264 {
8265 return;
8266 }
8267
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008268 gl::Context *context = gl::getNonLostContext();
8269
8270 if (context)
8271 {
8272 if (context->getClientVersion() < 3)
8273 {
8274 return gl::error(GL_INVALID_OPERATION);
8275 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008276
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008277 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8278 if (!programBinary)
8279 {
8280 return gl::error(GL_INVALID_OPERATION);
8281 }
8282
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008283 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008284 {
8285 return gl::error(GL_INVALID_OPERATION);
8286 }
8287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008288 }
8289 catch(std::bad_alloc&)
8290 {
8291 return gl::error(GL_OUT_OF_MEMORY);
8292 }
8293}
8294
8295void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8296{
8297 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8298 location, count, transpose, value);
8299
8300 try
8301 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008302 if (count < 0)
8303 {
8304 return gl::error(GL_INVALID_VALUE);
8305 }
8306
8307 if (location == -1)
8308 {
8309 return;
8310 }
8311
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008312 gl::Context *context = gl::getNonLostContext();
8313
8314 if (context)
8315 {
8316 if (context->getClientVersion() < 3)
8317 {
8318 return gl::error(GL_INVALID_OPERATION);
8319 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008320
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008321 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8322 if (!programBinary)
8323 {
8324 return gl::error(GL_INVALID_OPERATION);
8325 }
8326
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008327 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008328 {
8329 return gl::error(GL_INVALID_OPERATION);
8330 }
8331 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008332 }
8333 catch(std::bad_alloc&)
8334 {
8335 return gl::error(GL_OUT_OF_MEMORY);
8336 }
8337}
8338
8339void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8340{
8341 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8342 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8343 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8344
8345 try
8346 {
8347 gl::Context *context = gl::getNonLostContext();
8348
8349 if (context)
8350 {
8351 if (context->getClientVersion() < 3)
8352 {
8353 return gl::error(GL_INVALID_OPERATION);
8354 }
8355 }
8356
8357 UNIMPLEMENTED();
8358 }
8359 catch(std::bad_alloc&)
8360 {
8361 return gl::error(GL_OUT_OF_MEMORY);
8362 }
8363}
8364
8365void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8366{
8367 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8368 target, samples, internalformat, width, height);
8369
8370 try
8371 {
8372 gl::Context *context = gl::getNonLostContext();
8373
8374 if (context)
8375 {
8376 if (context->getClientVersion() < 3)
8377 {
8378 return gl::error(GL_INVALID_OPERATION);
8379 }
8380 }
8381
8382 UNIMPLEMENTED();
8383 }
8384 catch(std::bad_alloc&)
8385 {
8386 return gl::error(GL_OUT_OF_MEMORY);
8387 }
8388}
8389
8390void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8391{
8392 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8393 target, attachment, texture, level, layer);
8394
8395 try
8396 {
8397 gl::Context *context = gl::getNonLostContext();
8398
8399 if (context)
8400 {
8401 if (context->getClientVersion() < 3)
8402 {
8403 return gl::error(GL_INVALID_OPERATION);
8404 }
8405 }
8406
8407 UNIMPLEMENTED();
8408 }
8409 catch(std::bad_alloc&)
8410 {
8411 return gl::error(GL_OUT_OF_MEMORY);
8412 }
8413}
8414
8415GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8416{
8417 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8418 target, offset, length, access);
8419
8420 try
8421 {
8422 gl::Context *context = gl::getNonLostContext();
8423
8424 if (context)
8425 {
8426 if (context->getClientVersion() < 3)
8427 {
8428 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8429 }
8430 }
8431
8432 UNIMPLEMENTED();
8433 }
8434 catch(std::bad_alloc&)
8435 {
8436 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8437 }
8438
8439 return NULL;
8440}
8441
8442void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8443{
8444 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8445
8446 try
8447 {
8448 gl::Context *context = gl::getNonLostContext();
8449
8450 if (context)
8451 {
8452 if (context->getClientVersion() < 3)
8453 {
8454 return gl::error(GL_INVALID_OPERATION);
8455 }
8456 }
8457
8458 UNIMPLEMENTED();
8459 }
8460 catch(std::bad_alloc&)
8461 {
8462 return gl::error(GL_OUT_OF_MEMORY);
8463 }
8464}
8465
8466void __stdcall glBindVertexArray(GLuint array)
8467{
8468 EVENT("(GLuint array = %u)", array);
8469
8470 try
8471 {
8472 gl::Context *context = gl::getNonLostContext();
8473
8474 if (context)
8475 {
8476 if (context->getClientVersion() < 3)
8477 {
8478 return gl::error(GL_INVALID_OPERATION);
8479 }
8480 }
8481
8482 UNIMPLEMENTED();
8483 }
8484 catch(std::bad_alloc&)
8485 {
8486 return gl::error(GL_OUT_OF_MEMORY);
8487 }
8488}
8489
8490void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8491{
8492 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8493
8494 try
8495 {
8496 gl::Context *context = gl::getNonLostContext();
8497
8498 if (context)
8499 {
8500 if (context->getClientVersion() < 3)
8501 {
8502 return gl::error(GL_INVALID_OPERATION);
8503 }
8504 }
8505
8506 UNIMPLEMENTED();
8507 }
8508 catch(std::bad_alloc&)
8509 {
8510 return gl::error(GL_OUT_OF_MEMORY);
8511 }
8512}
8513
8514void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8515{
8516 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8517
8518 try
8519 {
8520 gl::Context *context = gl::getNonLostContext();
8521
8522 if (context)
8523 {
8524 if (context->getClientVersion() < 3)
8525 {
8526 return gl::error(GL_INVALID_OPERATION);
8527 }
8528 }
8529
8530 UNIMPLEMENTED();
8531 }
8532 catch(std::bad_alloc&)
8533 {
8534 return gl::error(GL_OUT_OF_MEMORY);
8535 }
8536}
8537
8538GLboolean __stdcall glIsVertexArray(GLuint array)
8539{
8540 EVENT("(GLuint array = %u)", array);
8541
8542 try
8543 {
8544 gl::Context *context = gl::getNonLostContext();
8545
8546 if (context)
8547 {
8548 if (context->getClientVersion() < 3)
8549 {
8550 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8551 }
8552 }
8553
8554 UNIMPLEMENTED();
8555 }
8556 catch(std::bad_alloc&)
8557 {
8558 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8559 }
8560
8561 return GL_FALSE;
8562}
8563
8564void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8565{
8566 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8567 target, index, data);
8568
8569 try
8570 {
8571 gl::Context *context = gl::getNonLostContext();
8572
8573 if (context)
8574 {
8575 if (context->getClientVersion() < 3)
8576 {
8577 return gl::error(GL_INVALID_OPERATION);
8578 }
8579 }
8580
8581 UNIMPLEMENTED();
8582 }
8583 catch(std::bad_alloc&)
8584 {
8585 return gl::error(GL_OUT_OF_MEMORY);
8586 }
8587}
8588
8589void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8590{
8591 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8592
8593 try
8594 {
8595 gl::Context *context = gl::getNonLostContext();
8596
8597 if (context)
8598 {
8599 if (context->getClientVersion() < 3)
8600 {
8601 return gl::error(GL_INVALID_OPERATION);
8602 }
8603 }
8604
8605 UNIMPLEMENTED();
8606 }
8607 catch(std::bad_alloc&)
8608 {
8609 return gl::error(GL_OUT_OF_MEMORY);
8610 }
8611}
8612
8613void __stdcall glEndTransformFeedback(void)
8614{
8615 EVENT("(void)");
8616
8617 try
8618 {
8619 gl::Context *context = gl::getNonLostContext();
8620
8621 if (context)
8622 {
8623 if (context->getClientVersion() < 3)
8624 {
8625 return gl::error(GL_INVALID_OPERATION);
8626 }
8627 }
8628
8629 UNIMPLEMENTED();
8630 }
8631 catch(std::bad_alloc&)
8632 {
8633 return gl::error(GL_OUT_OF_MEMORY);
8634 }
8635}
8636
8637void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8638{
8639 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8640 target, index, buffer, offset, size);
8641
8642 try
8643 {
8644 gl::Context *context = gl::getNonLostContext();
8645
8646 if (context)
8647 {
8648 if (context->getClientVersion() < 3)
8649 {
8650 return gl::error(GL_INVALID_OPERATION);
8651 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008652
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008653 switch (target)
8654 {
8655 case GL_TRANSFORM_FEEDBACK_BUFFER:
8656 if (index > context->getMaxTransformFeedbackBufferBindings())
8657 {
8658 return gl::error(GL_INVALID_VALUE);
8659 }
8660 break;
8661
8662 case GL_UNIFORM_BUFFER:
8663 if (index >= context->getMaximumCombinedUniformBufferBindings())
8664 {
8665 return gl::error(GL_INVALID_VALUE);
8666 }
8667 break;
8668
8669 default:
8670 return gl::error(GL_INVALID_ENUM);
8671 }
8672
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008673 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008674 {
8675 return gl::error(GL_INVALID_VALUE);
8676 }
8677
8678 switch (target)
8679 {
8680 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008681 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8682 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008683 break;
8684
8685 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008686
8687 // it is an error to bind an offset not a multiple of the alignment
8688 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8689 {
8690 return gl::error(GL_INVALID_VALUE);
8691 }
8692
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008693 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8694 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008695 break;
8696
8697 default:
8698 UNREACHABLE();
8699 }
8700 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008701 }
8702 catch(std::bad_alloc&)
8703 {
8704 return gl::error(GL_OUT_OF_MEMORY);
8705 }
8706}
8707
8708void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8709{
8710 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8711 target, index, buffer);
8712
8713 try
8714 {
8715 gl::Context *context = gl::getNonLostContext();
8716
8717 if (context)
8718 {
8719 if (context->getClientVersion() < 3)
8720 {
8721 return gl::error(GL_INVALID_OPERATION);
8722 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008723
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008724 switch (target)
8725 {
8726 case GL_TRANSFORM_FEEDBACK_BUFFER:
8727 if (index > context->getMaxTransformFeedbackBufferBindings())
8728 {
8729 return gl::error(GL_INVALID_VALUE);
8730 }
8731 break;
8732
8733 case GL_UNIFORM_BUFFER:
8734 if (index > context->getMaximumCombinedUniformBufferBindings())
8735 {
8736 return gl::error(GL_INVALID_VALUE);
8737 }
8738 break;
8739
8740 default:
8741 return gl::error(GL_INVALID_ENUM);
8742 }
8743
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008744 switch (target)
8745 {
8746 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008747 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008748 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008749 break;
8750
8751 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008752 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008753 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008754 break;
8755
8756 default:
8757 UNREACHABLE();
8758 }
8759 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008760 }
8761 catch(std::bad_alloc&)
8762 {
8763 return gl::error(GL_OUT_OF_MEMORY);
8764 }
8765}
8766
8767void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8768{
8769 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8770 program, count, varyings, bufferMode);
8771
8772 try
8773 {
8774 gl::Context *context = gl::getNonLostContext();
8775
8776 if (context)
8777 {
8778 if (context->getClientVersion() < 3)
8779 {
8780 return gl::error(GL_INVALID_OPERATION);
8781 }
8782 }
8783
8784 UNIMPLEMENTED();
8785 }
8786 catch(std::bad_alloc&)
8787 {
8788 return gl::error(GL_OUT_OF_MEMORY);
8789 }
8790}
8791
8792void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8793{
8794 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8795 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8796 program, index, bufSize, length, size, type, name);
8797
8798 try
8799 {
8800 gl::Context *context = gl::getNonLostContext();
8801
8802 if (context)
8803 {
8804 if (context->getClientVersion() < 3)
8805 {
8806 return gl::error(GL_INVALID_OPERATION);
8807 }
8808 }
8809
8810 UNIMPLEMENTED();
8811 }
8812 catch(std::bad_alloc&)
8813 {
8814 return gl::error(GL_OUT_OF_MEMORY);
8815 }
8816}
8817
8818void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8819{
8820 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8821 index, size, type, stride, pointer);
8822
8823 try
8824 {
8825 gl::Context *context = gl::getNonLostContext();
8826
8827 if (context)
8828 {
8829 if (context->getClientVersion() < 3)
8830 {
8831 return gl::error(GL_INVALID_OPERATION);
8832 }
8833 }
8834
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008835 if (index >= gl::MAX_VERTEX_ATTRIBS)
8836 {
8837 return gl::error(GL_INVALID_VALUE);
8838 }
8839
8840 if (size < 1 || size > 4)
8841 {
8842 return gl::error(GL_INVALID_VALUE);
8843 }
8844
8845 switch (type)
8846 {
8847 case GL_BYTE:
8848 case GL_UNSIGNED_BYTE:
8849 case GL_SHORT:
8850 case GL_UNSIGNED_SHORT:
8851 case GL_INT:
8852 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008853 case GL_INT_2_10_10_10_REV:
8854 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008855 break;
8856 default:
8857 return gl::error(GL_INVALID_ENUM);
8858 }
8859
8860 if (stride < 0)
8861 {
8862 return gl::error(GL_INVALID_VALUE);
8863 }
8864
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008865 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8866 {
8867 return gl::error(GL_INVALID_OPERATION);
8868 }
8869
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008870 if (context)
8871 {
8872 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8873 stride, pointer);
8874 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008875 }
8876 catch(std::bad_alloc&)
8877 {
8878 return gl::error(GL_OUT_OF_MEMORY);
8879 }
8880}
8881
8882void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8883{
8884 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8885 index, pname, params);
8886
8887 try
8888 {
8889 gl::Context *context = gl::getNonLostContext();
8890
8891 if (context)
8892 {
8893 if (context->getClientVersion() < 3)
8894 {
8895 return gl::error(GL_INVALID_OPERATION);
8896 }
8897 }
8898
8899 UNIMPLEMENTED();
8900 }
8901 catch(std::bad_alloc&)
8902 {
8903 return gl::error(GL_OUT_OF_MEMORY);
8904 }
8905}
8906
8907void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8908{
8909 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8910 index, pname, params);
8911
8912 try
8913 {
8914 gl::Context *context = gl::getNonLostContext();
8915
8916 if (context)
8917 {
8918 if (context->getClientVersion() < 3)
8919 {
8920 return gl::error(GL_INVALID_OPERATION);
8921 }
8922 }
8923
8924 UNIMPLEMENTED();
8925 }
8926 catch(std::bad_alloc&)
8927 {
8928 return gl::error(GL_OUT_OF_MEMORY);
8929 }
8930}
8931
8932void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8933{
8934 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8935 index, x, y, z, w);
8936
8937 try
8938 {
8939 gl::Context *context = gl::getNonLostContext();
8940
8941 if (context)
8942 {
8943 if (context->getClientVersion() < 3)
8944 {
8945 return gl::error(GL_INVALID_OPERATION);
8946 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008947
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008948 if (index >= gl::MAX_VERTEX_ATTRIBS)
8949 {
8950 return gl::error(GL_INVALID_VALUE);
8951 }
8952
8953 GLint vals[4] = { x, y, z, w };
8954 context->setVertexAttribi(index, vals);
8955 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008956 }
8957 catch(std::bad_alloc&)
8958 {
8959 return gl::error(GL_OUT_OF_MEMORY);
8960 }
8961}
8962
8963void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8964{
8965 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8966 index, x, y, z, w);
8967
8968 try
8969 {
8970 gl::Context *context = gl::getNonLostContext();
8971
8972 if (context)
8973 {
8974 if (context->getClientVersion() < 3)
8975 {
8976 return gl::error(GL_INVALID_OPERATION);
8977 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008978
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008979 if (index >= gl::MAX_VERTEX_ATTRIBS)
8980 {
8981 return gl::error(GL_INVALID_VALUE);
8982 }
8983
8984 GLuint vals[4] = { x, y, z, w };
8985 context->setVertexAttribu(index, vals);
8986 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008987 }
8988 catch(std::bad_alloc&)
8989 {
8990 return gl::error(GL_OUT_OF_MEMORY);
8991 }
8992}
8993
8994void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
8995{
8996 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
8997
8998 try
8999 {
9000 gl::Context *context = gl::getNonLostContext();
9001
9002 if (context)
9003 {
9004 if (context->getClientVersion() < 3)
9005 {
9006 return gl::error(GL_INVALID_OPERATION);
9007 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009008
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009009 if (index >= gl::MAX_VERTEX_ATTRIBS)
9010 {
9011 return gl::error(GL_INVALID_VALUE);
9012 }
9013
9014 context->setVertexAttribi(index, v);
9015 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009016 }
9017 catch(std::bad_alloc&)
9018 {
9019 return gl::error(GL_OUT_OF_MEMORY);
9020 }
9021}
9022
9023void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9024{
9025 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9026
9027 try
9028 {
9029 gl::Context *context = gl::getNonLostContext();
9030
9031 if (context)
9032 {
9033 if (context->getClientVersion() < 3)
9034 {
9035 return gl::error(GL_INVALID_OPERATION);
9036 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009037
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009038 if (index >= gl::MAX_VERTEX_ATTRIBS)
9039 {
9040 return gl::error(GL_INVALID_VALUE);
9041 }
9042
9043 context->setVertexAttribu(index, v);
9044 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009045 }
9046 catch(std::bad_alloc&)
9047 {
9048 return gl::error(GL_OUT_OF_MEMORY);
9049 }
9050}
9051
9052void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9053{
9054 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9055 program, location, params);
9056
9057 try
9058 {
9059 gl::Context *context = gl::getNonLostContext();
9060
9061 if (context)
9062 {
9063 if (context->getClientVersion() < 3)
9064 {
9065 return gl::error(GL_INVALID_OPERATION);
9066 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009067
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009068 if (program == 0)
9069 {
9070 return gl::error(GL_INVALID_VALUE);
9071 }
9072
9073 gl::Program *programObject = context->getProgram(program);
9074
9075 if (!programObject || !programObject->isLinked())
9076 {
9077 return gl::error(GL_INVALID_OPERATION);
9078 }
9079
9080 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9081 if (!programBinary)
9082 {
9083 return gl::error(GL_INVALID_OPERATION);
9084 }
9085
9086 if (!programBinary->getUniformuiv(location, NULL, params))
9087 {
9088 return gl::error(GL_INVALID_OPERATION);
9089 }
9090 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009091 }
9092 catch(std::bad_alloc&)
9093 {
9094 return gl::error(GL_OUT_OF_MEMORY);
9095 }
9096}
9097
9098GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9099{
9100 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9101 program, name);
9102
9103 try
9104 {
9105 gl::Context *context = gl::getNonLostContext();
9106
9107 if (context)
9108 {
9109 if (context->getClientVersion() < 3)
9110 {
9111 return gl::error(GL_INVALID_OPERATION, 0);
9112 }
9113 }
9114
9115 UNIMPLEMENTED();
9116 }
9117 catch(std::bad_alloc&)
9118 {
9119 return gl::error(GL_OUT_OF_MEMORY, 0);
9120 }
9121
9122 return 0;
9123}
9124
9125void __stdcall glUniform1ui(GLint location, GLuint v0)
9126{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009127 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009128}
9129
9130void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9131{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009132 const GLuint xy[] = { v0, v1 };
9133 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009134}
9135
9136void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9137{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009138 const GLuint xyz[] = { v0, v1, v2 };
9139 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009140}
9141
9142void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9143{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009144 const GLuint xyzw[] = { v0, v1, v2, v3 };
9145 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009146}
9147
9148void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9149{
9150 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9151 location, count, value);
9152
9153 try
9154 {
9155 gl::Context *context = gl::getNonLostContext();
9156
9157 if (context)
9158 {
9159 if (context->getClientVersion() < 3)
9160 {
9161 return gl::error(GL_INVALID_OPERATION);
9162 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009163
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009164 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9165 if (!programBinary)
9166 {
9167 return gl::error(GL_INVALID_OPERATION);
9168 }
9169
9170 if (!programBinary->setUniform1uiv(location, count, value))
9171 {
9172 return gl::error(GL_INVALID_OPERATION);
9173 }
9174 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009175 }
9176 catch(std::bad_alloc&)
9177 {
9178 return gl::error(GL_OUT_OF_MEMORY);
9179 }
9180}
9181
9182void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9183{
9184 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9185 location, count, value);
9186
9187 try
9188 {
9189 gl::Context *context = gl::getNonLostContext();
9190
9191 if (context)
9192 {
9193 if (context->getClientVersion() < 3)
9194 {
9195 return gl::error(GL_INVALID_OPERATION);
9196 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009197
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009198 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9199 if (!programBinary)
9200 {
9201 return gl::error(GL_INVALID_OPERATION);
9202 }
9203
9204 if (!programBinary->setUniform2uiv(location, count, value))
9205 {
9206 return gl::error(GL_INVALID_OPERATION);
9207 }
9208 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009209 }
9210 catch(std::bad_alloc&)
9211 {
9212 return gl::error(GL_OUT_OF_MEMORY);
9213 }
9214}
9215
9216void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9217{
9218 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9219 location, count, value);
9220
9221 try
9222 {
9223 gl::Context *context = gl::getNonLostContext();
9224
9225 if (context)
9226 {
9227 if (context->getClientVersion() < 3)
9228 {
9229 return gl::error(GL_INVALID_OPERATION);
9230 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009231
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009232 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9233 if (!programBinary)
9234 {
9235 return gl::error(GL_INVALID_OPERATION);
9236 }
9237
9238 if (!programBinary->setUniform3uiv(location, count, value))
9239 {
9240 return gl::error(GL_INVALID_OPERATION);
9241 }
9242 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009243 }
9244 catch(std::bad_alloc&)
9245 {
9246 return gl::error(GL_OUT_OF_MEMORY);
9247 }
9248}
9249
9250void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9251{
9252 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9253 location, count, value);
9254
9255 try
9256 {
9257 gl::Context *context = gl::getNonLostContext();
9258
9259 if (context)
9260 {
9261 if (context->getClientVersion() < 3)
9262 {
9263 return gl::error(GL_INVALID_OPERATION);
9264 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009265
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009266 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9267 if (!programBinary)
9268 {
9269 return gl::error(GL_INVALID_OPERATION);
9270 }
9271
9272 if (!programBinary->setUniform4uiv(location, count, value))
9273 {
9274 return gl::error(GL_INVALID_OPERATION);
9275 }
9276 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009277 }
9278 catch(std::bad_alloc&)
9279 {
9280 return gl::error(GL_OUT_OF_MEMORY);
9281 }
9282}
9283
9284void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9285{
9286 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9287 buffer, drawbuffer, value);
9288
9289 try
9290 {
9291 gl::Context *context = gl::getNonLostContext();
9292
9293 if (context)
9294 {
9295 if (context->getClientVersion() < 3)
9296 {
9297 return gl::error(GL_INVALID_OPERATION);
9298 }
9299 }
9300
9301 UNIMPLEMENTED();
9302 }
9303 catch(std::bad_alloc&)
9304 {
9305 return gl::error(GL_OUT_OF_MEMORY);
9306 }
9307}
9308
9309void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9310{
9311 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9312 buffer, drawbuffer, value);
9313
9314 try
9315 {
9316 gl::Context *context = gl::getNonLostContext();
9317
9318 if (context)
9319 {
9320 if (context->getClientVersion() < 3)
9321 {
9322 return gl::error(GL_INVALID_OPERATION);
9323 }
9324 }
9325
9326 UNIMPLEMENTED();
9327 }
9328 catch(std::bad_alloc&)
9329 {
9330 return gl::error(GL_OUT_OF_MEMORY);
9331 }
9332}
9333
9334void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9335{
9336 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9337 buffer, drawbuffer, value);
9338
9339 try
9340 {
9341 gl::Context *context = gl::getNonLostContext();
9342
9343 if (context)
9344 {
9345 if (context->getClientVersion() < 3)
9346 {
9347 return gl::error(GL_INVALID_OPERATION);
9348 }
9349 }
9350
9351 UNIMPLEMENTED();
9352 }
9353 catch(std::bad_alloc&)
9354 {
9355 return gl::error(GL_OUT_OF_MEMORY);
9356 }
9357}
9358
9359void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9360{
9361 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9362 buffer, drawbuffer, depth, stencil);
9363
9364 try
9365 {
9366 gl::Context *context = gl::getNonLostContext();
9367
9368 if (context)
9369 {
9370 if (context->getClientVersion() < 3)
9371 {
9372 return gl::error(GL_INVALID_OPERATION);
9373 }
9374 }
9375
9376 UNIMPLEMENTED();
9377 }
9378 catch(std::bad_alloc&)
9379 {
9380 return gl::error(GL_OUT_OF_MEMORY);
9381 }
9382}
9383
9384const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9385{
9386 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9387
9388 try
9389 {
9390 gl::Context *context = gl::getNonLostContext();
9391
9392 if (context)
9393 {
9394 if (context->getClientVersion() < 3)
9395 {
9396 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9397 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009398
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009399 if (name != GL_EXTENSIONS)
9400 {
9401 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9402 }
9403
9404 if (index >= context->getNumExtensions())
9405 {
9406 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9407 }
9408
9409 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9410 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009411 }
9412 catch(std::bad_alloc&)
9413 {
9414 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9415 }
9416
9417 return NULL;
9418}
9419
9420void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9421{
9422 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9423 readTarget, writeTarget, readOffset, writeOffset, size);
9424
9425 try
9426 {
9427 gl::Context *context = gl::getNonLostContext();
9428
9429 if (context)
9430 {
9431 if (context->getClientVersion() < 3)
9432 {
9433 return gl::error(GL_INVALID_OPERATION);
9434 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009435
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009436 gl::Buffer *readBuffer = NULL;
9437 switch (readTarget)
9438 {
9439 case GL_ARRAY_BUFFER:
9440 readBuffer = context->getArrayBuffer();
9441 break;
9442 case GL_COPY_READ_BUFFER:
9443 readBuffer = context->getCopyReadBuffer();
9444 break;
9445 case GL_COPY_WRITE_BUFFER:
9446 readBuffer = context->getCopyWriteBuffer();
9447 break;
9448 case GL_ELEMENT_ARRAY_BUFFER:
9449 readBuffer = context->getElementArrayBuffer();
9450 break;
9451 case GL_PIXEL_PACK_BUFFER:
9452 readBuffer = context->getPixelPackBuffer();
9453 break;
9454 case GL_PIXEL_UNPACK_BUFFER:
9455 readBuffer = context->getPixelUnpackBuffer();
9456 break;
9457 case GL_TRANSFORM_FEEDBACK_BUFFER:
9458 readBuffer = context->getGenericTransformFeedbackBuffer();
9459 break;
9460 case GL_UNIFORM_BUFFER:
9461 readBuffer = context->getGenericUniformBuffer();
9462 break;
9463 default:
9464 return gl::error(GL_INVALID_ENUM);
9465 }
9466
9467 gl::Buffer *writeBuffer = NULL;
9468 switch (writeTarget)
9469 {
9470 case GL_ARRAY_BUFFER:
9471 writeBuffer = context->getArrayBuffer();
9472 break;
9473 case GL_COPY_READ_BUFFER:
9474 writeBuffer = context->getCopyReadBuffer();
9475 break;
9476 case GL_COPY_WRITE_BUFFER:
9477 writeBuffer = context->getCopyWriteBuffer();
9478 break;
9479 case GL_ELEMENT_ARRAY_BUFFER:
9480 writeBuffer = context->getElementArrayBuffer();
9481 break;
9482 case GL_PIXEL_PACK_BUFFER:
9483 writeBuffer = context->getPixelPackBuffer();
9484 break;
9485 case GL_PIXEL_UNPACK_BUFFER:
9486 writeBuffer = context->getPixelUnpackBuffer();
9487 break;
9488 case GL_TRANSFORM_FEEDBACK_BUFFER:
9489 writeBuffer = context->getGenericTransformFeedbackBuffer();
9490 break;
9491 case GL_UNIFORM_BUFFER:
9492 writeBuffer = context->getGenericUniformBuffer();
9493 break;
9494 default:
9495 return gl::error(GL_INVALID_ENUM);
9496 }
9497
9498 if (!readBuffer || !writeBuffer)
9499 {
9500 return gl::error(GL_INVALID_OPERATION);
9501 }
9502
9503 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9504 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9505 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9506 {
9507 return gl::error(GL_INVALID_VALUE);
9508 }
9509
9510 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9511 {
9512 return gl::error(GL_INVALID_VALUE);
9513 }
9514
9515 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9516
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009517 // if size is zero, the copy is a successful no-op
9518 if (size > 0)
9519 {
9520 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9521 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009522 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009523 }
9524 catch(std::bad_alloc&)
9525 {
9526 return gl::error(GL_OUT_OF_MEMORY);
9527 }
9528}
9529
9530void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9531{
9532 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9533 program, uniformCount, uniformNames, uniformIndices);
9534
9535 try
9536 {
9537 gl::Context *context = gl::getNonLostContext();
9538
9539 if (context)
9540 {
9541 if (context->getClientVersion() < 3)
9542 {
9543 return gl::error(GL_INVALID_OPERATION);
9544 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009545
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009546 if (uniformCount < 0)
9547 {
9548 return gl::error(GL_INVALID_VALUE);
9549 }
9550
9551 gl::Program *programObject = context->getProgram(program);
9552
9553 if (!programObject)
9554 {
9555 if (context->getShader(program))
9556 {
9557 return gl::error(GL_INVALID_OPERATION);
9558 }
9559 else
9560 {
9561 return gl::error(GL_INVALID_VALUE);
9562 }
9563 }
9564
9565 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9566 if (!programObject->isLinked() || !programBinary)
9567 {
9568 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9569 {
9570 uniformIndices[uniformId] = GL_INVALID_INDEX;
9571 }
9572 }
9573 else
9574 {
9575 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9576 {
9577 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9578 }
9579 }
9580 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009581 }
9582 catch(std::bad_alloc&)
9583 {
9584 return gl::error(GL_OUT_OF_MEMORY);
9585 }
9586}
9587
9588void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9589{
9590 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9591 program, uniformCount, uniformIndices, pname, params);
9592
9593 try
9594 {
9595 gl::Context *context = gl::getNonLostContext();
9596
9597 if (context)
9598 {
9599 if (context->getClientVersion() < 3)
9600 {
9601 return gl::error(GL_INVALID_OPERATION);
9602 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009603
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009604 if (uniformCount < 0)
9605 {
9606 return gl::error(GL_INVALID_VALUE);
9607 }
9608
9609 gl::Program *programObject = context->getProgram(program);
9610
9611 if (!programObject)
9612 {
9613 if (context->getShader(program))
9614 {
9615 return gl::error(GL_INVALID_OPERATION);
9616 }
9617 else
9618 {
9619 return gl::error(GL_INVALID_VALUE);
9620 }
9621 }
9622
9623 switch (pname)
9624 {
9625 case GL_UNIFORM_TYPE:
9626 case GL_UNIFORM_SIZE:
9627 case GL_UNIFORM_NAME_LENGTH:
9628 case GL_UNIFORM_BLOCK_INDEX:
9629 case GL_UNIFORM_OFFSET:
9630 case GL_UNIFORM_ARRAY_STRIDE:
9631 case GL_UNIFORM_MATRIX_STRIDE:
9632 case GL_UNIFORM_IS_ROW_MAJOR:
9633 break;
9634 default:
9635 return gl::error(GL_INVALID_ENUM);
9636 }
9637
9638 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9639
9640 if (!programBinary && uniformCount > 0)
9641 {
9642 return gl::error(GL_INVALID_VALUE);
9643 }
9644
9645 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9646 {
9647 const GLuint index = uniformIndices[uniformId];
9648
9649 if (index >= (GLuint)programBinary->getActiveUniformCount())
9650 {
9651 return gl::error(GL_INVALID_VALUE);
9652 }
9653 }
9654
9655 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9656 {
9657 const GLuint index = uniformIndices[uniformId];
9658 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9659 }
9660 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009661 }
9662 catch(std::bad_alloc&)
9663 {
9664 return gl::error(GL_OUT_OF_MEMORY);
9665 }
9666}
9667
9668GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9669{
9670 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9671
9672 try
9673 {
9674 gl::Context *context = gl::getNonLostContext();
9675
9676 if (context)
9677 {
9678 if (context->getClientVersion() < 3)
9679 {
9680 return gl::error(GL_INVALID_OPERATION, 0);
9681 }
9682 }
9683
9684 UNIMPLEMENTED();
9685 }
9686 catch(std::bad_alloc&)
9687 {
9688 return gl::error(GL_OUT_OF_MEMORY, 0);
9689 }
9690
9691 return 0;
9692}
9693
9694void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9695{
9696 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9697 program, uniformBlockIndex, pname, params);
9698
9699 try
9700 {
9701 gl::Context *context = gl::getNonLostContext();
9702
9703 if (context)
9704 {
9705 if (context->getClientVersion() < 3)
9706 {
9707 return gl::error(GL_INVALID_OPERATION);
9708 }
9709 }
9710
9711 UNIMPLEMENTED();
9712 }
9713 catch(std::bad_alloc&)
9714 {
9715 return gl::error(GL_OUT_OF_MEMORY);
9716 }
9717}
9718
9719void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9720{
9721 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9722 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9723
9724 try
9725 {
9726 gl::Context *context = gl::getNonLostContext();
9727
9728 if (context)
9729 {
9730 if (context->getClientVersion() < 3)
9731 {
9732 return gl::error(GL_INVALID_OPERATION);
9733 }
9734 }
9735
9736 UNIMPLEMENTED();
9737 }
9738 catch(std::bad_alloc&)
9739 {
9740 return gl::error(GL_OUT_OF_MEMORY);
9741 }
9742}
9743
9744void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9745{
9746 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9747 program, uniformBlockIndex, uniformBlockBinding);
9748
9749 try
9750 {
9751 gl::Context *context = gl::getNonLostContext();
9752
9753 if (context)
9754 {
9755 if (context->getClientVersion() < 3)
9756 {
9757 return gl::error(GL_INVALID_OPERATION);
9758 }
9759 }
9760
9761 UNIMPLEMENTED();
9762 }
9763 catch(std::bad_alloc&)
9764 {
9765 return gl::error(GL_OUT_OF_MEMORY);
9766 }
9767}
9768
9769void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9770{
9771 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9772 mode, first, count, instanceCount);
9773
9774 try
9775 {
9776 gl::Context *context = gl::getNonLostContext();
9777
9778 if (context)
9779 {
9780 if (context->getClientVersion() < 3)
9781 {
9782 return gl::error(GL_INVALID_OPERATION);
9783 }
9784 }
9785
9786 UNIMPLEMENTED();
9787 }
9788 catch(std::bad_alloc&)
9789 {
9790 return gl::error(GL_OUT_OF_MEMORY);
9791 }
9792}
9793
9794void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9795{
9796 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9797 mode, count, type, indices, instanceCount);
9798
9799 try
9800 {
9801 gl::Context *context = gl::getNonLostContext();
9802
9803 if (context)
9804 {
9805 if (context->getClientVersion() < 3)
9806 {
9807 return gl::error(GL_INVALID_OPERATION);
9808 }
9809 }
9810
9811 UNIMPLEMENTED();
9812 }
9813 catch(std::bad_alloc&)
9814 {
9815 return gl::error(GL_OUT_OF_MEMORY);
9816 }
9817}
9818
9819GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9820{
9821 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9822
9823 try
9824 {
9825 gl::Context *context = gl::getNonLostContext();
9826
9827 if (context)
9828 {
9829 if (context->getClientVersion() < 3)
9830 {
9831 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9832 }
9833 }
9834
9835 UNIMPLEMENTED();
9836 }
9837 catch(std::bad_alloc&)
9838 {
9839 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9840 }
9841
9842 return NULL;
9843}
9844
9845GLboolean __stdcall glIsSync(GLsync sync)
9846{
9847 EVENT("(GLsync sync = 0x%0.8p)", sync);
9848
9849 try
9850 {
9851 gl::Context *context = gl::getNonLostContext();
9852
9853 if (context)
9854 {
9855 if (context->getClientVersion() < 3)
9856 {
9857 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9858 }
9859 }
9860
9861 UNIMPLEMENTED();
9862 }
9863 catch(std::bad_alloc&)
9864 {
9865 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9866 }
9867
9868 return GL_FALSE;
9869}
9870
9871void __stdcall glDeleteSync(GLsync sync)
9872{
9873 EVENT("(GLsync sync = 0x%0.8p)", sync);
9874
9875 try
9876 {
9877 gl::Context *context = gl::getNonLostContext();
9878
9879 if (context)
9880 {
9881 if (context->getClientVersion() < 3)
9882 {
9883 return gl::error(GL_INVALID_OPERATION);
9884 }
9885 }
9886
9887 UNIMPLEMENTED();
9888 }
9889 catch(std::bad_alloc&)
9890 {
9891 return gl::error(GL_OUT_OF_MEMORY);
9892 }
9893}
9894
9895GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9896{
9897 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9898 sync, flags, timeout);
9899
9900 try
9901 {
9902 gl::Context *context = gl::getNonLostContext();
9903
9904 if (context)
9905 {
9906 if (context->getClientVersion() < 3)
9907 {
9908 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9909 }
9910 }
9911
9912 UNIMPLEMENTED();
9913 }
9914 catch(std::bad_alloc&)
9915 {
9916 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9917 }
9918
9919 return GL_FALSE;
9920}
9921
9922void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
9923{
9924 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
9925 sync, flags, timeout);
9926
9927 try
9928 {
9929 gl::Context *context = gl::getNonLostContext();
9930
9931 if (context)
9932 {
9933 if (context->getClientVersion() < 3)
9934 {
9935 return gl::error(GL_INVALID_OPERATION);
9936 }
9937 }
9938
9939 UNIMPLEMENTED();
9940 }
9941 catch(std::bad_alloc&)
9942 {
9943 return gl::error(GL_OUT_OF_MEMORY);
9944 }
9945}
9946
9947void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
9948{
9949 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
9950 pname, params);
9951
9952 try
9953 {
9954 gl::Context *context = gl::getNonLostContext();
9955
9956 if (context)
9957 {
9958 if (context->getClientVersion() < 3)
9959 {
9960 return gl::error(GL_INVALID_OPERATION);
9961 }
9962 }
9963
9964 UNIMPLEMENTED();
9965 }
9966 catch(std::bad_alloc&)
9967 {
9968 return gl::error(GL_OUT_OF_MEMORY);
9969 }
9970}
9971
9972void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
9973{
9974 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
9975 sync, pname, bufSize, length, values);
9976
9977 try
9978 {
9979 gl::Context *context = gl::getNonLostContext();
9980
9981 if (context)
9982 {
9983 if (context->getClientVersion() < 3)
9984 {
9985 return gl::error(GL_INVALID_OPERATION);
9986 }
9987 }
9988
9989 UNIMPLEMENTED();
9990 }
9991 catch(std::bad_alloc&)
9992 {
9993 return gl::error(GL_OUT_OF_MEMORY);
9994 }
9995}
9996
9997void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
9998{
9999 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10000 target, index, data);
10001
10002 try
10003 {
10004 gl::Context *context = gl::getNonLostContext();
10005
10006 if (context)
10007 {
10008 if (context->getClientVersion() < 3)
10009 {
10010 return gl::error(GL_INVALID_OPERATION);
10011 }
10012 }
10013
10014 UNIMPLEMENTED();
10015 }
10016 catch(std::bad_alloc&)
10017 {
10018 return gl::error(GL_OUT_OF_MEMORY);
10019 }
10020}
10021
10022void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10023{
10024 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10025 target, pname, params);
10026
10027 try
10028 {
10029 gl::Context *context = gl::getNonLostContext();
10030
10031 if (context)
10032 {
10033 if (context->getClientVersion() < 3)
10034 {
10035 return gl::error(GL_INVALID_OPERATION);
10036 }
10037 }
10038
10039 UNIMPLEMENTED();
10040 }
10041 catch(std::bad_alloc&)
10042 {
10043 return gl::error(GL_OUT_OF_MEMORY);
10044 }
10045}
10046
10047void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10048{
10049 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10050
10051 try
10052 {
10053 gl::Context *context = gl::getNonLostContext();
10054
10055 if (context)
10056 {
10057 if (context->getClientVersion() < 3)
10058 {
10059 return gl::error(GL_INVALID_OPERATION);
10060 }
10061 }
10062
10063 UNIMPLEMENTED();
10064 }
10065 catch(std::bad_alloc&)
10066 {
10067 return gl::error(GL_OUT_OF_MEMORY);
10068 }
10069}
10070
10071void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10072{
10073 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
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
10095GLboolean __stdcall glIsSampler(GLuint sampler)
10096{
10097 EVENT("(GLuint sampler = %u)", sampler);
10098
10099 try
10100 {
10101 gl::Context *context = gl::getNonLostContext();
10102
10103 if (context)
10104 {
10105 if (context->getClientVersion() < 3)
10106 {
10107 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10108 }
10109 }
10110
10111 UNIMPLEMENTED();
10112 }
10113 catch(std::bad_alloc&)
10114 {
10115 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10116 }
10117
10118 return GL_FALSE;
10119}
10120
10121void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10122{
10123 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
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 glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10146{
10147 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10148
10149 try
10150 {
10151 gl::Context *context = gl::getNonLostContext();
10152
10153 if (context)
10154 {
10155 if (context->getClientVersion() < 3)
10156 {
10157 return gl::error(GL_INVALID_OPERATION);
10158 }
10159 }
10160
10161 UNIMPLEMENTED();
10162 }
10163 catch(std::bad_alloc&)
10164 {
10165 return gl::error(GL_OUT_OF_MEMORY);
10166 }
10167}
10168
10169void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10170{
10171 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10172 sampler, pname, param);
10173
10174 try
10175 {
10176 gl::Context *context = gl::getNonLostContext();
10177
10178 if (context)
10179 {
10180 if (context->getClientVersion() < 3)
10181 {
10182 return gl::error(GL_INVALID_OPERATION);
10183 }
10184 }
10185
10186 UNIMPLEMENTED();
10187 }
10188 catch(std::bad_alloc&)
10189 {
10190 return gl::error(GL_OUT_OF_MEMORY);
10191 }
10192}
10193
10194void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10195{
10196 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10197
10198 try
10199 {
10200 gl::Context *context = gl::getNonLostContext();
10201
10202 if (context)
10203 {
10204 if (context->getClientVersion() < 3)
10205 {
10206 return gl::error(GL_INVALID_OPERATION);
10207 }
10208 }
10209
10210 UNIMPLEMENTED();
10211 }
10212 catch(std::bad_alloc&)
10213 {
10214 return gl::error(GL_OUT_OF_MEMORY);
10215 }
10216}
10217
10218void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10219{
10220 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10221
10222 try
10223 {
10224 gl::Context *context = gl::getNonLostContext();
10225
10226 if (context)
10227 {
10228 if (context->getClientVersion() < 3)
10229 {
10230 return gl::error(GL_INVALID_OPERATION);
10231 }
10232 }
10233
10234 UNIMPLEMENTED();
10235 }
10236 catch(std::bad_alloc&)
10237 {
10238 return gl::error(GL_OUT_OF_MEMORY);
10239 }
10240}
10241
10242void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10243{
10244 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10245
10246 try
10247 {
10248 gl::Context *context = gl::getNonLostContext();
10249
10250 if (context)
10251 {
10252 if (context->getClientVersion() < 3)
10253 {
10254 return gl::error(GL_INVALID_OPERATION);
10255 }
10256 }
10257
10258 UNIMPLEMENTED();
10259 }
10260 catch(std::bad_alloc&)
10261 {
10262 return gl::error(GL_OUT_OF_MEMORY);
10263 }
10264}
10265
10266void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10267{
10268 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10269
10270 try
10271 {
10272 gl::Context *context = gl::getNonLostContext();
10273
10274 if (context)
10275 {
10276 if (context->getClientVersion() < 3)
10277 {
10278 return gl::error(GL_INVALID_OPERATION);
10279 }
10280 }
10281
10282 UNIMPLEMENTED();
10283 }
10284 catch(std::bad_alloc&)
10285 {
10286 return gl::error(GL_OUT_OF_MEMORY);
10287 }
10288}
10289
10290void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10291{
10292 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10293
10294 try
10295 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010296 if (index >= gl::MAX_VERTEX_ATTRIBS)
10297 {
10298 return gl::error(GL_INVALID_VALUE);
10299 }
10300
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010301 gl::Context *context = gl::getNonLostContext();
10302
10303 if (context)
10304 {
10305 if (context->getClientVersion() < 3)
10306 {
10307 return gl::error(GL_INVALID_OPERATION);
10308 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010309
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010310 context->setVertexAttribDivisor(index, divisor);
10311 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010312 }
10313 catch(std::bad_alloc&)
10314 {
10315 return gl::error(GL_OUT_OF_MEMORY);
10316 }
10317}
10318
10319void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10320{
10321 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10322
10323 try
10324 {
10325 gl::Context *context = gl::getNonLostContext();
10326
10327 if (context)
10328 {
10329 if (context->getClientVersion() < 3)
10330 {
10331 return gl::error(GL_INVALID_OPERATION);
10332 }
10333 }
10334
10335 UNIMPLEMENTED();
10336 }
10337 catch(std::bad_alloc&)
10338 {
10339 return gl::error(GL_OUT_OF_MEMORY);
10340 }
10341}
10342
10343void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10344{
10345 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10346
10347 try
10348 {
10349 gl::Context *context = gl::getNonLostContext();
10350
10351 if (context)
10352 {
10353 if (context->getClientVersion() < 3)
10354 {
10355 return gl::error(GL_INVALID_OPERATION);
10356 }
10357 }
10358
10359 UNIMPLEMENTED();
10360 }
10361 catch(std::bad_alloc&)
10362 {
10363 return gl::error(GL_OUT_OF_MEMORY);
10364 }
10365}
10366
10367void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10368{
10369 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10370
10371 try
10372 {
10373 gl::Context *context = gl::getNonLostContext();
10374
10375 if (context)
10376 {
10377 if (context->getClientVersion() < 3)
10378 {
10379 return gl::error(GL_INVALID_OPERATION);
10380 }
10381 }
10382
10383 UNIMPLEMENTED();
10384 }
10385 catch(std::bad_alloc&)
10386 {
10387 return gl::error(GL_OUT_OF_MEMORY);
10388 }
10389}
10390
10391GLboolean __stdcall glIsTransformFeedback(GLuint id)
10392{
10393 EVENT("(GLuint id = %u)", id);
10394
10395 try
10396 {
10397 gl::Context *context = gl::getNonLostContext();
10398
10399 if (context)
10400 {
10401 if (context->getClientVersion() < 3)
10402 {
10403 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10404 }
10405 }
10406
10407 UNIMPLEMENTED();
10408 }
10409 catch(std::bad_alloc&)
10410 {
10411 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10412 }
10413
10414 return GL_FALSE;
10415}
10416
10417void __stdcall glPauseTransformFeedback(void)
10418{
10419 EVENT("(void)");
10420
10421 try
10422 {
10423 gl::Context *context = gl::getNonLostContext();
10424
10425 if (context)
10426 {
10427 if (context->getClientVersion() < 3)
10428 {
10429 return gl::error(GL_INVALID_OPERATION);
10430 }
10431 }
10432
10433 UNIMPLEMENTED();
10434 }
10435 catch(std::bad_alloc&)
10436 {
10437 return gl::error(GL_OUT_OF_MEMORY);
10438 }
10439}
10440
10441void __stdcall glResumeTransformFeedback(void)
10442{
10443 EVENT("(void)");
10444
10445 try
10446 {
10447 gl::Context *context = gl::getNonLostContext();
10448
10449 if (context)
10450 {
10451 if (context->getClientVersion() < 3)
10452 {
10453 return gl::error(GL_INVALID_OPERATION);
10454 }
10455 }
10456
10457 UNIMPLEMENTED();
10458 }
10459 catch(std::bad_alloc&)
10460 {
10461 return gl::error(GL_OUT_OF_MEMORY);
10462 }
10463}
10464
10465void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10466{
10467 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10468 program, bufSize, length, binaryFormat, binary);
10469
10470 try
10471 {
10472 gl::Context *context = gl::getNonLostContext();
10473
10474 if (context)
10475 {
10476 if (context->getClientVersion() < 3)
10477 {
10478 return gl::error(GL_INVALID_OPERATION);
10479 }
10480 }
10481
10482 UNIMPLEMENTED();
10483 }
10484 catch(std::bad_alloc&)
10485 {
10486 return gl::error(GL_OUT_OF_MEMORY);
10487 }
10488}
10489
10490void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10491{
10492 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10493 program, binaryFormat, binary, length);
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 glProgramParameteri(GLuint program, GLenum pname, GLint value)
10516{
10517 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10518 program, pname, value);
10519
10520 try
10521 {
10522 gl::Context *context = gl::getNonLostContext();
10523
10524 if (context)
10525 {
10526 if (context->getClientVersion() < 3)
10527 {
10528 return gl::error(GL_INVALID_OPERATION);
10529 }
10530 }
10531
10532 UNIMPLEMENTED();
10533 }
10534 catch(std::bad_alloc&)
10535 {
10536 return gl::error(GL_OUT_OF_MEMORY);
10537 }
10538}
10539
10540void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10541{
10542 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10543 target, numAttachments, attachments);
10544
10545 try
10546 {
10547 gl::Context *context = gl::getNonLostContext();
10548
10549 if (context)
10550 {
10551 if (context->getClientVersion() < 3)
10552 {
10553 return gl::error(GL_INVALID_OPERATION);
10554 }
10555 }
10556
10557 UNIMPLEMENTED();
10558 }
10559 catch(std::bad_alloc&)
10560 {
10561 return gl::error(GL_OUT_OF_MEMORY);
10562 }
10563}
10564
10565void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10566{
10567 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10568 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10569 target, numAttachments, attachments, x, y, width, height);
10570
10571 try
10572 {
10573 gl::Context *context = gl::getNonLostContext();
10574
10575 if (context)
10576 {
10577 if (context->getClientVersion() < 3)
10578 {
10579 return gl::error(GL_INVALID_OPERATION);
10580 }
10581 }
10582
10583 UNIMPLEMENTED();
10584 }
10585 catch(std::bad_alloc&)
10586 {
10587 return gl::error(GL_OUT_OF_MEMORY);
10588 }
10589}
10590
10591void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10592{
10593 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10594 target, levels, internalformat, width, height);
10595
10596 try
10597 {
10598 gl::Context *context = gl::getNonLostContext();
10599
10600 if (context)
10601 {
10602 if (context->getClientVersion() < 3)
10603 {
10604 return gl::error(GL_INVALID_OPERATION);
10605 }
10606 }
10607
10608 UNIMPLEMENTED();
10609 }
10610 catch(std::bad_alloc&)
10611 {
10612 return gl::error(GL_OUT_OF_MEMORY);
10613 }
10614}
10615
10616void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10617{
10618 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10619 "GLsizei height = %d, GLsizei depth = %d)",
10620 target, levels, internalformat, width, height, depth);
10621
10622 try
10623 {
10624 gl::Context *context = gl::getNonLostContext();
10625
10626 if (context)
10627 {
10628 if (context->getClientVersion() < 3)
10629 {
10630 return gl::error(GL_INVALID_OPERATION);
10631 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010632 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010633 }
10634 catch(std::bad_alloc&)
10635 {
10636 return gl::error(GL_OUT_OF_MEMORY);
10637 }
10638}
10639
10640void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10641{
10642 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10643 "GLint* params = 0x%0.8p)",
10644 target, internalformat, pname, bufSize, params);
10645
10646 try
10647 {
10648 gl::Context *context = gl::getNonLostContext();
10649
10650 if (context)
10651 {
10652 if (context->getClientVersion() < 3)
10653 {
10654 return gl::error(GL_INVALID_OPERATION);
10655 }
10656 }
10657
10658 UNIMPLEMENTED();
10659 }
10660 catch(std::bad_alloc&)
10661 {
10662 return gl::error(GL_OUT_OF_MEMORY);
10663 }
10664}
10665
10666// Extension functions
10667
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010668void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10669 GLbitfield mask, GLenum filter)
10670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010671 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010672 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10673 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10674 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10675
10676 try
10677 {
10678 switch (filter)
10679 {
10680 case GL_NEAREST:
10681 break;
10682 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010683 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010684 }
10685
10686 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010689 }
10690
10691 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10692 {
10693 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010694 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010695 }
10696
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010697 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010698
10699 if (context)
10700 {
10701 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10702 {
10703 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010704 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010705 }
10706
10707 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10708 }
10709 }
10710 catch(std::bad_alloc&)
10711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010713 }
10714}
10715
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010716void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10717 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010719 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010720 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010721 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010722 target, level, internalformat, width, height, depth, border, format, type, pixels);
10723
10724 try
10725 {
10726 UNIMPLEMENTED(); // FIXME
10727 }
10728 catch(std::bad_alloc&)
10729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010730 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010731 }
10732}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010733
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010734void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10735 GLenum *binaryFormat, void *binary)
10736{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010737 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 +000010738 program, bufSize, length, binaryFormat, binary);
10739
10740 try
10741 {
10742 gl::Context *context = gl::getNonLostContext();
10743
10744 if (context)
10745 {
10746 gl::Program *programObject = context->getProgram(program);
10747
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010748 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010750 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010751 }
10752
10753 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10754
10755 if (!programBinary)
10756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010757 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010758 }
10759
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010760 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010762 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010763 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010764
10765 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010766 }
10767 }
10768 catch(std::bad_alloc&)
10769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010770 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010771 }
10772}
10773
10774void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10775 const void *binary, GLint length)
10776{
10777 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10778 program, binaryFormat, binary, length);
10779
10780 try
10781 {
10782 gl::Context *context = gl::getNonLostContext();
10783
10784 if (context)
10785 {
10786 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010788 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010789 }
10790
10791 gl::Program *programObject = context->getProgram(program);
10792
10793 if (!programObject)
10794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010795 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010796 }
10797
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010798 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010799 }
10800 }
10801 catch(std::bad_alloc&)
10802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010803 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010804 }
10805}
10806
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010807void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10808{
10809 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10810
10811 try
10812 {
10813 gl::Context *context = gl::getNonLostContext();
10814
10815 if (context)
10816 {
10817 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10818 {
10819 return gl::error(GL_INVALID_VALUE);
10820 }
10821
10822 if (context->getDrawFramebufferHandle() == 0)
10823 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010824 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010825 {
10826 return gl::error(GL_INVALID_OPERATION);
10827 }
10828
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010829 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010830 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010831 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010832 }
10833 }
10834 else
10835 {
10836 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10837 {
10838 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10839 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10840 {
10841 return gl::error(GL_INVALID_OPERATION);
10842 }
10843 }
10844 }
10845
10846 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10847
10848 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10849 {
10850 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10851 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010852
10853 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10854 {
10855 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10856 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010857 }
10858 }
10859 catch (std::bad_alloc&)
10860 {
10861 return gl::error(GL_OUT_OF_MEMORY);
10862 }
10863}
10864
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010865__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10866{
10867 struct Extension
10868 {
10869 const char *name;
10870 __eglMustCastToProperFunctionPointerType address;
10871 };
10872
10873 static const Extension glExtensions[] =
10874 {
10875 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000010876 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000010877 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000010878 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10879 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10880 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10881 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10882 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10883 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10884 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000010885 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000010886 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000010887 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10888 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10889 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10890 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000010891 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10892 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10893 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10894 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10895 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10896 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10897 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000010898 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000010899 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10900 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10901 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010902 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10903 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010904
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000010905 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010906 {
10907 if (strcmp(procname, glExtensions[ext].name) == 0)
10908 {
10909 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10910 }
10911 }
10912
10913 return NULL;
10914}
10915
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000010916// Non-public functions used by EGL
10917
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010918bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010919{
10920 EVENT("(egl::Surface* surface = 0x%0.8p)",
10921 surface);
10922
10923 try
10924 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010925 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010926
10927 if (context)
10928 {
10929 gl::Texture2D *textureObject = context->getTexture2D();
10930
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010931 if (textureObject->isImmutable())
10932 {
10933 return false;
10934 }
10935
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010936 if (textureObject)
10937 {
10938 textureObject->bindTexImage(surface);
10939 }
10940 }
10941 }
10942 catch(std::bad_alloc&)
10943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010944 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010945 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000010946
10947 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000010948}
10949
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010950}