blob: 5ab406fe4289b1588714938e7d945343265b50b1 [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
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00003987 if (context->getClientVersion() < 3)
3988 {
3989 switch (pname)
3990 {
3991 case GL_ACTIVE_UNIFORM_BLOCKS:
3992 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3993 return gl::error(GL_INVALID_ENUM);
3994 }
3995 }
3996
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003997 switch (pname)
3998 {
3999 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004000 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 return;
4002 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004003 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 return;
4005 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004006 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007 return;
4008 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004009 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010 return;
4011 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004012 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004013 return;
4014 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004015 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004016 return;
4017 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00004018 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004019 return;
4020 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004021 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004022 return;
4023 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00004024 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004025 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004026 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00004027 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00004028 return;
shannonwoods@chromium.orge684b582013-05-30 00:07:42 +00004029 case GL_ACTIVE_UNIFORM_BLOCKS:
4030 *params = programObject->getActiveUniformBlockCount();
4031 return;
4032 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
4033 *params = programObject->getActiveUniformBlockMaxLength();
4034 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004036 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037 }
4038 }
4039 }
4040 catch(std::bad_alloc&)
4041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004043 }
4044}
4045
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004046void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004047{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004048 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 +00004049 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004050
4051 try
4052 {
4053 if (bufsize < 0)
4054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004056 }
4057
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004059
4060 if (context)
4061 {
4062 gl::Program *programObject = context->getProgram(program);
4063
4064 if (!programObject)
4065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004067 }
4068
4069 programObject->getInfoLog(bufsize, length, infolog);
4070 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004071 }
4072 catch(std::bad_alloc&)
4073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004074 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004075 }
4076}
4077
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004078void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
4079{
4080 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
4081
4082 try
4083 {
4084 switch (pname)
4085 {
4086 case GL_CURRENT_QUERY_EXT:
4087 break;
4088 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004089 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004090 }
4091
4092 gl::Context *context = gl::getNonLostContext();
4093
4094 if (context)
4095 {
4096 params[0] = context->getActiveQuery(target);
4097 }
4098 }
4099 catch(std::bad_alloc&)
4100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004102 }
4103}
4104
4105void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
4106{
4107 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
4108
4109 try
4110 {
4111 switch (pname)
4112 {
4113 case GL_QUERY_RESULT_EXT:
4114 case GL_QUERY_RESULT_AVAILABLE_EXT:
4115 break;
4116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004117 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004118 }
4119 gl::Context *context = gl::getNonLostContext();
4120
4121 if (context)
4122 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004123 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4124
4125 if (!queryObject)
4126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004127 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004128 }
4129
4130 if (context->getActiveQuery(queryObject->getType()) == id)
4131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004132 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004133 }
4134
4135 switch(pname)
4136 {
4137 case GL_QUERY_RESULT_EXT:
4138 params[0] = queryObject->getResult();
4139 break;
4140 case GL_QUERY_RESULT_AVAILABLE_EXT:
4141 params[0] = queryObject->isResultAvailable();
4142 break;
4143 default:
4144 ASSERT(false);
4145 }
4146 }
4147 }
4148 catch(std::bad_alloc&)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004151 }
4152}
4153
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
4155{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004156 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 +00004157
4158 try
4159 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004160 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004161
4162 if (context)
4163 {
4164 if (target != GL_RENDERBUFFER)
4165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004166 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004167 }
4168
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004169 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004171 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004172 }
4173
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004174 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004175
4176 switch (pname)
4177 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004178 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
4179 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
4180 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
4181 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
4182 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
4183 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
4184 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
4185 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
4186 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004187 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004188 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004189 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00004190 *params = renderbuffer->getSamples();
4191 }
4192 else
4193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004195 }
4196 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004197 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00004199 }
4200 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004201 }
4202 catch(std::bad_alloc&)
4203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004205 }
4206}
4207
4208void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
4209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004210 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004211
4212 try
4213 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004214 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004215
4216 if (context)
4217 {
4218 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004219
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220 if (!shaderObject)
4221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004222 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223 }
4224
4225 switch (pname)
4226 {
4227 case GL_SHADER_TYPE:
4228 *params = shaderObject->getType();
4229 return;
4230 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004231 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004232 return;
4233 case GL_COMPILE_STATUS:
4234 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
4235 return;
4236 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004237 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004238 return;
4239 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004240 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004241 return;
zmo@google.coma574f782011-10-03 21:45:23 +00004242 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
4243 *params = shaderObject->getTranslatedSourceLength();
4244 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004245 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004247 }
4248 }
4249 }
4250 catch(std::bad_alloc&)
4251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004252 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004253 }
4254}
4255
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004256void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004257{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004258 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 +00004259 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260
4261 try
4262 {
4263 if (bufsize < 0)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004268 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004269
4270 if (context)
4271 {
4272 gl::Shader *shaderObject = context->getShader(shader);
4273
4274 if (!shaderObject)
4275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004276 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004277 }
4278
4279 shaderObject->getInfoLog(bufsize, length, infolog);
4280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004281 }
4282 catch(std::bad_alloc&)
4283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004285 }
4286}
4287
4288void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
4289{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004290 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 +00004291 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292
4293 try
4294 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004295 switch (shadertype)
4296 {
4297 case GL_VERTEX_SHADER:
4298 case GL_FRAGMENT_SHADER:
4299 break;
4300 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004301 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004302 }
4303
4304 switch (precisiontype)
4305 {
4306 case GL_LOW_FLOAT:
4307 case GL_MEDIUM_FLOAT:
4308 case GL_HIGH_FLOAT:
4309 // Assume IEEE 754 precision
4310 range[0] = 127;
4311 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004312 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004313 break;
4314 case GL_LOW_INT:
4315 case GL_MEDIUM_INT:
4316 case GL_HIGH_INT:
4317 // Some (most) hardware only supports single-precision floating-point numbers,
4318 // which can accurately represent integers up to +/-16777216
4319 range[0] = 24;
4320 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00004321 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004322 break;
4323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00004325 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 }
4327 catch(std::bad_alloc&)
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330 }
4331}
4332
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004333void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004335 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 +00004336 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337
4338 try
4339 {
4340 if (bufsize < 0)
4341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004342 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 }
4344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004346
4347 if (context)
4348 {
4349 gl::Shader *shaderObject = context->getShader(shader);
4350
4351 if (!shaderObject)
4352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00004354 }
4355
4356 shaderObject->getSource(bufsize, length, source);
4357 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004358 }
4359 catch(std::bad_alloc&)
4360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362 }
4363}
4364
zmo@google.coma574f782011-10-03 21:45:23 +00004365void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
4366{
4367 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
4368 shader, bufsize, length, source);
4369
4370 try
4371 {
4372 if (bufsize < 0)
4373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004374 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00004375 }
4376
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004377 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00004378
4379 if (context)
4380 {
4381 gl::Shader *shaderObject = context->getShader(shader);
4382
4383 if (!shaderObject)
4384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004385 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00004386 }
4387
4388 shaderObject->getTranslatedSource(bufsize, length, source);
4389 }
4390 }
4391 catch(std::bad_alloc&)
4392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004393 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00004394 }
4395}
4396
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004397const GLubyte* __stdcall glGetString(GLenum name)
4398{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004399 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004400
4401 try
4402 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004403 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00004404
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004405 switch (name)
4406 {
4407 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00004408 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004409 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00004410 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004411 case GL_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004412 if (context->getClientVersion() == 2)
4413 {
4414 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
4415 }
4416 else
4417 {
4418 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " VERSION_STRING ")";
4419 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004420 case GL_SHADING_LANGUAGE_VERSION:
shannonwoods@chromium.orge2865d02013-05-30 00:06:01 +00004421 if (context->getClientVersion() == 2)
4422 {
4423 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
4424 }
4425 else
4426 {
4427 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " VERSION_STRING ")";
4428 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429 case GL_EXTENSIONS:
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00004430 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004431 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004432 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433 }
4434 }
4435 catch(std::bad_alloc&)
4436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004437 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004438 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439}
4440
4441void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
4442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004443 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 +00004444
4445 try
4446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004448
4449 if (context)
4450 {
4451 gl::Texture *texture;
4452
4453 switch (target)
4454 {
4455 case GL_TEXTURE_2D:
4456 texture = context->getTexture2D();
4457 break;
4458 case GL_TEXTURE_CUBE_MAP:
4459 texture = context->getTextureCubeMap();
4460 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004461 case GL_TEXTURE_3D:
4462 if (context->getClientVersion() < 3)
4463 {
4464 return gl::error(GL_INVALID_ENUM);
4465 }
4466 texture = context->getTexture3D();
4467 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004468 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004469 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004470 }
4471
4472 switch (pname)
4473 {
4474 case GL_TEXTURE_MAG_FILTER:
4475 *params = (GLfloat)texture->getMagFilter();
4476 break;
4477 case GL_TEXTURE_MIN_FILTER:
4478 *params = (GLfloat)texture->getMinFilter();
4479 break;
4480 case GL_TEXTURE_WRAP_S:
4481 *params = (GLfloat)texture->getWrapS();
4482 break;
4483 case GL_TEXTURE_WRAP_T:
4484 *params = (GLfloat)texture->getWrapT();
4485 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004486 case GL_TEXTURE_WRAP_R:
4487 if (context->getClientVersion() < 3)
4488 {
4489 return gl::error(GL_INVALID_ENUM);
4490 }
4491 *params = (GLfloat)texture->getWrapR();
4492 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004493 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4494 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
4495 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004496 case GL_TEXTURE_USAGE_ANGLE:
4497 *params = (GLfloat)texture->getUsage();
4498 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004499 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4500 if (!context->supportsTextureFilterAnisotropy())
4501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004502 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004503 }
4504 *params = (GLfloat)texture->getMaxAnisotropy();
4505 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004506 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004507 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004508 }
4509 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004510 }
4511 catch(std::bad_alloc&)
4512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004513 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004514 }
4515}
4516
4517void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
4518{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004519 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 +00004520
4521 try
4522 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004523 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004524
4525 if (context)
4526 {
4527 gl::Texture *texture;
4528
4529 switch (target)
4530 {
4531 case GL_TEXTURE_2D:
4532 texture = context->getTexture2D();
4533 break;
4534 case GL_TEXTURE_CUBE_MAP:
4535 texture = context->getTextureCubeMap();
4536 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00004537 case GL_TEXTURE_3D:
4538 if (context->getClientVersion() < 3)
4539 {
4540 return gl::error(GL_INVALID_ENUM);
4541 }
4542 texture = context->getTexture3D();
4543 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004544 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004545 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004546 }
4547
4548 switch (pname)
4549 {
4550 case GL_TEXTURE_MAG_FILTER:
4551 *params = texture->getMagFilter();
4552 break;
4553 case GL_TEXTURE_MIN_FILTER:
4554 *params = texture->getMinFilter();
4555 break;
4556 case GL_TEXTURE_WRAP_S:
4557 *params = texture->getWrapS();
4558 break;
4559 case GL_TEXTURE_WRAP_T:
4560 *params = texture->getWrapT();
4561 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00004562 case GL_TEXTURE_WRAP_R:
4563 if (context->getClientVersion() < 3)
4564 {
4565 return gl::error(GL_INVALID_ENUM);
4566 }
4567 *params = texture->getWrapR();
4568 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00004569 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
4570 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
4571 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00004572 case GL_TEXTURE_USAGE_ANGLE:
4573 *params = texture->getUsage();
4574 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004575 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
4576 if (!context->supportsTextureFilterAnisotropy())
4577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00004579 }
4580 *params = (GLint)texture->getMaxAnisotropy();
4581 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004582 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004583 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00004584 }
4585 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004586 }
4587 catch(std::bad_alloc&)
4588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004589 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590 }
4591}
4592
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004593void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
4594{
4595 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
4596 program, location, bufSize, params);
4597
4598 try
4599 {
4600 if (bufSize < 0)
4601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004602 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004603 }
4604
4605 gl::Context *context = gl::getNonLostContext();
4606
4607 if (context)
4608 {
4609 if (program == 0)
4610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004612 }
4613
4614 gl::Program *programObject = context->getProgram(program);
4615
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004616 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004617 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004618 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004619 }
4620
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004621 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4622 if (!programBinary)
4623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004624 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004625 }
4626
4627 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004629 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004630 }
4631 }
4632 }
4633 catch(std::bad_alloc&)
4634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004635 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004636 }
4637}
4638
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4640{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004641 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642
4643 try
4644 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004645 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004646
4647 if (context)
4648 {
4649 if (program == 0)
4650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004652 }
4653
4654 gl::Program *programObject = context->getProgram(program);
4655
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004656 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004658 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004659 }
4660
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004661 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4662 if (!programBinary)
4663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004664 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004665 }
4666
4667 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004669 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004670 }
4671 }
4672 }
4673 catch(std::bad_alloc&)
4674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004676 }
4677}
4678
4679void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4680{
4681 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4682 program, location, bufSize, params);
4683
4684 try
4685 {
4686 if (bufSize < 0)
4687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004689 }
4690
4691 gl::Context *context = gl::getNonLostContext();
4692
4693 if (context)
4694 {
4695 if (program == 0)
4696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004697 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004698 }
4699
4700 gl::Program *programObject = context->getProgram(program);
4701
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004702 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004704 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004705 }
4706
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004707 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4708 if (!programBinary)
4709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004710 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004711 }
4712
4713 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004715 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004716 }
4717 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004718 }
4719 catch(std::bad_alloc&)
4720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004722 }
4723}
4724
4725void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004727 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004728
4729 try
4730 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004731 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004732
4733 if (context)
4734 {
4735 if (program == 0)
4736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004737 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004738 }
4739
4740 gl::Program *programObject = context->getProgram(program);
4741
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004742 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004743 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004744 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004745 }
4746
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004747 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4748 if (!programBinary)
4749 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004750 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004751 }
4752
4753 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004755 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004756 }
4757 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004758 }
4759 catch(std::bad_alloc&)
4760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004761 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004762 }
4763}
4764
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004765int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004766{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004767 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004768
4769 try
4770 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004771 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772
4773 if (strstr(name, "gl_") == name)
4774 {
4775 return -1;
4776 }
4777
4778 if (context)
4779 {
4780 gl::Program *programObject = context->getProgram(program);
4781
4782 if (!programObject)
4783 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004784 if (context->getShader(program))
4785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004786 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004787 }
4788 else
4789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004790 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004791 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792 }
4793
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004794 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004795 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004797 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798 }
4799
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004800 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004801 }
4802 }
4803 catch(std::bad_alloc&)
4804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004805 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004806 }
4807
4808 return -1;
4809}
4810
4811void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004813 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814
4815 try
4816 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818
daniel@transgaming.come0078962010-04-15 20:45:08 +00004819 if (context)
4820 {
4821 if (index >= gl::MAX_VERTEX_ATTRIBS)
4822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004823 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004824 }
4825
daniel@transgaming.com83921382011-01-08 05:46:00 +00004826 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004827
daniel@transgaming.come0078962010-04-15 20:45:08 +00004828 switch (pname)
4829 {
4830 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004831 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004832 break;
4833 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004834 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004835 break;
4836 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004837 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004838 break;
4839 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004840 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004841 break;
4842 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004843 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004844 break;
4845 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004846 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004847 break;
4848 case GL_CURRENT_VERTEX_ATTRIB:
4849 for (int i = 0; i < 4; ++i)
4850 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004851 params[i] = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004852 }
4853 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004854 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4855 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4856 // the same constant.
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004857 *params = (GLfloat)attribState.mDivisor;
4858 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004859 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004860 }
4861 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862 }
4863 catch(std::bad_alloc&)
4864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004866 }
4867}
4868
4869void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004871 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004872
4873 try
4874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004876
daniel@transgaming.come0078962010-04-15 20:45:08 +00004877 if (context)
4878 {
4879 if (index >= gl::MAX_VERTEX_ATTRIBS)
4880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004882 }
4883
daniel@transgaming.com83921382011-01-08 05:46:00 +00004884 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004885
daniel@transgaming.come0078962010-04-15 20:45:08 +00004886 switch (pname)
4887 {
4888 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004889 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004890 break;
4891 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004892 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004893 break;
4894 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004895 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004896 break;
4897 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004898 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004899 break;
4900 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004901 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004902 break;
4903 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004904 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004905 break;
4906 case GL_CURRENT_VERTEX_ATTRIB:
4907 for (int i = 0; i < 4; ++i)
4908 {
shannon.woods%transgaming.com@gtempaccount.com3026dc72013-04-13 03:37:27 +00004909 float currentValue = attribState.mCurrentValue.FloatValues[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004910 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4911 }
4912 break;
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +00004913 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
4914 // Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
4915 // the same constant.
4916 META_ASSERT(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004917 *params = (GLint)attribState.mDivisor;
4918 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004919 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004920 }
4921 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 }
4923 catch(std::bad_alloc&)
4924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004925 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004926 }
4927}
4928
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004929void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004930{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004931 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004932
4933 try
4934 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004935 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936
daniel@transgaming.come0078962010-04-15 20:45:08 +00004937 if (context)
4938 {
4939 if (index >= gl::MAX_VERTEX_ATTRIBS)
4940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004941 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004942 }
4943
4944 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004946 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004947 }
4948
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004949 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004950 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951 }
4952 catch(std::bad_alloc&)
4953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004954 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004955 }
4956}
4957
4958void __stdcall glHint(GLenum target, GLenum mode)
4959{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004960 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004961
4962 try
4963 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004964 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004965 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004966 case GL_FASTEST:
4967 case GL_NICEST:
4968 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004969 break;
4970 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004971 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004972 }
4973
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004974 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004975 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004976 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004977 case GL_GENERATE_MIPMAP_HINT:
4978 if (context) context->setGenerateMipmapHint(mode);
4979 break;
4980 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4981 if (context) context->setFragmentShaderDerivativeHint(mode);
4982 break;
4983 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004984 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004985 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986 }
4987 catch(std::bad_alloc&)
4988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004989 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004990 }
4991}
4992
4993GLboolean __stdcall glIsBuffer(GLuint buffer)
4994{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004995 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004996
4997 try
4998 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004999 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005000
5001 if (context && buffer)
5002 {
5003 gl::Buffer *bufferObject = context->getBuffer(buffer);
5004
5005 if (bufferObject)
5006 {
5007 return GL_TRUE;
5008 }
5009 }
5010 }
5011 catch(std::bad_alloc&)
5012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005013 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014 }
5015
5016 return GL_FALSE;
5017}
5018
5019GLboolean __stdcall glIsEnabled(GLenum cap)
5020{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005021 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005022
5023 try
5024 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005026
5027 if (context)
5028 {
5029 switch (cap)
5030 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005031 case GL_CULL_FACE: return context->isCullFaceEnabled();
5032 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
5033 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
5034 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
5035 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
5036 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
5037 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
5038 case GL_BLEND: return context->isBlendEnabled();
5039 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005041 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043 }
5044 }
5045 catch(std::bad_alloc&)
5046 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005047 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005048 }
5049
5050 return false;
5051}
5052
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005053GLboolean __stdcall glIsFenceNV(GLuint fence)
5054{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005055 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005056
5057 try
5058 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005059 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005060
5061 if (context)
5062 {
5063 gl::Fence *fenceObject = context->getFence(fence);
5064
5065 if (fenceObject == NULL)
5066 {
5067 return GL_FALSE;
5068 }
5069
5070 return fenceObject->isFence();
5071 }
5072 }
5073 catch(std::bad_alloc&)
5074 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005075 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005076 }
5077
5078 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005079}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005080
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005081GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
5082{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005083 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005084
5085 try
5086 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088
5089 if (context && framebuffer)
5090 {
5091 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
5092
5093 if (framebufferObject)
5094 {
5095 return GL_TRUE;
5096 }
5097 }
5098 }
5099 catch(std::bad_alloc&)
5100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005101 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005102 }
5103
5104 return GL_FALSE;
5105}
5106
5107GLboolean __stdcall glIsProgram(GLuint program)
5108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005109 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005110
5111 try
5112 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114
5115 if (context && program)
5116 {
5117 gl::Program *programObject = context->getProgram(program);
5118
5119 if (programObject)
5120 {
5121 return GL_TRUE;
5122 }
5123 }
5124 }
5125 catch(std::bad_alloc&)
5126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005127 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005128 }
5129
5130 return GL_FALSE;
5131}
5132
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005133GLboolean __stdcall glIsQueryEXT(GLuint id)
5134{
5135 EVENT("(GLuint id = %d)", id);
5136
5137 try
5138 {
5139 if (id == 0)
5140 {
5141 return GL_FALSE;
5142 }
5143
5144 gl::Context *context = gl::getNonLostContext();
5145
5146 if (context)
5147 {
5148 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
5149
5150 if (queryObject)
5151 {
5152 return GL_TRUE;
5153 }
5154 }
5155 }
5156 catch(std::bad_alloc&)
5157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005158 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00005159 }
5160
5161 return GL_FALSE;
5162}
5163
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005164GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
5165{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005166 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005167
5168 try
5169 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005170 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005171
5172 if (context && renderbuffer)
5173 {
5174 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
5175
5176 if (renderbufferObject)
5177 {
5178 return GL_TRUE;
5179 }
5180 }
5181 }
5182 catch(std::bad_alloc&)
5183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005184 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005185 }
5186
5187 return GL_FALSE;
5188}
5189
5190GLboolean __stdcall glIsShader(GLuint shader)
5191{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005192 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005193
5194 try
5195 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005196 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005197
5198 if (context && shader)
5199 {
5200 gl::Shader *shaderObject = context->getShader(shader);
5201
5202 if (shaderObject)
5203 {
5204 return GL_TRUE;
5205 }
5206 }
5207 }
5208 catch(std::bad_alloc&)
5209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005210 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005211 }
5212
5213 return GL_FALSE;
5214}
5215
5216GLboolean __stdcall glIsTexture(GLuint texture)
5217{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005218 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219
5220 try
5221 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005222 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223
5224 if (context && texture)
5225 {
5226 gl::Texture *textureObject = context->getTexture(texture);
5227
5228 if (textureObject)
5229 {
5230 return GL_TRUE;
5231 }
5232 }
5233 }
5234 catch(std::bad_alloc&)
5235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005236 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005237 }
5238
5239 return GL_FALSE;
5240}
5241
5242void __stdcall glLineWidth(GLfloat width)
5243{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005244 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005245
5246 try
5247 {
5248 if (width <= 0.0f)
5249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005250 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005251 }
5252
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005253 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00005254
5255 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005257 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005258 }
5259 }
5260 catch(std::bad_alloc&)
5261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263 }
5264}
5265
5266void __stdcall glLinkProgram(GLuint program)
5267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005268 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005269
5270 try
5271 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273
5274 if (context)
5275 {
5276 gl::Program *programObject = context->getProgram(program);
5277
5278 if (!programObject)
5279 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005280 if (context->getShader(program))
5281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005282 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005283 }
5284 else
5285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005286 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00005287 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 }
5289
daniel@transgaming.com95d29422012-07-24 18:36:10 +00005290 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 }
5292 }
5293 catch(std::bad_alloc&)
5294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005295 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005296 }
5297}
5298
5299void __stdcall glPixelStorei(GLenum pname, GLint param)
5300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005301 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005302
5303 try
5304 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005306
5307 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005308 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005309 switch (pname)
5310 {
5311 case GL_UNPACK_ALIGNMENT:
5312 if (param != 1 && param != 2 && param != 4 && param != 8)
5313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005314 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005315 }
5316
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005317 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005318 break;
5319
5320 case GL_PACK_ALIGNMENT:
5321 if (param != 1 && param != 2 && param != 4 && param != 8)
5322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005323 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005324 }
5325
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005326 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005327 break;
5328
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00005329 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
5330 context->setPackReverseRowOrder(param != 0);
5331 break;
5332
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005333 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005334 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00005335 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336 }
5337 }
5338 catch(std::bad_alloc&)
5339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005341 }
5342}
5343
5344void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
5345{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005346 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005347
5348 try
5349 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005350 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00005351
5352 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005353 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005354 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005355 }
5356 }
5357 catch(std::bad_alloc&)
5358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005359 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005360 }
5361}
5362
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005363void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
5364 GLenum format, GLenum type, GLsizei bufSize,
5365 GLvoid *data)
5366{
5367 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
5368 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
5369 x, y, width, height, format, type, bufSize, data);
5370
5371 try
5372 {
5373 if (width < 0 || height < 0 || bufSize < 0)
5374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005376 }
5377
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005378 gl::Context *context = gl::getNonLostContext();
5379
5380 if (context)
5381 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005382 GLenum currentFormat, currentType;
5383
5384 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5385 // and attempting to read back if that's the case is an error. The error will be registered
5386 // by getCurrentReadFormat.
5387 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5388 return;
5389
5390 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005392 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005393 }
5394
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005395 context->readPixels(x, y, width, height, format, type, &bufSize, data);
5396 }
5397 }
5398 catch(std::bad_alloc&)
5399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005400 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005401 }
5402}
5403
5404void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
5405 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005406{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005407 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005408 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005409 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005410
5411 try
5412 {
5413 if (width < 0 || height < 0)
5414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005415 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005416 }
5417
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005419
5420 if (context)
5421 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005422 GLenum currentFormat, currentType;
5423
5424 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
5425 // and attempting to read back if that's the case is an error. The error will be registered
5426 // by getCurrentReadFormat.
5427 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
5428 return;
5429
5430 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
5431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005432 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00005433 }
5434
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00005435 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005436 }
5437 }
5438 catch(std::bad_alloc&)
5439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005440 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005441 }
5442}
5443
5444void __stdcall glReleaseShaderCompiler(void)
5445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005446 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005447
5448 try
5449 {
5450 gl::Shader::releaseCompiler();
5451 }
5452 catch(std::bad_alloc&)
5453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455 }
5456}
5457
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005458void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005459{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005460 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 +00005461 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462
5463 try
5464 {
5465 switch (target)
5466 {
5467 case GL_RENDERBUFFER:
5468 break;
5469 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005470 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005471 }
5472
daniel@transgaming.comedc19182010-10-15 17:57:55 +00005473 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005475 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476 }
5477
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005478 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005480 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 }
5482
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484
5485 if (context)
5486 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005487 if (width > context->getMaximumRenderbufferDimension() ||
5488 height > context->getMaximumRenderbufferDimension() ||
5489 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005491 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005492 }
5493
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00005494 GLuint handle = context->getRenderbufferHandle();
5495 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005498 }
5499
5500 switch (internalformat)
5501 {
5502 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005503 case GL_RGBA4:
5504 case GL_RGB5_A1:
5505 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00005506 case GL_RGB8_OES:
5507 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005508 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005509 case GL_DEPTH24_STENCIL8_OES:
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005510 break;
5511 case GL_SRGB8_ALPHA8:
5512 case GL_RGB10_A2:
5513 case GL_RG8:
5514 case GL_R8:
5515 if (context->getClientVersion() < 3)
5516 {
5517 return gl::error(GL_INVALID_ENUM);
5518 }
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00005519 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005520 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005521 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005522 }
shannon.woods%transgaming.com@gtempaccount.com8dce6512013-04-13 03:42:19 +00005523
5524 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005525 }
5526 }
5527 catch(std::bad_alloc&)
5528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005529 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005530 }
5531}
5532
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00005533void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
5534{
5535 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
5536}
5537
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005538void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
5539{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00005540 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005541
5542 try
5543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005544 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005545
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005546 if (context)
5547 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00005548 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005549 }
5550 }
5551 catch(std::bad_alloc&)
5552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005553 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005554 }
5555}
5556
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005557void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
5558{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005559 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005560
5561 try
5562 {
5563 if (condition != GL_ALL_COMPLETED_NV)
5564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005566 }
5567
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005568 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005569
5570 if (context)
5571 {
5572 gl::Fence *fenceObject = context->getFence(fence);
5573
5574 if (fenceObject == NULL)
5575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005576 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005577 }
5578
5579 fenceObject->setFence(condition);
5580 }
5581 }
5582 catch(std::bad_alloc&)
5583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005584 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005585 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005586}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005587
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
5589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005590 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 +00005591
5592 try
5593 {
5594 if (width < 0 || height < 0)
5595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597 }
5598
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005599 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005600
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005601 if (context)
5602 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005603 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005604 }
5605 }
5606 catch(std::bad_alloc&)
5607 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005608 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005609 }
5610}
5611
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005612void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005613{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005614 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005615 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005616 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617
5618 try
5619 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00005620 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005621 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005622 }
5623 catch(std::bad_alloc&)
5624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005625 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626 }
5627}
5628
shannon.woods%transgaming.com@gtempaccount.com5f339332013-04-13 03:29:02 +00005629void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005630{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005631 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 +00005632 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005633
5634 try
5635 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005636 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005639 }
5640
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005641 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005642
5643 if (context)
5644 {
5645 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005646
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647 if (!shaderObject)
5648 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005649 if (context->getProgram(shader))
5650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005652 }
5653 else
5654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005655 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005657 }
5658
5659 shaderObject->setSource(count, string, length);
5660 }
5661 }
5662 catch(std::bad_alloc&)
5663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005664 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005665 }
5666}
5667
5668void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5669{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005670 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005671}
5672
5673void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5674{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005675 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 +00005676
5677 try
5678 {
5679 switch (face)
5680 {
5681 case GL_FRONT:
5682 case GL_BACK:
5683 case GL_FRONT_AND_BACK:
5684 break;
5685 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005686 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005687 }
5688
5689 switch (func)
5690 {
5691 case GL_NEVER:
5692 case GL_ALWAYS:
5693 case GL_LESS:
5694 case GL_LEQUAL:
5695 case GL_EQUAL:
5696 case GL_GEQUAL:
5697 case GL_GREATER:
5698 case GL_NOTEQUAL:
5699 break;
5700 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005701 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005702 }
5703
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005704 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005705
5706 if (context)
5707 {
5708 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5709 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005710 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005711 }
5712
5713 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5714 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005715 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005716 }
5717 }
5718 }
5719 catch(std::bad_alloc&)
5720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005722 }
5723}
5724
5725void __stdcall glStencilMask(GLuint mask)
5726{
5727 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5728}
5729
5730void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5731{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005732 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005733
5734 try
5735 {
5736 switch (face)
5737 {
5738 case GL_FRONT:
5739 case GL_BACK:
5740 case GL_FRONT_AND_BACK:
5741 break;
5742 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005743 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005744 }
5745
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005746 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005747
5748 if (context)
5749 {
5750 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5751 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005752 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005753 }
5754
5755 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5756 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005757 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005758 }
5759 }
5760 }
5761 catch(std::bad_alloc&)
5762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005764 }
5765}
5766
5767void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5768{
5769 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5770}
5771
5772void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5773{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005774 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 +00005775 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005776
5777 try
5778 {
5779 switch (face)
5780 {
5781 case GL_FRONT:
5782 case GL_BACK:
5783 case GL_FRONT_AND_BACK:
5784 break;
5785 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005786 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005787 }
5788
5789 switch (fail)
5790 {
5791 case GL_ZERO:
5792 case GL_KEEP:
5793 case GL_REPLACE:
5794 case GL_INCR:
5795 case GL_DECR:
5796 case GL_INVERT:
5797 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005798 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005799 break;
5800 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005802 }
5803
5804 switch (zfail)
5805 {
5806 case GL_ZERO:
5807 case GL_KEEP:
5808 case GL_REPLACE:
5809 case GL_INCR:
5810 case GL_DECR:
5811 case GL_INVERT:
5812 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005813 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005814 break;
5815 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005816 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005817 }
5818
5819 switch (zpass)
5820 {
5821 case GL_ZERO:
5822 case GL_KEEP:
5823 case GL_REPLACE:
5824 case GL_INCR:
5825 case GL_DECR:
5826 case GL_INVERT:
5827 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005828 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005829 break;
5830 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005831 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005832 }
5833
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005834 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835
5836 if (context)
5837 {
5838 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5839 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005840 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005841 }
5842
5843 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5844 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005845 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005846 }
5847 }
5848 }
5849 catch(std::bad_alloc&)
5850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005851 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005852 }
5853}
5854
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005855GLboolean __stdcall glTestFenceNV(GLuint fence)
5856{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005857 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005858
5859 try
5860 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005861 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005862
5863 if (context)
5864 {
5865 gl::Fence *fenceObject = context->getFence(fence);
5866
5867 if (fenceObject == NULL)
5868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005869 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005870 }
5871
5872 return fenceObject->testFence();
5873 }
5874 }
5875 catch(std::bad_alloc&)
5876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005877 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005878 }
5879
5880 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005881}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005882
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005883void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5884 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005886 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 +00005887 "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 +00005888 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005889
5890 try
5891 {
shannon.woods%transgaming.com@gtempaccount.com6d73c4e2013-04-13 03:45:12 +00005892 if (!validImageSize(level, width, height, 1))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005894 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005895 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005896
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005897 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005899 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900 }
5901
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005902 // validate <type> by itself (used as secondary key below)
5903 switch (type)
5904 {
5905 case GL_UNSIGNED_BYTE:
5906 case GL_UNSIGNED_SHORT_5_6_5:
5907 case GL_UNSIGNED_SHORT_4_4_4_4:
5908 case GL_UNSIGNED_SHORT_5_5_5_1:
5909 case GL_UNSIGNED_SHORT:
5910 case GL_UNSIGNED_INT:
5911 case GL_UNSIGNED_INT_24_8_OES:
5912 case GL_HALF_FLOAT_OES:
5913 case GL_FLOAT:
5914 break;
5915 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005916 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005917 }
5918
5919 // validate <format> + <type> combinations
5920 // - invalid <format> -> sets INVALID_ENUM
5921 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005922 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005923 {
5924 case GL_ALPHA:
5925 case GL_LUMINANCE:
5926 case GL_LUMINANCE_ALPHA:
5927 switch (type)
5928 {
5929 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005930 case GL_FLOAT:
5931 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005932 break;
5933 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005935 }
5936 break;
5937 case GL_RGB:
5938 switch (type)
5939 {
5940 case GL_UNSIGNED_BYTE:
5941 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005942 case GL_FLOAT:
5943 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944 break;
5945 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005946 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 }
5948 break;
5949 case GL_RGBA:
5950 switch (type)
5951 {
5952 case GL_UNSIGNED_BYTE:
5953 case GL_UNSIGNED_SHORT_4_4_4_4:
5954 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005955 case GL_FLOAT:
5956 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005957 break;
5958 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005959 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005960 }
5961 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005962 case GL_BGRA_EXT:
5963 switch (type)
5964 {
5965 case GL_UNSIGNED_BYTE:
5966 break;
5967 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005968 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005969 }
5970 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005971 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5972 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005973 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5974 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005975 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005976 case GL_DEPTH_COMPONENT:
5977 switch (type)
5978 {
5979 case GL_UNSIGNED_SHORT:
5980 case GL_UNSIGNED_INT:
5981 break;
5982 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005983 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005984 }
5985 break;
5986 case GL_DEPTH_STENCIL_OES:
5987 switch (type)
5988 {
5989 case GL_UNSIGNED_INT_24_8_OES:
5990 break;
5991 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005992 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005993 }
5994 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005996 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005997 }
5998
5999 if (border != 0)
6000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006002 }
6003
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006004 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006005
6006 if (context)
6007 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006008 if (level > context->getMaximumTextureLevel())
6009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00006011 }
6012
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006013 switch (target)
6014 {
6015 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006016 if (width > (context->getMaximum2DTextureDimension() >> level) ||
6017 height > (context->getMaximum2DTextureDimension() >> level))
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006019 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006020 }
6021 break;
6022 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6023 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6024 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6025 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6026 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6027 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6028 if (width != height)
6029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006031 }
6032
6033 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
6034 height > (context->getMaximumCubeTextureDimension() >> level))
6035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006037 }
6038 break;
6039 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006040 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006041 }
6042
gman@chromium.org50c526d2011-08-10 05:19:44 +00006043 switch (format) {
6044 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6045 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6046 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00006047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006048 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006049 }
6050 else
6051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006052 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00006053 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00006054 break;
6055 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6056 if (context->supportsDXT3Textures())
6057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006058 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006059 }
6060 else
6061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006062 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006063 }
6064 break;
6065 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6066 if (context->supportsDXT5Textures())
6067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006068 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006069 }
6070 else
6071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006072 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00006073 }
6074 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006075 case GL_DEPTH_COMPONENT:
6076 case GL_DEPTH_STENCIL_OES:
6077 if (!context->supportsDepthTextures())
6078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006080 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006081 if (target != GL_TEXTURE_2D)
6082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006083 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006084 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006085 // OES_depth_texture supports loading depth data and multiple levels,
6086 // but ANGLE_depth_texture does not
6087 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006089 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006090 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006091 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00006092 default:
6093 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00006094 }
6095
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006096 if (type == GL_FLOAT)
6097 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006098 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006100 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006101 }
6102 }
6103 else if (type == GL_HALF_FLOAT_OES)
6104 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006105 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006107 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006108 }
6109 }
6110
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006111 if (target == GL_TEXTURE_2D)
6112 {
6113 gl::Texture2D *texture = context->getTexture2D();
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
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006125 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006126 }
6127 else
6128 {
6129 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6130
6131 if (!texture)
6132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006133 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006134 }
6135
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006136 if (texture->isImmutable())
6137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006138 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006139 }
6140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006141 switch (target)
6142 {
6143 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006144 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145 break;
6146 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006147 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006148 break;
6149 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006150 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006151 break;
6152 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006153 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154 break;
6155 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006156 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006157 break;
6158 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00006159 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006160 break;
6161 default: UNREACHABLE();
6162 }
6163 }
6164 }
6165 }
6166 catch(std::bad_alloc&)
6167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006168 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006169 }
6170}
6171
6172void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
6173{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006174 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
6175
6176 try
6177 {
6178 gl::Context *context = gl::getNonLostContext();
6179
6180 if (context)
6181 {
6182 gl::Texture *texture;
6183
6184 switch (target)
6185 {
6186 case GL_TEXTURE_2D:
6187 texture = context->getTexture2D();
6188 break;
6189 case GL_TEXTURE_CUBE_MAP:
6190 texture = context->getTextureCubeMap();
6191 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006192 case GL_TEXTURE_3D:
6193 if (context->getClientVersion() < 3)
6194 {
6195 return gl::error(GL_INVALID_ENUM);
6196 }
6197 texture = context->getTexture3D();
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006198 case GL_TEXTURE_2D_ARRAY:
6199 if (context->getClientVersion() < 3)
6200 {
6201 return gl::error(GL_INVALID_ENUM);
6202 }
6203 texture = context->getTexture2DArray();
6204 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006205 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006206 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006207 }
6208
6209 switch (pname)
6210 {
6211 case GL_TEXTURE_WRAP_S:
6212 if (!texture->setWrapS((GLenum)param))
6213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006214 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006215 }
6216 break;
6217 case GL_TEXTURE_WRAP_T:
6218 if (!texture->setWrapT((GLenum)param))
6219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006220 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006221 }
6222 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006223 case GL_TEXTURE_WRAP_R:
6224 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6225 {
6226 return gl::error(GL_INVALID_ENUM);
6227 }
6228 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006229 case GL_TEXTURE_MIN_FILTER:
6230 if (!texture->setMinFilter((GLenum)param))
6231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006232 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006233 }
6234 break;
6235 case GL_TEXTURE_MAG_FILTER:
6236 if (!texture->setMagFilter((GLenum)param))
6237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006239 }
6240 break;
6241 case GL_TEXTURE_USAGE_ANGLE:
6242 if (!texture->setUsage((GLenum)param))
6243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006244 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006245 }
6246 break;
6247 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6248 if (!context->supportsTextureFilterAnisotropy())
6249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006250 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006251 }
6252 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006254 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006255 }
6256 break;
6257 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006258 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006259 }
6260 }
6261 }
6262 catch(std::bad_alloc&)
6263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006264 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006265 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006266}
6267
6268void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
6269{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006270 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006271}
6272
6273void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
6274{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006275 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006276
6277 try
6278 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006279 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006280
6281 if (context)
6282 {
6283 gl::Texture *texture;
6284
6285 switch (target)
6286 {
6287 case GL_TEXTURE_2D:
6288 texture = context->getTexture2D();
6289 break;
6290 case GL_TEXTURE_CUBE_MAP:
6291 texture = context->getTextureCubeMap();
6292 break;
shannon.woods%transgaming.com@gtempaccount.comc416e1c2013-04-13 03:45:05 +00006293 case GL_TEXTURE_3D:
6294 if (context->getClientVersion() < 3)
6295 {
6296 return gl::error(GL_INVALID_ENUM);
6297 }
6298 texture = context->getTexture3D();
6299 break;
shannon.woods%transgaming.com@gtempaccount.com90dbc442013-04-13 03:46:14 +00006300 case GL_TEXTURE_2D_ARRAY:
6301 if (context->getClientVersion() < 3)
6302 {
6303 return gl::error(GL_INVALID_ENUM);
6304 }
6305 texture = context->getTexture2DArray();
6306 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006307 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006309 }
6310
6311 switch (pname)
6312 {
6313 case GL_TEXTURE_WRAP_S:
6314 if (!texture->setWrapS((GLenum)param))
6315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006316 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006317 }
6318 break;
6319 case GL_TEXTURE_WRAP_T:
6320 if (!texture->setWrapT((GLenum)param))
6321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006322 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006323 }
6324 break;
shannon.woods%transgaming.com@gtempaccount.com0b3a8df2013-04-13 03:44:51 +00006325 case GL_TEXTURE_WRAP_R:
6326 if (context->getClientVersion() < 3 || !texture->setWrapR((GLenum)param))
6327 {
6328 return gl::error(GL_INVALID_ENUM);
6329 }
6330 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006331 case GL_TEXTURE_MIN_FILTER:
6332 if (!texture->setMinFilter((GLenum)param))
6333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006334 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006335 }
6336 break;
6337 case GL_TEXTURE_MAG_FILTER:
6338 if (!texture->setMagFilter((GLenum)param))
6339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006340 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006341 }
6342 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006343 case GL_TEXTURE_USAGE_ANGLE:
6344 if (!texture->setUsage((GLenum)param))
6345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006346 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00006347 }
6348 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006349 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
6350 if (!context->supportsTextureFilterAnisotropy())
6351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006352 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006353 }
6354 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
6355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006356 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00006357 }
6358 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006359 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006360 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006361 }
6362 }
6363 }
6364 catch(std::bad_alloc&)
6365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006367 }
6368}
6369
6370void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
6371{
6372 glTexParameteri(target, pname, *params);
6373}
6374
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006375void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
6376{
6377 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6378 target, levels, internalformat, width, height);
6379
6380 try
6381 {
6382 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
6383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006384 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006385 }
6386
6387 if (width < 1 || height < 1 || levels < 1)
6388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006389 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006390 }
6391
6392 if (target == GL_TEXTURE_CUBE_MAP && width != height)
6393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006394 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006395 }
6396
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00006397 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006400 }
6401
6402 GLenum format = gl::ExtractFormat(internalformat);
6403 GLenum type = gl::ExtractType(internalformat);
6404
6405 if (format == GL_NONE || type == GL_NONE)
6406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006407 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006408 }
6409
6410 gl::Context *context = gl::getNonLostContext();
6411
6412 if (context)
6413 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006414 switch (target)
6415 {
6416 case GL_TEXTURE_2D:
shannon.woods%transgaming.com@gtempaccount.comc1fdf6b2013-04-13 03:44:41 +00006417 if (width > context->getMaximum2DTextureDimension() ||
6418 height > context->getMaximum2DTextureDimension())
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006421 }
6422 break;
6423 case GL_TEXTURE_CUBE_MAP:
6424 if (width > context->getMaximumCubeTextureDimension() ||
6425 height > context->getMaximumCubeTextureDimension())
6426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006427 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006428 }
6429 break;
6430 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00006432 }
6433
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006434 if (levels != 1 && !context->supportsNonPower2Texture())
6435 {
6436 if (!gl::isPow2(width) || !gl::isPow2(height))
6437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006438 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006439 }
6440 }
6441
daniel@transgaming.come1077362011-11-11 04:16:50 +00006442 switch (internalformat)
6443 {
6444 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
6445 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
6446 if (!context->supportsDXT1Textures())
6447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006448 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006449 }
6450 break;
6451 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
6452 if (!context->supportsDXT3Textures())
6453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006455 }
6456 break;
6457 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
6458 if (!context->supportsDXT5Textures())
6459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006460 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00006461 }
6462 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006463 case GL_RGBA32F_EXT:
6464 case GL_RGB32F_EXT:
6465 case GL_ALPHA32F_EXT:
6466 case GL_LUMINANCE32F_EXT:
6467 case GL_LUMINANCE_ALPHA32F_EXT:
6468 if (!context->supportsFloat32Textures())
6469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006470 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006471 }
6472 break;
6473 case GL_RGBA16F_EXT:
6474 case GL_RGB16F_EXT:
6475 case GL_ALPHA16F_EXT:
6476 case GL_LUMINANCE16F_EXT:
6477 case GL_LUMINANCE_ALPHA16F_EXT:
6478 if (!context->supportsFloat16Textures())
6479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006480 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00006481 }
6482 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006483 case GL_DEPTH_COMPONENT16:
6484 case GL_DEPTH_COMPONENT32_OES:
6485 case GL_DEPTH24_STENCIL8_OES:
6486 if (!context->supportsDepthTextures())
6487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006488 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006489 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006490 if (target != GL_TEXTURE_2D)
6491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006492 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006493 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006494 // ANGLE_depth_texture only supports 1-level textures
6495 if (levels != 1)
6496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00006498 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006499 break;
6500 default:
6501 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00006502 }
6503
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006504 if (target == GL_TEXTURE_2D)
6505 {
6506 gl::Texture2D *texture = context->getTexture2D();
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, height);
6519 }
6520 else if (target == GL_TEXTURE_CUBE_MAP)
6521 {
6522 gl::TextureCubeMap *texture = context->getTextureCubeMap();
6523
6524 if (!texture || texture->id() == 0)
6525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006526 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006527 }
6528
6529 if (texture->isImmutable())
6530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006531 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006532 }
6533
6534 texture->storage(levels, internalformat, width);
6535 }
6536 else UNREACHABLE();
6537 }
6538 }
6539 catch(std::bad_alloc&)
6540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006541 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006542 }
6543}
6544
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006545void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
6546 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006548 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006549 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006550 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006551 target, level, xoffset, yoffset, width, height, format, type, pixels);
6552
6553 try
6554 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00006555 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006557 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006558 }
6559
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006560 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006562 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006563 }
6564
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006565 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
6566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006567 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006568 }
6569
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006570 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006571 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00006572 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006573 }
6574
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006575 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006576
6577 if (context)
6578 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006579 if (level > context->getMaximumTextureLevel())
6580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00006582 }
6583
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006584 if (format == GL_FLOAT)
6585 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006586 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006588 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006589 }
6590 }
6591 else if (format == GL_HALF_FLOAT_OES)
6592 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00006593 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006595 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006596 }
6597 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006598 else if (gl::IsDepthTexture(format))
6599 {
6600 if (!context->supportsDepthTextures())
6601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006602 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006603 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006604 if (target != GL_TEXTURE_2D)
6605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006606 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00006607 }
6608 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006609 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00006610 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00006611
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00006612 if (width == 0 || height == 0 || pixels == NULL)
6613 {
6614 return;
6615 }
6616
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006617 if (target == GL_TEXTURE_2D)
6618 {
6619 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006620 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006621 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006622 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006623 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006624 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00006625 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006626 {
6627 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00006628 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006629 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00006630 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006631 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00006632 }
6633 else
6634 {
6635 UNREACHABLE();
6636 }
6637 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006638 }
6639 catch(std::bad_alloc&)
6640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006641 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006642 }
6643}
6644
6645void __stdcall glUniform1f(GLint location, GLfloat x)
6646{
6647 glUniform1fv(location, 1, &x);
6648}
6649
6650void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
6651{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006652 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006653
6654 try
6655 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006656 if (count < 0)
6657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006658 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006659 }
6660
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006661 if (location == -1)
6662 {
6663 return;
6664 }
6665
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006667
6668 if (context)
6669 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006670 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006671 if (!programBinary)
6672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006673 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006674 }
6675
6676 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006678 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006679 }
6680 }
6681 }
6682 catch(std::bad_alloc&)
6683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006684 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006685 }
6686}
6687
6688void __stdcall glUniform1i(GLint location, GLint x)
6689{
6690 glUniform1iv(location, 1, &x);
6691}
6692
6693void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6694{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006695 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006696
6697 try
6698 {
6699 if (count < 0)
6700 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006701 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006702 }
6703
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006704 if (location == -1)
6705 {
6706 return;
6707 }
6708
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006709 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006710
6711 if (context)
6712 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006713 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006714 if (!programBinary)
6715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006716 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006717 }
6718
6719 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006721 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006722 }
6723 }
6724 }
6725 catch(std::bad_alloc&)
6726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006727 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006728 }
6729}
6730
6731void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6732{
6733 GLfloat xy[2] = {x, y};
6734
6735 glUniform2fv(location, 1, (GLfloat*)&xy);
6736}
6737
6738void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6739{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006740 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006741
6742 try
6743 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744 if (count < 0)
6745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006747 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006748
6749 if (location == -1)
6750 {
6751 return;
6752 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006755
6756 if (context)
6757 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006758 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006759 if (!programBinary)
6760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006761 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006762 }
6763
6764 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006767 }
6768 }
6769 }
6770 catch(std::bad_alloc&)
6771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006773 }
6774}
6775
6776void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6777{
6778 GLint xy[4] = {x, y};
6779
6780 glUniform2iv(location, 1, (GLint*)&xy);
6781}
6782
6783void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006785 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006786
6787 try
6788 {
6789 if (count < 0)
6790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006792 }
6793
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006794 if (location == -1)
6795 {
6796 return;
6797 }
6798
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006800
6801 if (context)
6802 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006803 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006804 if (!programBinary)
6805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006806 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006807 }
6808
6809 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006811 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006812 }
6813 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006814 }
6815 catch(std::bad_alloc&)
6816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006818 }
6819}
6820
6821void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6822{
6823 GLfloat xyz[3] = {x, y, z};
6824
6825 glUniform3fv(location, 1, (GLfloat*)&xyz);
6826}
6827
6828void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006830 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831
6832 try
6833 {
6834 if (count < 0)
6835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006836 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006837 }
6838
6839 if (location == -1)
6840 {
6841 return;
6842 }
6843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006845
6846 if (context)
6847 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006848 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006849 if (!programBinary)
6850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006851 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006852 }
6853
6854 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006857 }
6858 }
6859 }
6860 catch(std::bad_alloc&)
6861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006863 }
6864}
6865
6866void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6867{
6868 GLint xyz[3] = {x, y, z};
6869
6870 glUniform3iv(location, 1, (GLint*)&xyz);
6871}
6872
6873void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006875 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006876
6877 try
6878 {
6879 if (count < 0)
6880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006882 }
6883
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006884 if (location == -1)
6885 {
6886 return;
6887 }
6888
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006890
6891 if (context)
6892 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006893 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006894 if (!programBinary)
6895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006896 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006897 }
6898
6899 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006901 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006902 }
6903 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006904 }
6905 catch(std::bad_alloc&)
6906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006907 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006908 }
6909}
6910
6911void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6912{
6913 GLfloat xyzw[4] = {x, y, z, w};
6914
6915 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6916}
6917
6918void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006920 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006921
6922 try
6923 {
6924 if (count < 0)
6925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006927 }
6928
6929 if (location == -1)
6930 {
6931 return;
6932 }
6933
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006934 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006935
6936 if (context)
6937 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006938 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006939 if (!programBinary)
6940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006941 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006942 }
6943
6944 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006946 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006947 }
6948 }
6949 }
6950 catch(std::bad_alloc&)
6951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006953 }
6954}
6955
6956void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6957{
6958 GLint xyzw[4] = {x, y, z, w};
6959
6960 glUniform4iv(location, 1, (GLint*)&xyzw);
6961}
6962
6963void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6964{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006965 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006966
6967 try
6968 {
6969 if (count < 0)
6970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006971 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006972 }
6973
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006974 if (location == -1)
6975 {
6976 return;
6977 }
6978
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006979 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006980
6981 if (context)
6982 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006983 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006984 if (!programBinary)
6985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006986 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006987 }
6988
6989 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006991 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006992 }
6993 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006994 }
6995 catch(std::bad_alloc&)
6996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006997 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006998 }
6999}
7000
7001void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7002{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007003 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007004 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007005
7006 try
7007 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007008 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007011 }
7012
7013 if (location == -1)
7014 {
7015 return;
7016 }
7017
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007018 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007019
7020 if (context)
7021 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007022 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7023 {
7024 return gl::error(GL_INVALID_VALUE);
7025 }
7026
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007027 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007028 if (!programBinary)
7029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007030 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007031 }
7032
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007033 if (!programBinary->setUniformMatrix2fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007035 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007036 }
7037 }
7038 }
7039 catch(std::bad_alloc&)
7040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007041 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007042 }
7043}
7044
7045void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7046{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007047 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007048 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007049
7050 try
7051 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007052 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007054 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007055 }
7056
7057 if (location == -1)
7058 {
7059 return;
7060 }
7061
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007062 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007063
7064 if (context)
7065 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007066 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7067 {
7068 return gl::error(GL_INVALID_VALUE);
7069 }
7070
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007071 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007072 if (!programBinary)
7073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007074 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007075 }
7076
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007077 if (!programBinary->setUniformMatrix3fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007079 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007080 }
7081 }
7082 }
7083 catch(std::bad_alloc&)
7084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007085 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007086 }
7087}
7088
7089void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
7090{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007091 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007092 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007093
7094 try
7095 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007096 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007098 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007099 }
7100
7101 if (location == -1)
7102 {
7103 return;
7104 }
7105
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007106 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007107
7108 if (context)
7109 {
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007110 if (transpose != GL_FALSE && context->getClientVersion() < 3)
7111 {
7112 return gl::error(GL_INVALID_VALUE);
7113 }
7114
daniel@transgaming.com62a28462012-07-24 18:33:59 +00007115 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007116 if (!programBinary)
7117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007118 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00007119 }
7120
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00007121 if (!programBinary->setUniformMatrix4fv(location, count, transpose, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007124 }
7125 }
7126 }
7127 catch(std::bad_alloc&)
7128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007129 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007130 }
7131}
7132
7133void __stdcall glUseProgram(GLuint program)
7134{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007135 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007136
7137 try
7138 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007139 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007140
7141 if (context)
7142 {
7143 gl::Program *programObject = context->getProgram(program);
7144
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007145 if (!programObject && program != 0)
7146 {
7147 if (context->getShader(program))
7148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007149 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007150 }
7151 else
7152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007153 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00007154 }
7155 }
7156
daniel@transgaming.com716056c2012-07-24 18:38:59 +00007157 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007159 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007160 }
7161
7162 context->useProgram(program);
7163 }
7164 }
7165 catch(std::bad_alloc&)
7166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007167 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007168 }
7169}
7170
7171void __stdcall glValidateProgram(GLuint program)
7172{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007173 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007174
7175 try
7176 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007178
7179 if (context)
7180 {
7181 gl::Program *programObject = context->getProgram(program);
7182
7183 if (!programObject)
7184 {
7185 if (context->getShader(program))
7186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007187 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007188 }
7189 else
7190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007191 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007192 }
7193 }
7194
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00007195 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00007196 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007197 }
7198 catch(std::bad_alloc&)
7199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007200 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007201 }
7202}
7203
7204void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
7205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007206 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007207
7208 try
7209 {
7210 if (index >= gl::MAX_VERTEX_ATTRIBS)
7211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007212 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007213 }
7214
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007216
7217 if (context)
7218 {
7219 GLfloat vals[4] = { x, 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007220 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007221 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007222 }
7223 catch(std::bad_alloc&)
7224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007225 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007226 }
7227}
7228
7229void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
7230{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007231 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007232
7233 try
7234 {
7235 if (index >= gl::MAX_VERTEX_ATTRIBS)
7236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007237 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007238 }
7239
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007240 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007241
7242 if (context)
7243 {
7244 GLfloat vals[4] = { values[0], 0, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007245 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007246 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007247 }
7248 catch(std::bad_alloc&)
7249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007250 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007251 }
7252}
7253
7254void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
7255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007256 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007257
7258 try
7259 {
7260 if (index >= gl::MAX_VERTEX_ATTRIBS)
7261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007262 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007263 }
7264
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007266
7267 if (context)
7268 {
7269 GLfloat vals[4] = { x, y, 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007270 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007271 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007272 }
7273 catch(std::bad_alloc&)
7274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007275 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007276 }
7277}
7278
7279void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
7280{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007281 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007282
7283 try
7284 {
7285 if (index >= gl::MAX_VERTEX_ATTRIBS)
7286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007287 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007288 }
7289
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007290 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007291
7292 if (context)
7293 {
7294 GLfloat vals[4] = { values[0], values[1], 0, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007295 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007296 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007297 }
7298 catch(std::bad_alloc&)
7299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007300 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007301 }
7302}
7303
7304void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
7305{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007306 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 +00007307
7308 try
7309 {
7310 if (index >= gl::MAX_VERTEX_ATTRIBS)
7311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007312 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007313 }
7314
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007315 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007316
7317 if (context)
7318 {
7319 GLfloat vals[4] = { x, y, z, 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007320 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007321 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007322 }
7323 catch(std::bad_alloc&)
7324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007325 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007326 }
7327}
7328
7329void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
7330{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007331 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007332
7333 try
7334 {
7335 if (index >= gl::MAX_VERTEX_ATTRIBS)
7336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007337 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007338 }
7339
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007340 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007341
7342 if (context)
7343 {
7344 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007345 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007346 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007347 }
7348 catch(std::bad_alloc&)
7349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007350 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007351 }
7352}
7353
7354void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7355{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007356 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 +00007357
7358 try
7359 {
7360 if (index >= gl::MAX_VERTEX_ATTRIBS)
7361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007362 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007363 }
7364
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007366
7367 if (context)
7368 {
7369 GLfloat vals[4] = { x, y, z, w };
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007370 context->setVertexAttribf(index, vals);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007371 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007372 }
7373 catch(std::bad_alloc&)
7374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007375 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007376 }
7377}
7378
7379void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
7380{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007381 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007382
7383 try
7384 {
7385 if (index >= gl::MAX_VERTEX_ATTRIBS)
7386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007387 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007388 }
7389
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007390 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007391
7392 if (context)
7393 {
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007394 context->setVertexAttribf(index, values);
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00007395 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007396 }
7397 catch(std::bad_alloc&)
7398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007399 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007400 }
7401}
7402
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007403void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
7404{
7405 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
7406
7407 try
7408 {
7409 if (index >= gl::MAX_VERTEX_ATTRIBS)
7410 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007411 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007412 }
7413
7414 gl::Context *context = gl::getNonLostContext();
7415
7416 if (context)
7417 {
7418 context->setVertexAttribDivisor(index, divisor);
7419 }
7420 }
7421 catch(std::bad_alloc&)
7422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00007424 }
7425}
7426
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00007427void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007429 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007430 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00007431 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007432
7433 try
7434 {
7435 if (index >= gl::MAX_VERTEX_ATTRIBS)
7436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007437 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007438 }
7439
7440 if (size < 1 || size > 4)
7441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007443 }
7444
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007445 gl::Context *context = gl::getNonLostContext();
7446
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007447 switch (type)
7448 {
7449 case GL_BYTE:
7450 case GL_UNSIGNED_BYTE:
7451 case GL_SHORT:
7452 case GL_UNSIGNED_SHORT:
7453 case GL_FIXED:
7454 case GL_FLOAT:
7455 break;
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007456 case GL_HALF_FLOAT:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00007457 case GL_INT:
7458 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007459 case GL_INT_2_10_10_10_REV:
7460 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.com1a4e09a2013-04-13 03:33:30 +00007461 if (context && context->getClientVersion() < 3)
7462 {
7463 return gl::error(GL_INVALID_ENUM);
7464 }
7465 else
7466 {
7467 break;
7468 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007469 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007470 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007471 }
7472
7473 if (stride < 0)
7474 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007475 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007476 }
7477
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00007478 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7479 {
7480 return gl::error(GL_INVALID_OPERATION);
7481 }
7482
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007483 if (context)
7484 {
shannon.woods%transgaming.com@gtempaccount.com8de4e6a2013-04-13 03:37:44 +00007485 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
7486 normalized == GL_TRUE, false, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007487 }
7488 }
7489 catch(std::bad_alloc&)
7490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007492 }
7493}
7494
7495void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
7496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00007497 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 +00007498
7499 try
7500 {
7501 if (width < 0 || height < 0)
7502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007504 }
7505
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007506 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007507
7508 if (context)
7509 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00007510 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007511 }
7512 }
7513 catch(std::bad_alloc&)
7514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007515 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007516 }
7517}
7518
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007519// OpenGL ES 3.0 functions
7520
7521void __stdcall glReadBuffer(GLenum mode)
7522{
7523 EVENT("(GLenum mode = 0x%X)", mode);
7524
7525 try
7526 {
7527 gl::Context *context = gl::getNonLostContext();
7528
7529 if (context)
7530 {
7531 if (context->getClientVersion() < 3)
7532 {
7533 return gl::error(GL_INVALID_OPERATION);
7534 }
7535 }
7536
7537 UNIMPLEMENTED();
7538 }
7539 catch(std::bad_alloc&)
7540 {
7541 return gl::error(GL_OUT_OF_MEMORY);
7542 }
7543}
7544
7545void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
7546{
7547 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
7548 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
7549
7550 try
7551 {
7552 gl::Context *context = gl::getNonLostContext();
7553
7554 if (context)
7555 {
7556 if (context->getClientVersion() < 3)
7557 {
7558 return gl::error(GL_INVALID_OPERATION);
7559 }
7560 }
7561
7562 UNIMPLEMENTED();
7563 }
7564 catch(std::bad_alloc&)
7565 {
7566 return gl::error(GL_OUT_OF_MEMORY);
7567 }
7568}
7569
7570void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
7571{
7572 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7573 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
7574 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7575 target, level, internalformat, width, height, depth, border, format, type, pixels);
7576
7577 try
7578 {
7579 gl::Context *context = gl::getNonLostContext();
7580
7581 if (context)
7582 {
7583 if (context->getClientVersion() < 3)
7584 {
7585 return gl::error(GL_INVALID_OPERATION);
7586 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007587
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007588 // validateES3TexImageFormat sets the error code if there is an error
7589 if (!validateES3TexImageFormat(context, target, level, internalformat, false, false,
7590 0, 0, 0, width, height, depth, border, format, type))
7591 {
7592 return;
7593 }
7594
7595 switch(target)
7596 {
7597 case GL_TEXTURE_3D:
7598 {
7599 gl::Texture3D *texture = context->getTexture3D();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007600 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007601 }
7602 break;
7603
7604 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007605 {
7606 gl::Texture2DArray *texture = context->getTexture2DArray();
shannonwoods@chromium.org4ad58e02013-05-30 00:08:11 +00007607 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackAlignment(), pixels);
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007608 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007609 break;
7610
7611 default:
7612 return gl::error(GL_INVALID_ENUM);
7613 }
7614 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007615 }
7616 catch(std::bad_alloc&)
7617 {
7618 return gl::error(GL_OUT_OF_MEMORY);
7619 }
7620}
7621
7622void __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)
7623{
7624 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7625 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7626 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
7627 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
7628
7629 try
7630 {
7631 gl::Context *context = gl::getNonLostContext();
7632
7633 if (context)
7634 {
7635 if (context->getClientVersion() < 3)
7636 {
7637 return gl::error(GL_INVALID_OPERATION);
7638 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007639
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007640 if (!pixels)
7641 {
7642 return gl::error(GL_INVALID_VALUE);
7643 }
7644
7645 // validateES3TexImageFormat sets the error code if there is an error
7646 if (!validateES3TexImageFormat(context, target, level, GL_NONE, false, true,
7647 xoffset, yoffset, zoffset, width, height, depth, 0,
7648 format, type))
7649 {
7650 return;
7651 }
7652
7653 switch(target)
7654 {
7655 case GL_TEXTURE_3D:
7656 {
7657 gl::Texture3D *texture = context->getTexture3D();
7658 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7659 }
7660 break;
7661
7662 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007663 {
7664 gl::Texture2DArray *texture = context->getTexture2DArray();
7665 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackAlignment(), pixels);
7666 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007667 break;
7668
7669 default:
7670 return gl::error(GL_INVALID_ENUM);
7671 }
7672 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007673 }
7674 catch(std::bad_alloc&)
7675 {
7676 return gl::error(GL_OUT_OF_MEMORY);
7677 }
7678}
7679
7680void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
7681{
7682 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7683 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
7684 target, level, xoffset, yoffset, zoffset, x, y, width, height);
7685
7686 try
7687 {
7688 gl::Context *context = gl::getNonLostContext();
7689
7690 if (context)
7691 {
7692 if (context->getClientVersion() < 3)
7693 {
7694 return gl::error(GL_INVALID_OPERATION);
7695 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007696
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007697 if (!validateCopyTexImageParameters(context, target, false, level, xoffset, yoffset, zoffset,
7698 x, y, width, height))
7699 {
7700 return;
7701 }
7702
7703 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
7704 gl::Texture *texture = NULL;
7705 switch (target)
7706 {
7707 case GL_TEXTURE_3D:
7708 texture = context->getTexture3D();
7709 break;
7710
7711 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007712 texture = context->getTexture2DArray();
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007713 break;
7714
7715 default:
7716 return gl::error(GL_INVALID_ENUM);
7717 }
7718
7719 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
7720 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007721 }
7722 catch(std::bad_alloc&)
7723 {
7724 return gl::error(GL_OUT_OF_MEMORY);
7725 }
7726}
7727
7728void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
7729{
7730 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
7731 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
7732 "const GLvoid* data = 0x%0.8p)",
7733 target, level, internalformat, width, height, depth, border, imageSize, data);
7734
7735 try
7736 {
7737 gl::Context *context = gl::getNonLostContext();
7738
7739 if (context)
7740 {
7741 if (context->getClientVersion() < 3)
7742 {
7743 return gl::error(GL_INVALID_OPERATION);
7744 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007745
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007746 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, internalformat))
7747 {
7748 return gl::error(GL_INVALID_VALUE);
7749 }
7750
7751 // validateES3TexImageFormat sets the error code if there is an error
7752 if (!validateES3TexImageFormat(context, target, level, internalformat, true, false,
7753 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE))
7754 {
7755 return;
7756 }
7757
7758 switch(target)
7759 {
7760 case GL_TEXTURE_3D:
7761 {
7762 gl::Texture3D *texture = context->getTexture3D();
7763 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7764 }
7765 break;
7766
7767 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007768 {
7769 gl::Texture2DArray *texture = context->getTexture2DArray();
7770 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
7771 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007772 break;
7773
7774 default:
7775 return gl::error(GL_INVALID_ENUM);
7776 }
7777 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007778 }
7779 catch(std::bad_alloc&)
7780 {
7781 return gl::error(GL_OUT_OF_MEMORY);
7782 }
7783}
7784
7785void __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)
7786{
7787 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
7788 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
7789 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
7790 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
7791
7792 try
7793 {
7794 gl::Context *context = gl::getNonLostContext();
7795
7796 if (context)
7797 {
7798 if (context->getClientVersion() < 3)
7799 {
7800 return gl::error(GL_INVALID_OPERATION);
7801 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007802
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007803 if (imageSize < 0 || imageSize != gl::ComputeCompressedSize(width, height, format))
7804 {
7805 return gl::error(GL_INVALID_VALUE);
7806 }
7807
7808 if (!data)
7809 {
7810 return gl::error(GL_INVALID_VALUE);
7811 }
7812
7813 // validateES3TexImageFormat sets the error code if there is an error
7814 if (!validateES3TexImageFormat(context, target, level, GL_NONE, true, true,
7815 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE))
7816 {
7817 return;
7818 }
7819
7820 switch(target)
7821 {
7822 case GL_TEXTURE_3D:
7823 {
7824 gl::Texture3D *texture = context->getTexture3D();
7825 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7826 format, imageSize, data);
7827 }
7828 break;
7829
7830 case GL_TEXTURE_2D_ARRAY:
shannon.woods%transgaming.com@gtempaccount.com14e8f592013-04-13 03:46:21 +00007831 {
7832 gl::Texture2DArray *texture = context->getTexture2DArray();
7833 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
7834 format, imageSize, data);
7835 }
shannon.woods%transgaming.com@gtempaccount.com875994b2013-04-13 03:45:17 +00007836 break;
7837
7838 default:
7839 return gl::error(GL_INVALID_ENUM);
7840 }
7841 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00007842 }
7843 catch(std::bad_alloc&)
7844 {
7845 return gl::error(GL_OUT_OF_MEMORY);
7846 }
7847}
7848
7849void __stdcall glGenQueries(GLsizei n, GLuint* ids)
7850{
7851 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7852
7853 try
7854 {
7855 gl::Context *context = gl::getNonLostContext();
7856
7857 if (context)
7858 {
7859 if (context->getClientVersion() < 3)
7860 {
7861 return gl::error(GL_INVALID_OPERATION);
7862 }
7863 }
7864
7865 UNIMPLEMENTED();
7866 }
7867 catch(std::bad_alloc&)
7868 {
7869 return gl::error(GL_OUT_OF_MEMORY);
7870 }
7871}
7872
7873void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
7874{
7875 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
7876
7877 try
7878 {
7879 gl::Context *context = gl::getNonLostContext();
7880
7881 if (context)
7882 {
7883 if (context->getClientVersion() < 3)
7884 {
7885 return gl::error(GL_INVALID_OPERATION);
7886 }
7887 }
7888
7889 UNIMPLEMENTED();
7890 }
7891 catch(std::bad_alloc&)
7892 {
7893 return gl::error(GL_OUT_OF_MEMORY);
7894 }
7895}
7896
7897GLboolean __stdcall glIsQuery(GLuint id)
7898{
7899 EVENT("(GLuint id = %u)", id);
7900
7901 try
7902 {
7903 gl::Context *context = gl::getNonLostContext();
7904
7905 if (context)
7906 {
7907 if (context->getClientVersion() < 3)
7908 {
7909 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7910 }
7911 }
7912
7913 UNIMPLEMENTED();
7914 }
7915 catch(std::bad_alloc&)
7916 {
7917 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7918 }
7919
7920 return GL_FALSE;
7921}
7922
7923void __stdcall glBeginQuery(GLenum target, GLuint id)
7924{
7925 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
7926
7927 try
7928 {
7929 gl::Context *context = gl::getNonLostContext();
7930
7931 if (context)
7932 {
7933 if (context->getClientVersion() < 3)
7934 {
7935 return gl::error(GL_INVALID_OPERATION);
7936 }
7937 }
7938
7939 UNIMPLEMENTED();
7940 }
7941 catch(std::bad_alloc&)
7942 {
7943 return gl::error(GL_OUT_OF_MEMORY);
7944 }
7945}
7946
7947void __stdcall glEndQuery(GLenum target)
7948{
7949 EVENT("(GLenum target = 0x%X)", target);
7950
7951 try
7952 {
7953 gl::Context *context = gl::getNonLostContext();
7954
7955 if (context)
7956 {
7957 if (context->getClientVersion() < 3)
7958 {
7959 return gl::error(GL_INVALID_OPERATION);
7960 }
7961 }
7962
7963 UNIMPLEMENTED();
7964 }
7965 catch(std::bad_alloc&)
7966 {
7967 return gl::error(GL_OUT_OF_MEMORY);
7968 }
7969}
7970
7971void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
7972{
7973 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
7974
7975 try
7976 {
7977 gl::Context *context = gl::getNonLostContext();
7978
7979 if (context)
7980 {
7981 if (context->getClientVersion() < 3)
7982 {
7983 return gl::error(GL_INVALID_OPERATION);
7984 }
7985 }
7986
7987 UNIMPLEMENTED();
7988 }
7989 catch(std::bad_alloc&)
7990 {
7991 return gl::error(GL_OUT_OF_MEMORY);
7992 }
7993}
7994
7995void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
7996{
7997 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
7998
7999 try
8000 {
8001 gl::Context *context = gl::getNonLostContext();
8002
8003 if (context)
8004 {
8005 if (context->getClientVersion() < 3)
8006 {
8007 return gl::error(GL_INVALID_OPERATION);
8008 }
8009 }
8010
8011 UNIMPLEMENTED();
8012 }
8013 catch(std::bad_alloc&)
8014 {
8015 return gl::error(GL_OUT_OF_MEMORY);
8016 }
8017}
8018
8019GLboolean __stdcall glUnmapBuffer(GLenum target)
8020{
8021 EVENT("(GLenum target = 0x%X)", target);
8022
8023 try
8024 {
8025 gl::Context *context = gl::getNonLostContext();
8026
8027 if (context)
8028 {
8029 if (context->getClientVersion() < 3)
8030 {
8031 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8032 }
8033 }
8034
8035 UNIMPLEMENTED();
8036 }
8037 catch(std::bad_alloc&)
8038 {
8039 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8040 }
8041
8042 return GL_FALSE;
8043}
8044
8045void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
8046{
8047 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
8048
8049 try
8050 {
8051 gl::Context *context = gl::getNonLostContext();
8052
8053 if (context)
8054 {
8055 if (context->getClientVersion() < 3)
8056 {
8057 return gl::error(GL_INVALID_OPERATION);
8058 }
8059 }
8060
8061 UNIMPLEMENTED();
8062 }
8063 catch(std::bad_alloc&)
8064 {
8065 return gl::error(GL_OUT_OF_MEMORY);
8066 }
8067}
8068
8069void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
8070{
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008071 try
8072 {
8073 gl::Context *context = gl::getNonLostContext();
8074
8075 if (context)
8076 {
8077 if (context->getClientVersion() < 3)
8078 {
8079 return gl::error(GL_INVALID_OPERATION);
8080 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008081
shannon.woods%transgaming.com@gtempaccount.com7948c5f2013-04-13 03:38:58 +00008082 glDrawBuffersEXT(n, bufs);
8083 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008084 }
8085 catch(std::bad_alloc&)
8086 {
8087 return gl::error(GL_OUT_OF_MEMORY);
8088 }
8089}
8090
8091void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8092{
8093 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8094 location, count, transpose, value);
8095
8096 try
8097 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008098 if (count < 0)
8099 {
8100 return gl::error(GL_INVALID_VALUE);
8101 }
8102
8103 if (location == -1)
8104 {
8105 return;
8106 }
8107
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008108 gl::Context *context = gl::getNonLostContext();
8109
8110 if (context)
8111 {
8112 if (context->getClientVersion() < 3)
8113 {
8114 return gl::error(GL_INVALID_OPERATION);
8115 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008116
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008117 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8118 if (!programBinary)
8119 {
8120 return gl::error(GL_INVALID_OPERATION);
8121 }
8122
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008123 if (!programBinary->setUniformMatrix2x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008124 {
8125 return gl::error(GL_INVALID_OPERATION);
8126 }
8127 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008128 }
8129 catch(std::bad_alloc&)
8130 {
8131 return gl::error(GL_OUT_OF_MEMORY);
8132 }
8133}
8134
8135void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8136{
8137 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8138 location, count, transpose, value);
8139
8140 try
8141 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008142 if (count < 0)
8143 {
8144 return gl::error(GL_INVALID_VALUE);
8145 }
8146
8147 if (location == -1)
8148 {
8149 return;
8150 }
8151
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008152 gl::Context *context = gl::getNonLostContext();
8153
8154 if (context)
8155 {
8156 if (context->getClientVersion() < 3)
8157 {
8158 return gl::error(GL_INVALID_OPERATION);
8159 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008160
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008161 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8162 if (!programBinary)
8163 {
8164 return gl::error(GL_INVALID_OPERATION);
8165 }
8166
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008167 if (!programBinary->setUniformMatrix3x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008168 {
8169 return gl::error(GL_INVALID_OPERATION);
8170 }
8171 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008172 }
8173 catch(std::bad_alloc&)
8174 {
8175 return gl::error(GL_OUT_OF_MEMORY);
8176 }
8177}
8178
8179void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8180{
8181 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8182 location, count, transpose, value);
8183
8184 try
8185 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008186 if (count < 0)
8187 {
8188 return gl::error(GL_INVALID_VALUE);
8189 }
8190
8191 if (location == -1)
8192 {
8193 return;
8194 }
8195
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008196 gl::Context *context = gl::getNonLostContext();
8197
8198 if (context)
8199 {
8200 if (context->getClientVersion() < 3)
8201 {
8202 return gl::error(GL_INVALID_OPERATION);
8203 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008204
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008205 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8206 if (!programBinary)
8207 {
8208 return gl::error(GL_INVALID_OPERATION);
8209 }
8210
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008211 if (!programBinary->setUniformMatrix2x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008212 {
8213 return gl::error(GL_INVALID_OPERATION);
8214 }
8215 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008216 }
8217 catch(std::bad_alloc&)
8218 {
8219 return gl::error(GL_OUT_OF_MEMORY);
8220 }
8221}
8222
8223void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8224{
8225 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8226 location, count, transpose, value);
8227
8228 try
8229 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008230 if (count < 0)
8231 {
8232 return gl::error(GL_INVALID_VALUE);
8233 }
8234
8235 if (location == -1)
8236 {
8237 return;
8238 }
8239
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008240 gl::Context *context = gl::getNonLostContext();
8241
8242 if (context)
8243 {
8244 if (context->getClientVersion() < 3)
8245 {
8246 return gl::error(GL_INVALID_OPERATION);
8247 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008248
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008249 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8250 if (!programBinary)
8251 {
8252 return gl::error(GL_INVALID_OPERATION);
8253 }
8254
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008255 if (!programBinary->setUniformMatrix4x2fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008256 {
8257 return gl::error(GL_INVALID_OPERATION);
8258 }
8259 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008260 }
8261 catch(std::bad_alloc&)
8262 {
8263 return gl::error(GL_OUT_OF_MEMORY);
8264 }
8265}
8266
8267void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8268{
8269 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8270 location, count, transpose, value);
8271
8272 try
8273 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008274 if (count < 0)
8275 {
8276 return gl::error(GL_INVALID_VALUE);
8277 }
8278
8279 if (location == -1)
8280 {
8281 return;
8282 }
8283
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008284 gl::Context *context = gl::getNonLostContext();
8285
8286 if (context)
8287 {
8288 if (context->getClientVersion() < 3)
8289 {
8290 return gl::error(GL_INVALID_OPERATION);
8291 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008292
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008293 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8294 if (!programBinary)
8295 {
8296 return gl::error(GL_INVALID_OPERATION);
8297 }
8298
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008299 if (!programBinary->setUniformMatrix3x4fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008300 {
8301 return gl::error(GL_INVALID_OPERATION);
8302 }
8303 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008304 }
8305 catch(std::bad_alloc&)
8306 {
8307 return gl::error(GL_OUT_OF_MEMORY);
8308 }
8309}
8310
8311void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
8312{
8313 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
8314 location, count, transpose, value);
8315
8316 try
8317 {
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008318 if (count < 0)
8319 {
8320 return gl::error(GL_INVALID_VALUE);
8321 }
8322
8323 if (location == -1)
8324 {
8325 return;
8326 }
8327
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008328 gl::Context *context = gl::getNonLostContext();
8329
8330 if (context)
8331 {
8332 if (context->getClientVersion() < 3)
8333 {
8334 return gl::error(GL_INVALID_OPERATION);
8335 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008336
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008337 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
8338 if (!programBinary)
8339 {
8340 return gl::error(GL_INVALID_OPERATION);
8341 }
8342
shannon.woods%transgaming.com@gtempaccount.coma741b642013-04-13 03:40:10 +00008343 if (!programBinary->setUniformMatrix4x3fv(location, count, transpose, value))
shannon.woods%transgaming.com@gtempaccount.comf1306162013-04-13 03:40:04 +00008344 {
8345 return gl::error(GL_INVALID_OPERATION);
8346 }
8347 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008348 }
8349 catch(std::bad_alloc&)
8350 {
8351 return gl::error(GL_OUT_OF_MEMORY);
8352 }
8353}
8354
8355void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
8356{
8357 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
8358 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
8359 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
8360
8361 try
8362 {
8363 gl::Context *context = gl::getNonLostContext();
8364
8365 if (context)
8366 {
8367 if (context->getClientVersion() < 3)
8368 {
8369 return gl::error(GL_INVALID_OPERATION);
8370 }
8371 }
8372
8373 UNIMPLEMENTED();
8374 }
8375 catch(std::bad_alloc&)
8376 {
8377 return gl::error(GL_OUT_OF_MEMORY);
8378 }
8379}
8380
8381void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
8382{
8383 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
8384 target, samples, internalformat, width, height);
8385
8386 try
8387 {
8388 gl::Context *context = gl::getNonLostContext();
8389
8390 if (context)
8391 {
8392 if (context->getClientVersion() < 3)
8393 {
8394 return gl::error(GL_INVALID_OPERATION);
8395 }
8396 }
8397
8398 UNIMPLEMENTED();
8399 }
8400 catch(std::bad_alloc&)
8401 {
8402 return gl::error(GL_OUT_OF_MEMORY);
8403 }
8404}
8405
8406void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
8407{
8408 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
8409 target, attachment, texture, level, layer);
8410
8411 try
8412 {
8413 gl::Context *context = gl::getNonLostContext();
8414
8415 if (context)
8416 {
8417 if (context->getClientVersion() < 3)
8418 {
8419 return gl::error(GL_INVALID_OPERATION);
8420 }
8421 }
8422
8423 UNIMPLEMENTED();
8424 }
8425 catch(std::bad_alloc&)
8426 {
8427 return gl::error(GL_OUT_OF_MEMORY);
8428 }
8429}
8430
8431GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
8432{
8433 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
8434 target, offset, length, access);
8435
8436 try
8437 {
8438 gl::Context *context = gl::getNonLostContext();
8439
8440 if (context)
8441 {
8442 if (context->getClientVersion() < 3)
8443 {
8444 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
8445 }
8446 }
8447
8448 UNIMPLEMENTED();
8449 }
8450 catch(std::bad_alloc&)
8451 {
8452 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
8453 }
8454
8455 return NULL;
8456}
8457
8458void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
8459{
8460 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
8461
8462 try
8463 {
8464 gl::Context *context = gl::getNonLostContext();
8465
8466 if (context)
8467 {
8468 if (context->getClientVersion() < 3)
8469 {
8470 return gl::error(GL_INVALID_OPERATION);
8471 }
8472 }
8473
8474 UNIMPLEMENTED();
8475 }
8476 catch(std::bad_alloc&)
8477 {
8478 return gl::error(GL_OUT_OF_MEMORY);
8479 }
8480}
8481
8482void __stdcall glBindVertexArray(GLuint array)
8483{
8484 EVENT("(GLuint array = %u)", array);
8485
8486 try
8487 {
8488 gl::Context *context = gl::getNonLostContext();
8489
8490 if (context)
8491 {
8492 if (context->getClientVersion() < 3)
8493 {
8494 return gl::error(GL_INVALID_OPERATION);
8495 }
8496 }
8497
8498 UNIMPLEMENTED();
8499 }
8500 catch(std::bad_alloc&)
8501 {
8502 return gl::error(GL_OUT_OF_MEMORY);
8503 }
8504}
8505
8506void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
8507{
8508 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
8509
8510 try
8511 {
8512 gl::Context *context = gl::getNonLostContext();
8513
8514 if (context)
8515 {
8516 if (context->getClientVersion() < 3)
8517 {
8518 return gl::error(GL_INVALID_OPERATION);
8519 }
8520 }
8521
8522 UNIMPLEMENTED();
8523 }
8524 catch(std::bad_alloc&)
8525 {
8526 return gl::error(GL_OUT_OF_MEMORY);
8527 }
8528}
8529
8530void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
8531{
8532 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
8533
8534 try
8535 {
8536 gl::Context *context = gl::getNonLostContext();
8537
8538 if (context)
8539 {
8540 if (context->getClientVersion() < 3)
8541 {
8542 return gl::error(GL_INVALID_OPERATION);
8543 }
8544 }
8545
8546 UNIMPLEMENTED();
8547 }
8548 catch(std::bad_alloc&)
8549 {
8550 return gl::error(GL_OUT_OF_MEMORY);
8551 }
8552}
8553
8554GLboolean __stdcall glIsVertexArray(GLuint array)
8555{
8556 EVENT("(GLuint array = %u)", array);
8557
8558 try
8559 {
8560 gl::Context *context = gl::getNonLostContext();
8561
8562 if (context)
8563 {
8564 if (context->getClientVersion() < 3)
8565 {
8566 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8567 }
8568 }
8569
8570 UNIMPLEMENTED();
8571 }
8572 catch(std::bad_alloc&)
8573 {
8574 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8575 }
8576
8577 return GL_FALSE;
8578}
8579
8580void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
8581{
8582 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
8583 target, index, data);
8584
8585 try
8586 {
8587 gl::Context *context = gl::getNonLostContext();
8588
8589 if (context)
8590 {
8591 if (context->getClientVersion() < 3)
8592 {
8593 return gl::error(GL_INVALID_OPERATION);
8594 }
8595 }
8596
8597 UNIMPLEMENTED();
8598 }
8599 catch(std::bad_alloc&)
8600 {
8601 return gl::error(GL_OUT_OF_MEMORY);
8602 }
8603}
8604
8605void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
8606{
8607 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
8608
8609 try
8610 {
8611 gl::Context *context = gl::getNonLostContext();
8612
8613 if (context)
8614 {
8615 if (context->getClientVersion() < 3)
8616 {
8617 return gl::error(GL_INVALID_OPERATION);
8618 }
8619 }
8620
8621 UNIMPLEMENTED();
8622 }
8623 catch(std::bad_alloc&)
8624 {
8625 return gl::error(GL_OUT_OF_MEMORY);
8626 }
8627}
8628
8629void __stdcall glEndTransformFeedback(void)
8630{
8631 EVENT("(void)");
8632
8633 try
8634 {
8635 gl::Context *context = gl::getNonLostContext();
8636
8637 if (context)
8638 {
8639 if (context->getClientVersion() < 3)
8640 {
8641 return gl::error(GL_INVALID_OPERATION);
8642 }
8643 }
8644
8645 UNIMPLEMENTED();
8646 }
8647 catch(std::bad_alloc&)
8648 {
8649 return gl::error(GL_OUT_OF_MEMORY);
8650 }
8651}
8652
8653void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
8654{
8655 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
8656 target, index, buffer, offset, size);
8657
8658 try
8659 {
8660 gl::Context *context = gl::getNonLostContext();
8661
8662 if (context)
8663 {
8664 if (context->getClientVersion() < 3)
8665 {
8666 return gl::error(GL_INVALID_OPERATION);
8667 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008668
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008669 switch (target)
8670 {
8671 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008672 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008673 {
8674 return gl::error(GL_INVALID_VALUE);
8675 }
8676 break;
8677
8678 case GL_UNIFORM_BUFFER:
8679 if (index >= context->getMaximumCombinedUniformBufferBindings())
8680 {
8681 return gl::error(GL_INVALID_VALUE);
8682 }
8683 break;
8684
8685 default:
8686 return gl::error(GL_INVALID_ENUM);
8687 }
8688
shannonwoods@chromium.orge6e00792013-05-30 00:06:07 +00008689 if (buffer != 0 && size <= 0)
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008690 {
8691 return gl::error(GL_INVALID_VALUE);
8692 }
8693
8694 switch (target)
8695 {
8696 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orga26aeaf2013-05-30 00:06:13 +00008697
8698 // size and offset must be a multiple of 4
8699 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
8700 {
8701 return gl::error(GL_INVALID_VALUE);
8702 }
8703
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008704 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
8705 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008706 break;
8707
8708 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org97c3d502013-05-30 00:04:34 +00008709
8710 // it is an error to bind an offset not a multiple of the alignment
8711 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
8712 {
8713 return gl::error(GL_INVALID_VALUE);
8714 }
8715
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008716 context->bindIndexedUniformBuffer(buffer, index, offset, size);
8717 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008718 break;
8719
8720 default:
8721 UNREACHABLE();
8722 }
8723 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008724 }
8725 catch(std::bad_alloc&)
8726 {
8727 return gl::error(GL_OUT_OF_MEMORY);
8728 }
8729}
8730
8731void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
8732{
8733 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
8734 target, index, buffer);
8735
8736 try
8737 {
8738 gl::Context *context = gl::getNonLostContext();
8739
8740 if (context)
8741 {
8742 if (context->getClientVersion() < 3)
8743 {
8744 return gl::error(GL_INVALID_OPERATION);
8745 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008746
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008747 switch (target)
8748 {
8749 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008750 if (index >= context->getMaxTransformFeedbackBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008751 {
8752 return gl::error(GL_INVALID_VALUE);
8753 }
8754 break;
8755
8756 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.orgd11158f2013-05-30 00:06:19 +00008757 if (index >= context->getMaximumCombinedUniformBufferBindings())
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008758 {
8759 return gl::error(GL_INVALID_VALUE);
8760 }
8761 break;
8762
8763 default:
8764 return gl::error(GL_INVALID_ENUM);
8765 }
8766
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008767 switch (target)
8768 {
8769 case GL_TRANSFORM_FEEDBACK_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008770 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008771 context->bindGenericTransformFeedbackBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008772 break;
8773
8774 case GL_UNIFORM_BUFFER:
shannonwoods@chromium.org3eeca1e2013-05-30 00:04:28 +00008775 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
shannon.woods%transgaming.com@gtempaccount.com667a29c2013-04-13 03:39:04 +00008776 context->bindGenericUniformBuffer(buffer);
shannon.woods%transgaming.com@gtempaccount.comd4e61972013-04-13 03:37:04 +00008777 break;
8778
8779 default:
8780 UNREACHABLE();
8781 }
8782 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008783 }
8784 catch(std::bad_alloc&)
8785 {
8786 return gl::error(GL_OUT_OF_MEMORY);
8787 }
8788}
8789
8790void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
8791{
8792 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
8793 program, count, varyings, bufferMode);
8794
8795 try
8796 {
8797 gl::Context *context = gl::getNonLostContext();
8798
8799 if (context)
8800 {
8801 if (context->getClientVersion() < 3)
8802 {
8803 return gl::error(GL_INVALID_OPERATION);
8804 }
8805 }
8806
8807 UNIMPLEMENTED();
8808 }
8809 catch(std::bad_alloc&)
8810 {
8811 return gl::error(GL_OUT_OF_MEMORY);
8812 }
8813}
8814
8815void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
8816{
8817 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
8818 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
8819 program, index, bufSize, length, size, type, name);
8820
8821 try
8822 {
8823 gl::Context *context = gl::getNonLostContext();
8824
8825 if (context)
8826 {
8827 if (context->getClientVersion() < 3)
8828 {
8829 return gl::error(GL_INVALID_OPERATION);
8830 }
8831 }
8832
8833 UNIMPLEMENTED();
8834 }
8835 catch(std::bad_alloc&)
8836 {
8837 return gl::error(GL_OUT_OF_MEMORY);
8838 }
8839}
8840
8841void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
8842{
8843 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
8844 index, size, type, stride, pointer);
8845
8846 try
8847 {
8848 gl::Context *context = gl::getNonLostContext();
8849
8850 if (context)
8851 {
8852 if (context->getClientVersion() < 3)
8853 {
8854 return gl::error(GL_INVALID_OPERATION);
8855 }
8856 }
8857
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008858 if (index >= gl::MAX_VERTEX_ATTRIBS)
8859 {
8860 return gl::error(GL_INVALID_VALUE);
8861 }
8862
8863 if (size < 1 || size > 4)
8864 {
8865 return gl::error(GL_INVALID_VALUE);
8866 }
8867
8868 switch (type)
8869 {
8870 case GL_BYTE:
8871 case GL_UNSIGNED_BYTE:
8872 case GL_SHORT:
8873 case GL_UNSIGNED_SHORT:
8874 case GL_INT:
8875 case GL_UNSIGNED_INT:
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008876 case GL_INT_2_10_10_10_REV:
8877 case GL_UNSIGNED_INT_2_10_10_10_REV:
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008878 break;
8879 default:
8880 return gl::error(GL_INVALID_ENUM);
8881 }
8882
8883 if (stride < 0)
8884 {
8885 return gl::error(GL_INVALID_VALUE);
8886 }
8887
shannon.woods%transgaming.com@gtempaccount.com1ab57be2013-04-13 03:38:39 +00008888 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
8889 {
8890 return gl::error(GL_INVALID_OPERATION);
8891 }
8892
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008893 if (context)
8894 {
8895 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
8896 stride, pointer);
8897 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008898 }
8899 catch(std::bad_alloc&)
8900 {
8901 return gl::error(GL_OUT_OF_MEMORY);
8902 }
8903}
8904
8905void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
8906{
8907 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8908 index, pname, params);
8909
8910 try
8911 {
8912 gl::Context *context = gl::getNonLostContext();
8913
8914 if (context)
8915 {
8916 if (context->getClientVersion() < 3)
8917 {
8918 return gl::error(GL_INVALID_OPERATION);
8919 }
8920 }
8921
8922 UNIMPLEMENTED();
8923 }
8924 catch(std::bad_alloc&)
8925 {
8926 return gl::error(GL_OUT_OF_MEMORY);
8927 }
8928}
8929
8930void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
8931{
8932 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
8933 index, pname, params);
8934
8935 try
8936 {
8937 gl::Context *context = gl::getNonLostContext();
8938
8939 if (context)
8940 {
8941 if (context->getClientVersion() < 3)
8942 {
8943 return gl::error(GL_INVALID_OPERATION);
8944 }
8945 }
8946
8947 UNIMPLEMENTED();
8948 }
8949 catch(std::bad_alloc&)
8950 {
8951 return gl::error(GL_OUT_OF_MEMORY);
8952 }
8953}
8954
8955void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
8956{
8957 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
8958 index, x, y, z, w);
8959
8960 try
8961 {
8962 gl::Context *context = gl::getNonLostContext();
8963
8964 if (context)
8965 {
8966 if (context->getClientVersion() < 3)
8967 {
8968 return gl::error(GL_INVALID_OPERATION);
8969 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008970
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00008971 if (index >= gl::MAX_VERTEX_ATTRIBS)
8972 {
8973 return gl::error(GL_INVALID_VALUE);
8974 }
8975
8976 GLint vals[4] = { x, y, z, w };
8977 context->setVertexAttribi(index, vals);
8978 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00008979 }
8980 catch(std::bad_alloc&)
8981 {
8982 return gl::error(GL_OUT_OF_MEMORY);
8983 }
8984}
8985
8986void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
8987{
8988 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
8989 index, x, y, z, w);
8990
8991 try
8992 {
8993 gl::Context *context = gl::getNonLostContext();
8994
8995 if (context)
8996 {
8997 if (context->getClientVersion() < 3)
8998 {
8999 return gl::error(GL_INVALID_OPERATION);
9000 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009001
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009002 if (index >= gl::MAX_VERTEX_ATTRIBS)
9003 {
9004 return gl::error(GL_INVALID_VALUE);
9005 }
9006
9007 GLuint vals[4] = { x, y, z, w };
9008 context->setVertexAttribu(index, vals);
9009 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009010 }
9011 catch(std::bad_alloc&)
9012 {
9013 return gl::error(GL_OUT_OF_MEMORY);
9014 }
9015}
9016
9017void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
9018{
9019 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
9020
9021 try
9022 {
9023 gl::Context *context = gl::getNonLostContext();
9024
9025 if (context)
9026 {
9027 if (context->getClientVersion() < 3)
9028 {
9029 return gl::error(GL_INVALID_OPERATION);
9030 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009031
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009032 if (index >= gl::MAX_VERTEX_ATTRIBS)
9033 {
9034 return gl::error(GL_INVALID_VALUE);
9035 }
9036
9037 context->setVertexAttribi(index, v);
9038 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009039 }
9040 catch(std::bad_alloc&)
9041 {
9042 return gl::error(GL_OUT_OF_MEMORY);
9043 }
9044}
9045
9046void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
9047{
9048 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
9049
9050 try
9051 {
9052 gl::Context *context = gl::getNonLostContext();
9053
9054 if (context)
9055 {
9056 if (context->getClientVersion() < 3)
9057 {
9058 return gl::error(GL_INVALID_OPERATION);
9059 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009060
shannon.woods%transgaming.com@gtempaccount.coma8885862013-04-13 03:37:53 +00009061 if (index >= gl::MAX_VERTEX_ATTRIBS)
9062 {
9063 return gl::error(GL_INVALID_VALUE);
9064 }
9065
9066 context->setVertexAttribu(index, v);
9067 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009068 }
9069 catch(std::bad_alloc&)
9070 {
9071 return gl::error(GL_OUT_OF_MEMORY);
9072 }
9073}
9074
9075void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
9076{
9077 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
9078 program, location, params);
9079
9080 try
9081 {
9082 gl::Context *context = gl::getNonLostContext();
9083
9084 if (context)
9085 {
9086 if (context->getClientVersion() < 3)
9087 {
9088 return gl::error(GL_INVALID_OPERATION);
9089 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009090
shannon.woods%transgaming.com@gtempaccount.come2290122013-04-13 03:41:07 +00009091 if (program == 0)
9092 {
9093 return gl::error(GL_INVALID_VALUE);
9094 }
9095
9096 gl::Program *programObject = context->getProgram(program);
9097
9098 if (!programObject || !programObject->isLinked())
9099 {
9100 return gl::error(GL_INVALID_OPERATION);
9101 }
9102
9103 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9104 if (!programBinary)
9105 {
9106 return gl::error(GL_INVALID_OPERATION);
9107 }
9108
9109 if (!programBinary->getUniformuiv(location, NULL, params))
9110 {
9111 return gl::error(GL_INVALID_OPERATION);
9112 }
9113 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009114 }
9115 catch(std::bad_alloc&)
9116 {
9117 return gl::error(GL_OUT_OF_MEMORY);
9118 }
9119}
9120
9121GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
9122{
9123 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
9124 program, name);
9125
9126 try
9127 {
9128 gl::Context *context = gl::getNonLostContext();
9129
9130 if (context)
9131 {
9132 if (context->getClientVersion() < 3)
9133 {
9134 return gl::error(GL_INVALID_OPERATION, 0);
9135 }
9136 }
9137
9138 UNIMPLEMENTED();
9139 }
9140 catch(std::bad_alloc&)
9141 {
9142 return gl::error(GL_OUT_OF_MEMORY, 0);
9143 }
9144
9145 return 0;
9146}
9147
9148void __stdcall glUniform1ui(GLint location, GLuint v0)
9149{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009150 glUniform1uiv(location, 1, &v0);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009151}
9152
9153void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
9154{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009155 const GLuint xy[] = { v0, v1 };
9156 glUniform2uiv(location, 1, xy);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009157}
9158
9159void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
9160{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009161 const GLuint xyz[] = { v0, v1, v2 };
9162 glUniform3uiv(location, 1, xyz);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009163}
9164
9165void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
9166{
shannon.woods%transgaming.com@gtempaccount.com8431b9c2013-04-13 03:40:17 +00009167 const GLuint xyzw[] = { v0, v1, v2, v3 };
9168 glUniform4uiv(location, 1, xyzw);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009169}
9170
9171void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
9172{
9173 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9174 location, count, value);
9175
9176 try
9177 {
9178 gl::Context *context = gl::getNonLostContext();
9179
9180 if (context)
9181 {
9182 if (context->getClientVersion() < 3)
9183 {
9184 return gl::error(GL_INVALID_OPERATION);
9185 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009186
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009187 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9188 if (!programBinary)
9189 {
9190 return gl::error(GL_INVALID_OPERATION);
9191 }
9192
9193 if (!programBinary->setUniform1uiv(location, count, value))
9194 {
9195 return gl::error(GL_INVALID_OPERATION);
9196 }
9197 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009198 }
9199 catch(std::bad_alloc&)
9200 {
9201 return gl::error(GL_OUT_OF_MEMORY);
9202 }
9203}
9204
9205void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
9206{
9207 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9208 location, count, value);
9209
9210 try
9211 {
9212 gl::Context *context = gl::getNonLostContext();
9213
9214 if (context)
9215 {
9216 if (context->getClientVersion() < 3)
9217 {
9218 return gl::error(GL_INVALID_OPERATION);
9219 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009220
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009221 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9222 if (!programBinary)
9223 {
9224 return gl::error(GL_INVALID_OPERATION);
9225 }
9226
9227 if (!programBinary->setUniform2uiv(location, count, value))
9228 {
9229 return gl::error(GL_INVALID_OPERATION);
9230 }
9231 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009232 }
9233 catch(std::bad_alloc&)
9234 {
9235 return gl::error(GL_OUT_OF_MEMORY);
9236 }
9237}
9238
9239void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
9240{
9241 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
9242 location, count, value);
9243
9244 try
9245 {
9246 gl::Context *context = gl::getNonLostContext();
9247
9248 if (context)
9249 {
9250 if (context->getClientVersion() < 3)
9251 {
9252 return gl::error(GL_INVALID_OPERATION);
9253 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009254
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009255 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9256 if (!programBinary)
9257 {
9258 return gl::error(GL_INVALID_OPERATION);
9259 }
9260
9261 if (!programBinary->setUniform3uiv(location, count, value))
9262 {
9263 return gl::error(GL_INVALID_OPERATION);
9264 }
9265 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009266 }
9267 catch(std::bad_alloc&)
9268 {
9269 return gl::error(GL_OUT_OF_MEMORY);
9270 }
9271}
9272
9273void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
9274{
9275 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
9276 location, count, value);
9277
9278 try
9279 {
9280 gl::Context *context = gl::getNonLostContext();
9281
9282 if (context)
9283 {
9284 if (context->getClientVersion() < 3)
9285 {
9286 return gl::error(GL_INVALID_OPERATION);
9287 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009288
shannon.woods%transgaming.com@gtempaccount.com50ea4ab2013-04-13 03:40:36 +00009289 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
9290 if (!programBinary)
9291 {
9292 return gl::error(GL_INVALID_OPERATION);
9293 }
9294
9295 if (!programBinary->setUniform4uiv(location, count, value))
9296 {
9297 return gl::error(GL_INVALID_OPERATION);
9298 }
9299 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009300 }
9301 catch(std::bad_alloc&)
9302 {
9303 return gl::error(GL_OUT_OF_MEMORY);
9304 }
9305}
9306
9307void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
9308{
9309 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
9310 buffer, drawbuffer, value);
9311
9312 try
9313 {
9314 gl::Context *context = gl::getNonLostContext();
9315
9316 if (context)
9317 {
9318 if (context->getClientVersion() < 3)
9319 {
9320 return gl::error(GL_INVALID_OPERATION);
9321 }
9322 }
9323
9324 UNIMPLEMENTED();
9325 }
9326 catch(std::bad_alloc&)
9327 {
9328 return gl::error(GL_OUT_OF_MEMORY);
9329 }
9330}
9331
9332void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
9333{
9334 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
9335 buffer, drawbuffer, value);
9336
9337 try
9338 {
9339 gl::Context *context = gl::getNonLostContext();
9340
9341 if (context)
9342 {
9343 if (context->getClientVersion() < 3)
9344 {
9345 return gl::error(GL_INVALID_OPERATION);
9346 }
9347 }
9348
9349 UNIMPLEMENTED();
9350 }
9351 catch(std::bad_alloc&)
9352 {
9353 return gl::error(GL_OUT_OF_MEMORY);
9354 }
9355}
9356
9357void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
9358{
9359 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
9360 buffer, drawbuffer, value);
9361
9362 try
9363 {
9364 gl::Context *context = gl::getNonLostContext();
9365
9366 if (context)
9367 {
9368 if (context->getClientVersion() < 3)
9369 {
9370 return gl::error(GL_INVALID_OPERATION);
9371 }
9372 }
9373
9374 UNIMPLEMENTED();
9375 }
9376 catch(std::bad_alloc&)
9377 {
9378 return gl::error(GL_OUT_OF_MEMORY);
9379 }
9380}
9381
9382void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
9383{
9384 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
9385 buffer, drawbuffer, depth, stencil);
9386
9387 try
9388 {
9389 gl::Context *context = gl::getNonLostContext();
9390
9391 if (context)
9392 {
9393 if (context->getClientVersion() < 3)
9394 {
9395 return gl::error(GL_INVALID_OPERATION);
9396 }
9397 }
9398
9399 UNIMPLEMENTED();
9400 }
9401 catch(std::bad_alloc&)
9402 {
9403 return gl::error(GL_OUT_OF_MEMORY);
9404 }
9405}
9406
9407const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
9408{
9409 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
9410
9411 try
9412 {
9413 gl::Context *context = gl::getNonLostContext();
9414
9415 if (context)
9416 {
9417 if (context->getClientVersion() < 3)
9418 {
9419 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
9420 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009421
shannonwoods@chromium.org302df742013-05-30 00:05:54 +00009422 if (name != GL_EXTENSIONS)
9423 {
9424 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
9425 }
9426
9427 if (index >= context->getNumExtensions())
9428 {
9429 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
9430 }
9431
9432 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
9433 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009434 }
9435 catch(std::bad_alloc&)
9436 {
9437 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
9438 }
9439
9440 return NULL;
9441}
9442
9443void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
9444{
9445 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
9446 readTarget, writeTarget, readOffset, writeOffset, size);
9447
9448 try
9449 {
9450 gl::Context *context = gl::getNonLostContext();
9451
9452 if (context)
9453 {
9454 if (context->getClientVersion() < 3)
9455 {
9456 return gl::error(GL_INVALID_OPERATION);
9457 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009458
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009459 gl::Buffer *readBuffer = NULL;
9460 switch (readTarget)
9461 {
9462 case GL_ARRAY_BUFFER:
9463 readBuffer = context->getArrayBuffer();
9464 break;
9465 case GL_COPY_READ_BUFFER:
9466 readBuffer = context->getCopyReadBuffer();
9467 break;
9468 case GL_COPY_WRITE_BUFFER:
9469 readBuffer = context->getCopyWriteBuffer();
9470 break;
9471 case GL_ELEMENT_ARRAY_BUFFER:
9472 readBuffer = context->getElementArrayBuffer();
9473 break;
9474 case GL_PIXEL_PACK_BUFFER:
9475 readBuffer = context->getPixelPackBuffer();
9476 break;
9477 case GL_PIXEL_UNPACK_BUFFER:
9478 readBuffer = context->getPixelUnpackBuffer();
9479 break;
9480 case GL_TRANSFORM_FEEDBACK_BUFFER:
9481 readBuffer = context->getGenericTransformFeedbackBuffer();
9482 break;
9483 case GL_UNIFORM_BUFFER:
9484 readBuffer = context->getGenericUniformBuffer();
9485 break;
9486 default:
9487 return gl::error(GL_INVALID_ENUM);
9488 }
9489
9490 gl::Buffer *writeBuffer = NULL;
9491 switch (writeTarget)
9492 {
9493 case GL_ARRAY_BUFFER:
9494 writeBuffer = context->getArrayBuffer();
9495 break;
9496 case GL_COPY_READ_BUFFER:
9497 writeBuffer = context->getCopyReadBuffer();
9498 break;
9499 case GL_COPY_WRITE_BUFFER:
9500 writeBuffer = context->getCopyWriteBuffer();
9501 break;
9502 case GL_ELEMENT_ARRAY_BUFFER:
9503 writeBuffer = context->getElementArrayBuffer();
9504 break;
9505 case GL_PIXEL_PACK_BUFFER:
9506 writeBuffer = context->getPixelPackBuffer();
9507 break;
9508 case GL_PIXEL_UNPACK_BUFFER:
9509 writeBuffer = context->getPixelUnpackBuffer();
9510 break;
9511 case GL_TRANSFORM_FEEDBACK_BUFFER:
9512 writeBuffer = context->getGenericTransformFeedbackBuffer();
9513 break;
9514 case GL_UNIFORM_BUFFER:
9515 writeBuffer = context->getGenericUniformBuffer();
9516 break;
9517 default:
9518 return gl::error(GL_INVALID_ENUM);
9519 }
9520
9521 if (!readBuffer || !writeBuffer)
9522 {
9523 return gl::error(GL_INVALID_OPERATION);
9524 }
9525
9526 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
9527 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
9528 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
9529 {
9530 return gl::error(GL_INVALID_VALUE);
9531 }
9532
9533 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
9534 {
9535 return gl::error(GL_INVALID_VALUE);
9536 }
9537
9538 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
9539
shannon.woods%transgaming.com@gtempaccount.comc53376a2013-04-13 03:41:23 +00009540 // if size is zero, the copy is a successful no-op
9541 if (size > 0)
9542 {
9543 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
9544 }
shannon.woods%transgaming.com@gtempaccount.com296c3f22013-04-13 03:39:39 +00009545 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009546 }
9547 catch(std::bad_alloc&)
9548 {
9549 return gl::error(GL_OUT_OF_MEMORY);
9550 }
9551}
9552
9553void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
9554{
9555 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
9556 program, uniformCount, uniformNames, uniformIndices);
9557
9558 try
9559 {
9560 gl::Context *context = gl::getNonLostContext();
9561
9562 if (context)
9563 {
9564 if (context->getClientVersion() < 3)
9565 {
9566 return gl::error(GL_INVALID_OPERATION);
9567 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009568
shannonwoods@chromium.orgc2ed9912013-05-30 00:05:33 +00009569 if (uniformCount < 0)
9570 {
9571 return gl::error(GL_INVALID_VALUE);
9572 }
9573
9574 gl::Program *programObject = context->getProgram(program);
9575
9576 if (!programObject)
9577 {
9578 if (context->getShader(program))
9579 {
9580 return gl::error(GL_INVALID_OPERATION);
9581 }
9582 else
9583 {
9584 return gl::error(GL_INVALID_VALUE);
9585 }
9586 }
9587
9588 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9589 if (!programObject->isLinked() || !programBinary)
9590 {
9591 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9592 {
9593 uniformIndices[uniformId] = GL_INVALID_INDEX;
9594 }
9595 }
9596 else
9597 {
9598 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9599 {
9600 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
9601 }
9602 }
9603 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009604 }
9605 catch(std::bad_alloc&)
9606 {
9607 return gl::error(GL_OUT_OF_MEMORY);
9608 }
9609}
9610
9611void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
9612{
9613 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9614 program, uniformCount, uniformIndices, pname, params);
9615
9616 try
9617 {
9618 gl::Context *context = gl::getNonLostContext();
9619
9620 if (context)
9621 {
9622 if (context->getClientVersion() < 3)
9623 {
9624 return gl::error(GL_INVALID_OPERATION);
9625 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009626
shannonwoods@chromium.org2a9a9d22013-05-30 00:05:40 +00009627 if (uniformCount < 0)
9628 {
9629 return gl::error(GL_INVALID_VALUE);
9630 }
9631
9632 gl::Program *programObject = context->getProgram(program);
9633
9634 if (!programObject)
9635 {
9636 if (context->getShader(program))
9637 {
9638 return gl::error(GL_INVALID_OPERATION);
9639 }
9640 else
9641 {
9642 return gl::error(GL_INVALID_VALUE);
9643 }
9644 }
9645
9646 switch (pname)
9647 {
9648 case GL_UNIFORM_TYPE:
9649 case GL_UNIFORM_SIZE:
9650 case GL_UNIFORM_NAME_LENGTH:
9651 case GL_UNIFORM_BLOCK_INDEX:
9652 case GL_UNIFORM_OFFSET:
9653 case GL_UNIFORM_ARRAY_STRIDE:
9654 case GL_UNIFORM_MATRIX_STRIDE:
9655 case GL_UNIFORM_IS_ROW_MAJOR:
9656 break;
9657 default:
9658 return gl::error(GL_INVALID_ENUM);
9659 }
9660
9661 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9662
9663 if (!programBinary && uniformCount > 0)
9664 {
9665 return gl::error(GL_INVALID_VALUE);
9666 }
9667
9668 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9669 {
9670 const GLuint index = uniformIndices[uniformId];
9671
9672 if (index >= (GLuint)programBinary->getActiveUniformCount())
9673 {
9674 return gl::error(GL_INVALID_VALUE);
9675 }
9676 }
9677
9678 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
9679 {
9680 const GLuint index = uniformIndices[uniformId];
9681 params[uniformId] = programBinary->getActiveUniformi(index, pname);
9682 }
9683 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009684 }
9685 catch(std::bad_alloc&)
9686 {
9687 return gl::error(GL_OUT_OF_MEMORY);
9688 }
9689}
9690
9691GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
9692{
9693 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
9694
9695 try
9696 {
9697 gl::Context *context = gl::getNonLostContext();
9698
9699 if (context)
9700 {
9701 if (context->getClientVersion() < 3)
9702 {
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009703 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009704 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009705
shannonwoods@chromium.org42766252013-05-30 00:07:12 +00009706 gl::Program *programObject = context->getProgram(program);
9707
9708 if (!programObject)
9709 {
9710 if (context->getShader(program))
9711 {
9712 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
9713 }
9714 else
9715 {
9716 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
9717 }
9718 }
9719
9720 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9721 if (!programBinary)
9722 {
9723 return GL_INVALID_INDEX;
9724 }
9725
9726 return programBinary->getUniformBlockIndex(uniformBlockName);
9727 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009728 }
9729 catch(std::bad_alloc&)
9730 {
9731 return gl::error(GL_OUT_OF_MEMORY, 0);
9732 }
9733
9734 return 0;
9735}
9736
9737void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
9738{
9739 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
9740 program, uniformBlockIndex, pname, params);
9741
9742 try
9743 {
9744 gl::Context *context = gl::getNonLostContext();
9745
9746 if (context)
9747 {
9748 if (context->getClientVersion() < 3)
9749 {
9750 return gl::error(GL_INVALID_OPERATION);
9751 }
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009752 gl::Program *programObject = context->getProgram(program);
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009753
shannonwoods@chromium.orge7317ca2013-05-30 00:07:35 +00009754 if (!programObject)
9755 {
9756 if (context->getShader(program))
9757 {
9758 return gl::error(GL_INVALID_OPERATION);
9759 }
9760 else
9761 {
9762 return gl::error(GL_INVALID_VALUE);
9763 }
9764 }
9765
9766 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9767
9768 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9769 {
9770 return gl::error(GL_INVALID_VALUE);
9771 }
9772
9773 switch (pname)
9774 {
9775 case GL_UNIFORM_BLOCK_BINDING:
9776 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
9777 break;
9778
9779 case GL_UNIFORM_BLOCK_DATA_SIZE:
9780 case GL_UNIFORM_BLOCK_NAME_LENGTH:
9781 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
9782 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
9783 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
9784 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
9785 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
9786 break;
9787
9788 default:
9789 return gl::error(GL_INVALID_ENUM);
9790 }
9791 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009792 }
9793 catch(std::bad_alloc&)
9794 {
9795 return gl::error(GL_OUT_OF_MEMORY);
9796 }
9797}
9798
9799void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
9800{
9801 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
9802 program, uniformBlockIndex, bufSize, length, uniformBlockName);
9803
9804 try
9805 {
9806 gl::Context *context = gl::getNonLostContext();
9807
9808 if (context)
9809 {
9810 if (context->getClientVersion() < 3)
9811 {
9812 return gl::error(GL_INVALID_OPERATION);
9813 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009814
shannonwoods@chromium.orgbeb02782013-05-30 00:07:28 +00009815 gl::Program *programObject = context->getProgram(program);
9816
9817 if (!programObject)
9818 {
9819 if (context->getShader(program))
9820 {
9821 return gl::error(GL_INVALID_OPERATION);
9822 }
9823 else
9824 {
9825 return gl::error(GL_INVALID_VALUE);
9826 }
9827 }
9828
9829 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9830
9831 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9832 {
9833 return gl::error(GL_INVALID_VALUE);
9834 }
9835
9836 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
9837 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009838 }
9839 catch(std::bad_alloc&)
9840 {
9841 return gl::error(GL_OUT_OF_MEMORY);
9842 }
9843}
9844
9845void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
9846{
9847 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
9848 program, uniformBlockIndex, uniformBlockBinding);
9849
9850 try
9851 {
9852 gl::Context *context = gl::getNonLostContext();
9853
9854 if (context)
9855 {
9856 if (context->getClientVersion() < 3)
9857 {
9858 return gl::error(GL_INVALID_OPERATION);
9859 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009860
shannonwoods@chromium.org70eb1ea2013-05-30 00:07:20 +00009861 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
9862 {
9863 return gl::error(GL_INVALID_VALUE);
9864 }
9865
9866 gl::Program *programObject = context->getProgram(program);
9867
9868 if (!programObject)
9869 {
9870 if (context->getShader(program))
9871 {
9872 return gl::error(GL_INVALID_OPERATION);
9873 }
9874 else
9875 {
9876 return gl::error(GL_INVALID_VALUE);
9877 }
9878 }
9879
9880 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9881
9882 // if never linked, there won't be any uniform blocks
9883 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
9884 {
9885 return gl::error(GL_INVALID_VALUE);
9886 }
9887
9888 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
9889 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +00009890 }
9891 catch(std::bad_alloc&)
9892 {
9893 return gl::error(GL_OUT_OF_MEMORY);
9894 }
9895}
9896
9897void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
9898{
9899 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
9900 mode, first, count, instanceCount);
9901
9902 try
9903 {
9904 gl::Context *context = gl::getNonLostContext();
9905
9906 if (context)
9907 {
9908 if (context->getClientVersion() < 3)
9909 {
9910 return gl::error(GL_INVALID_OPERATION);
9911 }
9912 }
9913
9914 UNIMPLEMENTED();
9915 }
9916 catch(std::bad_alloc&)
9917 {
9918 return gl::error(GL_OUT_OF_MEMORY);
9919 }
9920}
9921
9922void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
9923{
9924 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
9925 mode, count, type, indices, instanceCount);
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
9947GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
9948{
9949 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
9950
9951 try
9952 {
9953 gl::Context *context = gl::getNonLostContext();
9954
9955 if (context)
9956 {
9957 if (context->getClientVersion() < 3)
9958 {
9959 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(NULL));
9960 }
9961 }
9962
9963 UNIMPLEMENTED();
9964 }
9965 catch(std::bad_alloc&)
9966 {
9967 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
9968 }
9969
9970 return NULL;
9971}
9972
9973GLboolean __stdcall glIsSync(GLsync sync)
9974{
9975 EVENT("(GLsync sync = 0x%0.8p)", sync);
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, GL_FALSE);
9986 }
9987 }
9988
9989 UNIMPLEMENTED();
9990 }
9991 catch(std::bad_alloc&)
9992 {
9993 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9994 }
9995
9996 return GL_FALSE;
9997}
9998
9999void __stdcall glDeleteSync(GLsync sync)
10000{
10001 EVENT("(GLsync sync = 0x%0.8p)", sync);
10002
10003 try
10004 {
10005 gl::Context *context = gl::getNonLostContext();
10006
10007 if (context)
10008 {
10009 if (context->getClientVersion() < 3)
10010 {
10011 return gl::error(GL_INVALID_OPERATION);
10012 }
10013 }
10014
10015 UNIMPLEMENTED();
10016 }
10017 catch(std::bad_alloc&)
10018 {
10019 return gl::error(GL_OUT_OF_MEMORY);
10020 }
10021}
10022
10023GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10024{
10025 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10026 sync, flags, timeout);
10027
10028 try
10029 {
10030 gl::Context *context = gl::getNonLostContext();
10031
10032 if (context)
10033 {
10034 if (context->getClientVersion() < 3)
10035 {
10036 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10037 }
10038 }
10039
10040 UNIMPLEMENTED();
10041 }
10042 catch(std::bad_alloc&)
10043 {
10044 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10045 }
10046
10047 return GL_FALSE;
10048}
10049
10050void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
10051{
10052 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
10053 sync, flags, timeout);
10054
10055 try
10056 {
10057 gl::Context *context = gl::getNonLostContext();
10058
10059 if (context)
10060 {
10061 if (context->getClientVersion() < 3)
10062 {
10063 return gl::error(GL_INVALID_OPERATION);
10064 }
10065 }
10066
10067 UNIMPLEMENTED();
10068 }
10069 catch(std::bad_alloc&)
10070 {
10071 return gl::error(GL_OUT_OF_MEMORY);
10072 }
10073}
10074
10075void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
10076{
10077 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10078 pname, params);
10079
10080 try
10081 {
10082 gl::Context *context = gl::getNonLostContext();
10083
10084 if (context)
10085 {
10086 if (context->getClientVersion() < 3)
10087 {
10088 return gl::error(GL_INVALID_OPERATION);
10089 }
10090 }
10091
10092 UNIMPLEMENTED();
10093 }
10094 catch(std::bad_alloc&)
10095 {
10096 return gl::error(GL_OUT_OF_MEMORY);
10097 }
10098}
10099
10100void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
10101{
10102 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
10103 sync, pname, bufSize, length, values);
10104
10105 try
10106 {
10107 gl::Context *context = gl::getNonLostContext();
10108
10109 if (context)
10110 {
10111 if (context->getClientVersion() < 3)
10112 {
10113 return gl::error(GL_INVALID_OPERATION);
10114 }
10115 }
10116
10117 UNIMPLEMENTED();
10118 }
10119 catch(std::bad_alloc&)
10120 {
10121 return gl::error(GL_OUT_OF_MEMORY);
10122 }
10123}
10124
10125void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
10126{
10127 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
10128 target, index, data);
10129
10130 try
10131 {
10132 gl::Context *context = gl::getNonLostContext();
10133
10134 if (context)
10135 {
10136 if (context->getClientVersion() < 3)
10137 {
10138 return gl::error(GL_INVALID_OPERATION);
10139 }
10140 }
10141
10142 UNIMPLEMENTED();
10143 }
10144 catch(std::bad_alloc&)
10145 {
10146 return gl::error(GL_OUT_OF_MEMORY);
10147 }
10148}
10149
10150void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
10151{
10152 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
10153 target, pname, params);
10154
10155 try
10156 {
10157 gl::Context *context = gl::getNonLostContext();
10158
10159 if (context)
10160 {
10161 if (context->getClientVersion() < 3)
10162 {
10163 return gl::error(GL_INVALID_OPERATION);
10164 }
10165 }
10166
10167 UNIMPLEMENTED();
10168 }
10169 catch(std::bad_alloc&)
10170 {
10171 return gl::error(GL_OUT_OF_MEMORY);
10172 }
10173}
10174
10175void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
10176{
10177 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
10178
10179 try
10180 {
10181 gl::Context *context = gl::getNonLostContext();
10182
10183 if (context)
10184 {
10185 if (context->getClientVersion() < 3)
10186 {
10187 return gl::error(GL_INVALID_OPERATION);
10188 }
10189 }
10190
10191 UNIMPLEMENTED();
10192 }
10193 catch(std::bad_alloc&)
10194 {
10195 return gl::error(GL_OUT_OF_MEMORY);
10196 }
10197}
10198
10199void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
10200{
10201 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
10202
10203 try
10204 {
10205 gl::Context *context = gl::getNonLostContext();
10206
10207 if (context)
10208 {
10209 if (context->getClientVersion() < 3)
10210 {
10211 return gl::error(GL_INVALID_OPERATION);
10212 }
10213 }
10214
10215 UNIMPLEMENTED();
10216 }
10217 catch(std::bad_alloc&)
10218 {
10219 return gl::error(GL_OUT_OF_MEMORY);
10220 }
10221}
10222
10223GLboolean __stdcall glIsSampler(GLuint sampler)
10224{
10225 EVENT("(GLuint sampler = %u)", sampler);
10226
10227 try
10228 {
10229 gl::Context *context = gl::getNonLostContext();
10230
10231 if (context)
10232 {
10233 if (context->getClientVersion() < 3)
10234 {
10235 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10236 }
10237 }
10238
10239 UNIMPLEMENTED();
10240 }
10241 catch(std::bad_alloc&)
10242 {
10243 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10244 }
10245
10246 return GL_FALSE;
10247}
10248
10249void __stdcall glBindSampler(GLuint unit, GLuint sampler)
10250{
10251 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
10252
10253 try
10254 {
10255 gl::Context *context = gl::getNonLostContext();
10256
10257 if (context)
10258 {
10259 if (context->getClientVersion() < 3)
10260 {
10261 return gl::error(GL_INVALID_OPERATION);
10262 }
10263 }
10264
10265 UNIMPLEMENTED();
10266 }
10267 catch(std::bad_alloc&)
10268 {
10269 return gl::error(GL_OUT_OF_MEMORY);
10270 }
10271}
10272
10273void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
10274{
10275 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
10276
10277 try
10278 {
10279 gl::Context *context = gl::getNonLostContext();
10280
10281 if (context)
10282 {
10283 if (context->getClientVersion() < 3)
10284 {
10285 return gl::error(GL_INVALID_OPERATION);
10286 }
10287 }
10288
10289 UNIMPLEMENTED();
10290 }
10291 catch(std::bad_alloc&)
10292 {
10293 return gl::error(GL_OUT_OF_MEMORY);
10294 }
10295}
10296
10297void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
10298{
10299 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
10300 sampler, pname, param);
10301
10302 try
10303 {
10304 gl::Context *context = gl::getNonLostContext();
10305
10306 if (context)
10307 {
10308 if (context->getClientVersion() < 3)
10309 {
10310 return gl::error(GL_INVALID_OPERATION);
10311 }
10312 }
10313
10314 UNIMPLEMENTED();
10315 }
10316 catch(std::bad_alloc&)
10317 {
10318 return gl::error(GL_OUT_OF_MEMORY);
10319 }
10320}
10321
10322void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
10323{
10324 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
10325
10326 try
10327 {
10328 gl::Context *context = gl::getNonLostContext();
10329
10330 if (context)
10331 {
10332 if (context->getClientVersion() < 3)
10333 {
10334 return gl::error(GL_INVALID_OPERATION);
10335 }
10336 }
10337
10338 UNIMPLEMENTED();
10339 }
10340 catch(std::bad_alloc&)
10341 {
10342 return gl::error(GL_OUT_OF_MEMORY);
10343 }
10344}
10345
10346void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
10347{
10348 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
10349
10350 try
10351 {
10352 gl::Context *context = gl::getNonLostContext();
10353
10354 if (context)
10355 {
10356 if (context->getClientVersion() < 3)
10357 {
10358 return gl::error(GL_INVALID_OPERATION);
10359 }
10360 }
10361
10362 UNIMPLEMENTED();
10363 }
10364 catch(std::bad_alloc&)
10365 {
10366 return gl::error(GL_OUT_OF_MEMORY);
10367 }
10368}
10369
10370void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
10371{
10372 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
10373
10374 try
10375 {
10376 gl::Context *context = gl::getNonLostContext();
10377
10378 if (context)
10379 {
10380 if (context->getClientVersion() < 3)
10381 {
10382 return gl::error(GL_INVALID_OPERATION);
10383 }
10384 }
10385
10386 UNIMPLEMENTED();
10387 }
10388 catch(std::bad_alloc&)
10389 {
10390 return gl::error(GL_OUT_OF_MEMORY);
10391 }
10392}
10393
10394void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
10395{
10396 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
10397
10398 try
10399 {
10400 gl::Context *context = gl::getNonLostContext();
10401
10402 if (context)
10403 {
10404 if (context->getClientVersion() < 3)
10405 {
10406 return gl::error(GL_INVALID_OPERATION);
10407 }
10408 }
10409
10410 UNIMPLEMENTED();
10411 }
10412 catch(std::bad_alloc&)
10413 {
10414 return gl::error(GL_OUT_OF_MEMORY);
10415 }
10416}
10417
10418void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
10419{
10420 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
10421
10422 try
10423 {
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010424 if (index >= gl::MAX_VERTEX_ATTRIBS)
10425 {
10426 return gl::error(GL_INVALID_VALUE);
10427 }
10428
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010429 gl::Context *context = gl::getNonLostContext();
10430
10431 if (context)
10432 {
10433 if (context->getClientVersion() < 3)
10434 {
10435 return gl::error(GL_INVALID_OPERATION);
10436 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010437
shannon.woods%transgaming.com@gtempaccount.com8736bd62013-04-13 03:35:41 +000010438 context->setVertexAttribDivisor(index, divisor);
10439 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010440 }
10441 catch(std::bad_alloc&)
10442 {
10443 return gl::error(GL_OUT_OF_MEMORY);
10444 }
10445}
10446
10447void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
10448{
10449 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
10450
10451 try
10452 {
10453 gl::Context *context = gl::getNonLostContext();
10454
10455 if (context)
10456 {
10457 if (context->getClientVersion() < 3)
10458 {
10459 return gl::error(GL_INVALID_OPERATION);
10460 }
10461 }
10462
10463 UNIMPLEMENTED();
10464 }
10465 catch(std::bad_alloc&)
10466 {
10467 return gl::error(GL_OUT_OF_MEMORY);
10468 }
10469}
10470
10471void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
10472{
10473 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
10474
10475 try
10476 {
10477 gl::Context *context = gl::getNonLostContext();
10478
10479 if (context)
10480 {
10481 if (context->getClientVersion() < 3)
10482 {
10483 return gl::error(GL_INVALID_OPERATION);
10484 }
10485 }
10486
10487 UNIMPLEMENTED();
10488 }
10489 catch(std::bad_alloc&)
10490 {
10491 return gl::error(GL_OUT_OF_MEMORY);
10492 }
10493}
10494
10495void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
10496{
10497 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
10498
10499 try
10500 {
10501 gl::Context *context = gl::getNonLostContext();
10502
10503 if (context)
10504 {
10505 if (context->getClientVersion() < 3)
10506 {
10507 return gl::error(GL_INVALID_OPERATION);
10508 }
10509 }
10510
10511 UNIMPLEMENTED();
10512 }
10513 catch(std::bad_alloc&)
10514 {
10515 return gl::error(GL_OUT_OF_MEMORY);
10516 }
10517}
10518
10519GLboolean __stdcall glIsTransformFeedback(GLuint id)
10520{
10521 EVENT("(GLuint id = %u)", id);
10522
10523 try
10524 {
10525 gl::Context *context = gl::getNonLostContext();
10526
10527 if (context)
10528 {
10529 if (context->getClientVersion() < 3)
10530 {
10531 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10532 }
10533 }
10534
10535 UNIMPLEMENTED();
10536 }
10537 catch(std::bad_alloc&)
10538 {
10539 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10540 }
10541
10542 return GL_FALSE;
10543}
10544
10545void __stdcall glPauseTransformFeedback(void)
10546{
10547 EVENT("(void)");
10548
10549 try
10550 {
10551 gl::Context *context = gl::getNonLostContext();
10552
10553 if (context)
10554 {
10555 if (context->getClientVersion() < 3)
10556 {
10557 return gl::error(GL_INVALID_OPERATION);
10558 }
10559 }
10560
10561 UNIMPLEMENTED();
10562 }
10563 catch(std::bad_alloc&)
10564 {
10565 return gl::error(GL_OUT_OF_MEMORY);
10566 }
10567}
10568
10569void __stdcall glResumeTransformFeedback(void)
10570{
10571 EVENT("(void)");
10572
10573 try
10574 {
10575 gl::Context *context = gl::getNonLostContext();
10576
10577 if (context)
10578 {
10579 if (context->getClientVersion() < 3)
10580 {
10581 return gl::error(GL_INVALID_OPERATION);
10582 }
10583 }
10584
10585 UNIMPLEMENTED();
10586 }
10587 catch(std::bad_alloc&)
10588 {
10589 return gl::error(GL_OUT_OF_MEMORY);
10590 }
10591}
10592
10593void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
10594{
10595 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
10596 program, bufSize, length, binaryFormat, binary);
10597
10598 try
10599 {
10600 gl::Context *context = gl::getNonLostContext();
10601
10602 if (context)
10603 {
10604 if (context->getClientVersion() < 3)
10605 {
10606 return gl::error(GL_INVALID_OPERATION);
10607 }
10608 }
10609
10610 UNIMPLEMENTED();
10611 }
10612 catch(std::bad_alloc&)
10613 {
10614 return gl::error(GL_OUT_OF_MEMORY);
10615 }
10616}
10617
10618void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
10619{
10620 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
10621 program, binaryFormat, binary, length);
10622
10623 try
10624 {
10625 gl::Context *context = gl::getNonLostContext();
10626
10627 if (context)
10628 {
10629 if (context->getClientVersion() < 3)
10630 {
10631 return gl::error(GL_INVALID_OPERATION);
10632 }
10633 }
10634
10635 UNIMPLEMENTED();
10636 }
10637 catch(std::bad_alloc&)
10638 {
10639 return gl::error(GL_OUT_OF_MEMORY);
10640 }
10641}
10642
10643void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
10644{
10645 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
10646 program, pname, value);
10647
10648 try
10649 {
10650 gl::Context *context = gl::getNonLostContext();
10651
10652 if (context)
10653 {
10654 if (context->getClientVersion() < 3)
10655 {
10656 return gl::error(GL_INVALID_OPERATION);
10657 }
10658 }
10659
10660 UNIMPLEMENTED();
10661 }
10662 catch(std::bad_alloc&)
10663 {
10664 return gl::error(GL_OUT_OF_MEMORY);
10665 }
10666}
10667
10668void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
10669{
10670 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
10671 target, numAttachments, attachments);
10672
10673 try
10674 {
10675 gl::Context *context = gl::getNonLostContext();
10676
10677 if (context)
10678 {
10679 if (context->getClientVersion() < 3)
10680 {
10681 return gl::error(GL_INVALID_OPERATION);
10682 }
10683 }
10684
10685 UNIMPLEMENTED();
10686 }
10687 catch(std::bad_alloc&)
10688 {
10689 return gl::error(GL_OUT_OF_MEMORY);
10690 }
10691}
10692
10693void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
10694{
10695 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
10696 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
10697 target, numAttachments, attachments, x, y, width, height);
10698
10699 try
10700 {
10701 gl::Context *context = gl::getNonLostContext();
10702
10703 if (context)
10704 {
10705 if (context->getClientVersion() < 3)
10706 {
10707 return gl::error(GL_INVALID_OPERATION);
10708 }
10709 }
10710
10711 UNIMPLEMENTED();
10712 }
10713 catch(std::bad_alloc&)
10714 {
10715 return gl::error(GL_OUT_OF_MEMORY);
10716 }
10717}
10718
10719void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
10720{
10721 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
10722 target, levels, internalformat, width, height);
10723
10724 try
10725 {
10726 gl::Context *context = gl::getNonLostContext();
10727
10728 if (context)
10729 {
10730 if (context->getClientVersion() < 3)
10731 {
10732 return gl::error(GL_INVALID_OPERATION);
10733 }
10734 }
10735
10736 UNIMPLEMENTED();
10737 }
10738 catch(std::bad_alloc&)
10739 {
10740 return gl::error(GL_OUT_OF_MEMORY);
10741 }
10742}
10743
10744void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
10745{
10746 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
10747 "GLsizei height = %d, GLsizei depth = %d)",
10748 target, levels, internalformat, width, height, depth);
10749
10750 try
10751 {
10752 gl::Context *context = gl::getNonLostContext();
10753
10754 if (context)
10755 {
10756 if (context->getClientVersion() < 3)
10757 {
10758 return gl::error(GL_INVALID_OPERATION);
10759 }
shannon.woods%transgaming.com@gtempaccount.com14eb55e2013-04-13 03:35:06 +000010760 }
shannon.woods%transgaming.com@gtempaccount.coma8171752013-04-13 03:29:28 +000010761 }
10762 catch(std::bad_alloc&)
10763 {
10764 return gl::error(GL_OUT_OF_MEMORY);
10765 }
10766}
10767
10768void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
10769{
10770 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
10771 "GLint* params = 0x%0.8p)",
10772 target, internalformat, pname, bufSize, params);
10773
10774 try
10775 {
10776 gl::Context *context = gl::getNonLostContext();
10777
10778 if (context)
10779 {
10780 if (context->getClientVersion() < 3)
10781 {
10782 return gl::error(GL_INVALID_OPERATION);
10783 }
10784 }
10785
10786 UNIMPLEMENTED();
10787 }
10788 catch(std::bad_alloc&)
10789 {
10790 return gl::error(GL_OUT_OF_MEMORY);
10791 }
10792}
10793
10794// Extension functions
10795
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010796void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
10797 GLbitfield mask, GLenum filter)
10798{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010799 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010800 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
10801 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
10802 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
10803
10804 try
10805 {
10806 switch (filter)
10807 {
10808 case GL_NEAREST:
10809 break;
10810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010812 }
10813
10814 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
10815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010816 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010817 }
10818
10819 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
10820 {
10821 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010822 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010823 }
10824
daniel@transgaming.com9d788502011-11-09 17:46:55 +000010825 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010826
10827 if (context)
10828 {
10829 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
10830 {
10831 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010832 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010833 }
10834
10835 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
10836 }
10837 }
10838 catch(std::bad_alloc&)
10839 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010840 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000010841 }
10842}
10843
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010844void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
10845 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010846{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000010847 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000010848 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +000010849 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010850 target, level, internalformat, width, height, depth, border, format, type, pixels);
10851
10852 try
10853 {
10854 UNIMPLEMENTED(); // FIXME
10855 }
10856 catch(std::bad_alloc&)
10857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010858 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010859 }
10860}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010861
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010862void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
10863 GLenum *binaryFormat, void *binary)
10864{
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010865 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 +000010866 program, bufSize, length, binaryFormat, binary);
10867
10868 try
10869 {
10870 gl::Context *context = gl::getNonLostContext();
10871
10872 if (context)
10873 {
10874 gl::Program *programObject = context->getProgram(program);
10875
daniel@transgaming.com716056c2012-07-24 18:38:59 +000010876 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010878 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010879 }
10880
10881 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
10882
10883 if (!programBinary)
10884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010885 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010886 }
10887
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010888 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010890 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010891 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +000010892
10893 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010894 }
10895 }
10896 catch(std::bad_alloc&)
10897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010898 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010899 }
10900}
10901
10902void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
10903 const void *binary, GLint length)
10904{
10905 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
10906 program, binaryFormat, binary, length);
10907
10908 try
10909 {
10910 gl::Context *context = gl::getNonLostContext();
10911
10912 if (context)
10913 {
10914 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
10915 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010916 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010917 }
10918
10919 gl::Program *programObject = context->getProgram(program);
10920
10921 if (!programObject)
10922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010923 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010924 }
10925
daniel@transgaming.com95d29422012-07-24 18:36:10 +000010926 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010927 }
10928 }
10929 catch(std::bad_alloc&)
10930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000010931 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000010932 }
10933}
10934
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010935void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
10936{
10937 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
10938
10939 try
10940 {
10941 gl::Context *context = gl::getNonLostContext();
10942
10943 if (context)
10944 {
10945 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
10946 {
10947 return gl::error(GL_INVALID_VALUE);
10948 }
10949
10950 if (context->getDrawFramebufferHandle() == 0)
10951 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010952 if (n != 1)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010953 {
10954 return gl::error(GL_INVALID_OPERATION);
10955 }
10956
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010957 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010958 {
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010959 return gl::error(GL_INVALID_OPERATION);
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010960 }
10961 }
10962 else
10963 {
10964 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10965 {
10966 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
10967 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
10968 {
10969 return gl::error(GL_INVALID_OPERATION);
10970 }
10971 }
10972 }
10973
10974 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
10975
10976 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
10977 {
10978 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
10979 }
shannon.woods%transgaming.com@gtempaccount.com2fa73c52013-04-13 03:37:20 +000010980
10981 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
10982 {
10983 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
10984 }
shannon.woods%transgaming.com@gtempaccount.com4059a382013-04-13 03:31:16 +000010985 }
10986 }
10987 catch (std::bad_alloc&)
10988 {
10989 return gl::error(GL_OUT_OF_MEMORY);
10990 }
10991}
10992
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000010993__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10994{
10995 struct Extension
10996 {
10997 const char *name;
10998 __eglMustCastToProperFunctionPointerType address;
10999 };
11000
11001 static const Extension glExtensions[] =
11002 {
11003 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +000011004 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +000011005 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000011006 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
11007 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
11008 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
11009 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
11010 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
11011 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
11012 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +000011013 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +000011014 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +000011015 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
11016 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
11017 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
11018 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000011019 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
11020 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
11021 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
11022 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
11023 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
11024 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
11025 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
shannon.woods%transgaming.com@gtempaccount.com77d94722013-04-13 03:34:22 +000011026 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +000011027 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
11028 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
11029 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +000011030 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
11031 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011032
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +000011033 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +000011034 {
11035 if (strcmp(procname, glExtensions[ext].name) == 0)
11036 {
11037 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
11038 }
11039 }
11040
11041 return NULL;
11042}
11043
daniel@transgaming.com17f548c2011-11-09 17:47:02 +000011044// Non-public functions used by EGL
11045
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011046bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011047{
11048 EVENT("(egl::Surface* surface = 0x%0.8p)",
11049 surface);
11050
11051 try
11052 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +000011053 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011054
11055 if (context)
11056 {
11057 gl::Texture2D *textureObject = context->getTexture2D();
11058
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011059 if (textureObject->isImmutable())
11060 {
11061 return false;
11062 }
11063
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011064 if (textureObject)
11065 {
11066 textureObject->bindTexImage(surface);
11067 }
11068 }
11069 }
11070 catch(std::bad_alloc&)
11071 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000011072 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011073 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +000011074
11075 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +000011076}
11077
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011078}