blob: 52bf8d7ba8650b6d50cfba524ca4eadd64576830 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8
9#define GL_APICALL
10#include <GLES2/gl2.h>
11#include <GLES2/gl2ext.h>
12
daniel@transgaming.com00c75962010-03-11 20:36:15 +000013#include <exception>
14#include <limits>
15
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000016#include "common/debug.h"
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000017#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018
19#include "libGLESv2/main.h"
20#include "libGLESv2/mathutil.h"
21#include "libGLESv2/utilities.h"
22#include "libGLESv2/Buffer.h"
23#include "libGLESv2/Context.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000024#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000025#include "libGLESv2/Framebuffer.h"
26#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000027#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000028#include "libGLESv2/Renderbuffer.h"
29#include "libGLESv2/Shader.h"
30#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000031#include "libGLESv2/Query.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000033bool validImageSize(GLint level, GLsizei width, GLsizei height)
34{
35 if (level < 0 || width < 0 || height < 0)
36 {
37 return false;
38 }
39
40 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
41 {
42 return true;
43 }
44
45 if (level == 0)
46 {
47 return true;
48 }
49
50 if (gl::isPow2(width) && gl::isPow2(height))
51 {
52 return true;
53 }
54
55 return false;
56}
57
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000058// Verify that format/type are one of the combinations from table 3.4.
59bool checkTextureFormatType(GLenum format, GLenum type)
60{
61 // validate <format> by itself (used as secondary key below)
62 switch (format)
63 {
64 case GL_RGBA:
65 case GL_BGRA_EXT:
66 case GL_RGB:
67 case GL_ALPHA:
68 case GL_LUMINANCE:
69 case GL_LUMINANCE_ALPHA:
70 case GL_DEPTH_COMPONENT:
71 case GL_DEPTH_STENCIL_OES:
72 break;
73 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000074 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000075 }
76
77 // invalid <type> -> sets INVALID_ENUM
78 // invalid <format>+<type> combination -> sets INVALID_OPERATION
79 switch (type)
80 {
81 case GL_UNSIGNED_BYTE:
82 switch (format)
83 {
84 case GL_RGBA:
85 case GL_BGRA_EXT:
86 case GL_RGB:
87 case GL_ALPHA:
88 case GL_LUMINANCE:
89 case GL_LUMINANCE_ALPHA:
90 return true;
91 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000092 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000093 }
94
95 case GL_FLOAT:
96 case GL_HALF_FLOAT_OES:
97 switch (format)
98 {
99 case GL_RGBA:
100 case GL_RGB:
101 case GL_ALPHA:
102 case GL_LUMINANCE:
103 case GL_LUMINANCE_ALPHA:
104 return true;
105 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000106 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000107 }
108
109 case GL_UNSIGNED_SHORT_4_4_4_4:
110 case GL_UNSIGNED_SHORT_5_5_5_1:
111 switch (format)
112 {
113 case GL_RGBA:
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_5_6_5:
120 switch (format)
121 {
122 case GL_RGB:
123 return true;
124 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000125 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000126 }
127
128 case GL_UNSIGNED_SHORT:
129 case GL_UNSIGNED_INT:
130 switch (format)
131 {
132 case GL_DEPTH_COMPONENT:
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 case GL_UNSIGNED_INT_24_8_OES:
139 switch (format)
140 {
141 case GL_DEPTH_STENCIL_OES:
142 return true;
143 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000144 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000145 }
146
147 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000148 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000149 }
150}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000151
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000152bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000153 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000154 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155{
156 if (!texture)
157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000158 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000159 }
160
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000161 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000163 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000166 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000167 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000168 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
169 if (internalformat != texture->getInternalFormat(level))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000172 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000173 }
174
175 if (compressed)
176 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000177 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
178 (height % 4 != 0 && height != texture->getHeight(0)))
179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000180 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000181 }
182 }
183
184 if (xoffset + width > texture->getWidth(level) ||
185 yoffset + height > texture->getHeight(level))
186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000187 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000188 }
189
190 return true;
191}
192
193bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000194 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000195 gl::TextureCubeMap *texture)
196{
197 if (!texture)
198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000199 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000200 }
201
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000202 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000204 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000207 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000208 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000209 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
210 if (internalformat != texture->getInternalFormat(target, level))
211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000213 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000214 }
215
216 if (compressed)
217 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000218 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
219 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000221 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000222 }
223 }
224
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000225 if (xoffset + width > texture->getWidth(target, level) ||
226 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000228 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000229 }
230
231 return true;
232}
233
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000234// check for combinations of format and type that are valid for ReadPixels
235bool validReadFormatType(GLenum format, GLenum type)
236{
237 switch (format)
238 {
239 case GL_RGBA:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 break;
244 default:
245 return false;
246 }
247 break;
248 case GL_BGRA_EXT:
249 switch (type)
250 {
251 case GL_UNSIGNED_BYTE:
252 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
253 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
254 break;
255 default:
256 return false;
257 }
258 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000259 default:
260 return false;
261 }
262 return true;
263}
264
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265extern "C"
266{
267
268void __stdcall glActiveTexture(GLenum texture)
269{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000270 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271
272 try
273 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275
276 if (context)
277 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000278 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000280 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000281 }
282
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000283 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000284 }
285 }
286 catch(std::bad_alloc&)
287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000288 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000289 }
290}
291
292void __stdcall glAttachShader(GLuint program, GLuint shader)
293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000294 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000295
296 try
297 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000298 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299
300 if (context)
301 {
302 gl::Program *programObject = context->getProgram(program);
303 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000304
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000305 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000307 if (context->getShader(program))
308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000309 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000310 }
311 else
312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000313 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000314 }
315 }
316
317 if (!shaderObject)
318 {
319 if (context->getProgram(shader))
320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000321 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000322 }
323 else
324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000327 }
328
329 if (!programObject->attachShader(shaderObject))
330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000331 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 }
333 }
334 }
335 catch(std::bad_alloc&)
336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000337 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000338 }
339}
340
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000341void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
342{
343 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
344
345 try
346 {
347 switch (target)
348 {
349 case GL_ANY_SAMPLES_PASSED_EXT:
350 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
351 break;
352 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000353 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000354 }
355
356 if (id == 0)
357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000358 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000359 }
360
361 gl::Context *context = gl::getNonLostContext();
362
363 if (context)
364 {
365 context->beginQuery(target, id);
366 }
367 }
368 catch(std::bad_alloc&)
369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000371 }
372}
373
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000374void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000376 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377
378 try
379 {
380 if (index >= gl::MAX_VERTEX_ATTRIBS)
381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000382 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000383 }
384
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000385 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386
387 if (context)
388 {
389 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391 if (!programObject)
392 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000393 if (context->getShader(program))
394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000395 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000396 }
397 else
398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000399 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000400 }
401 }
402
403 if (strncmp(name, "gl_", 3) == 0)
404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000405 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000406 }
407
408 programObject->bindAttributeLocation(index, name);
409 }
410 }
411 catch(std::bad_alloc&)
412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000413 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000414 }
415}
416
417void __stdcall glBindBuffer(GLenum target, GLuint buffer)
418{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000419 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420
421 try
422 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000423 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000424
425 if (context)
426 {
427 switch (target)
428 {
429 case GL_ARRAY_BUFFER:
430 context->bindArrayBuffer(buffer);
431 return;
432 case GL_ELEMENT_ARRAY_BUFFER:
433 context->bindElementArrayBuffer(buffer);
434 return;
435 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000436 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000437 }
438 }
439 }
440 catch(std::bad_alloc&)
441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000442 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443 }
444}
445
446void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
447{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000448 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449
450 try
451 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000452 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000454 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000455 }
456
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000457 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000458
459 if (context)
460 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000461 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
462 {
463 context->bindReadFramebuffer(framebuffer);
464 }
465
466 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
467 {
468 context->bindDrawFramebuffer(framebuffer);
469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470 }
471 }
472 catch(std::bad_alloc&)
473 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000474 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000475 }
476}
477
478void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
479{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000480 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481
482 try
483 {
484 if (target != GL_RENDERBUFFER)
485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000486 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000487 }
488
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000489 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490
491 if (context)
492 {
493 context->bindRenderbuffer(renderbuffer);
494 }
495 }
496 catch(std::bad_alloc&)
497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000498 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000499 }
500}
501
502void __stdcall glBindTexture(GLenum target, GLuint texture)
503{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000504 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000505
506 try
507 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000508 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509
510 if (context)
511 {
512 gl::Texture *textureObject = context->getTexture(texture);
513
514 if (textureObject && textureObject->getTarget() != target && texture != 0)
515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517 }
518
519 switch (target)
520 {
521 case GL_TEXTURE_2D:
522 context->bindTexture2D(texture);
523 return;
524 case GL_TEXTURE_CUBE_MAP:
525 context->bindTextureCubeMap(texture);
526 return;
527 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000528 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000529 }
530 }
531 }
532 catch(std::bad_alloc&)
533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000535 }
536}
537
538void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000540 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000541 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000542
543 try
544 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000545 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546
547 if (context)
548 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000549 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000550 }
551 }
552 catch(std::bad_alloc&)
553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000555 }
556}
557
558void __stdcall glBlendEquation(GLenum mode)
559{
560 glBlendEquationSeparate(mode, mode);
561}
562
563void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
564{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000565 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000566
567 try
568 {
569 switch (modeRGB)
570 {
571 case GL_FUNC_ADD:
572 case GL_FUNC_SUBTRACT:
573 case GL_FUNC_REVERSE_SUBTRACT:
574 break;
575 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 }
578
579 switch (modeAlpha)
580 {
581 case GL_FUNC_ADD:
582 case GL_FUNC_SUBTRACT:
583 case GL_FUNC_REVERSE_SUBTRACT:
584 break;
585 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587 }
588
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000590
591 if (context)
592 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000593 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000594 }
595 }
596 catch(std::bad_alloc&)
597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000598 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599 }
600}
601
602void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
603{
604 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
605}
606
607void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
608{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000609 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 +0000610 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000611
612 try
613 {
614 switch (srcRGB)
615 {
616 case GL_ZERO:
617 case GL_ONE:
618 case GL_SRC_COLOR:
619 case GL_ONE_MINUS_SRC_COLOR:
620 case GL_DST_COLOR:
621 case GL_ONE_MINUS_DST_COLOR:
622 case GL_SRC_ALPHA:
623 case GL_ONE_MINUS_SRC_ALPHA:
624 case GL_DST_ALPHA:
625 case GL_ONE_MINUS_DST_ALPHA:
626 case GL_CONSTANT_COLOR:
627 case GL_ONE_MINUS_CONSTANT_COLOR:
628 case GL_CONSTANT_ALPHA:
629 case GL_ONE_MINUS_CONSTANT_ALPHA:
630 case GL_SRC_ALPHA_SATURATE:
631 break;
632 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000634 }
635
636 switch (dstRGB)
637 {
638 case GL_ZERO:
639 case GL_ONE:
640 case GL_SRC_COLOR:
641 case GL_ONE_MINUS_SRC_COLOR:
642 case GL_DST_COLOR:
643 case GL_ONE_MINUS_DST_COLOR:
644 case GL_SRC_ALPHA:
645 case GL_ONE_MINUS_SRC_ALPHA:
646 case GL_DST_ALPHA:
647 case GL_ONE_MINUS_DST_ALPHA:
648 case GL_CONSTANT_COLOR:
649 case GL_ONE_MINUS_CONSTANT_COLOR:
650 case GL_CONSTANT_ALPHA:
651 case GL_ONE_MINUS_CONSTANT_ALPHA:
652 break;
653 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000654 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000655 }
656
657 switch (srcAlpha)
658 {
659 case GL_ZERO:
660 case GL_ONE:
661 case GL_SRC_COLOR:
662 case GL_ONE_MINUS_SRC_COLOR:
663 case GL_DST_COLOR:
664 case GL_ONE_MINUS_DST_COLOR:
665 case GL_SRC_ALPHA:
666 case GL_ONE_MINUS_SRC_ALPHA:
667 case GL_DST_ALPHA:
668 case GL_ONE_MINUS_DST_ALPHA:
669 case GL_CONSTANT_COLOR:
670 case GL_ONE_MINUS_CONSTANT_COLOR:
671 case GL_CONSTANT_ALPHA:
672 case GL_ONE_MINUS_CONSTANT_ALPHA:
673 case GL_SRC_ALPHA_SATURATE:
674 break;
675 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000676 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000677 }
678
679 switch (dstAlpha)
680 {
681 case GL_ZERO:
682 case GL_ONE:
683 case GL_SRC_COLOR:
684 case GL_ONE_MINUS_SRC_COLOR:
685 case GL_DST_COLOR:
686 case GL_ONE_MINUS_DST_COLOR:
687 case GL_SRC_ALPHA:
688 case GL_ONE_MINUS_SRC_ALPHA:
689 case GL_DST_ALPHA:
690 case GL_ONE_MINUS_DST_ALPHA:
691 case GL_CONSTANT_COLOR:
692 case GL_ONE_MINUS_CONSTANT_COLOR:
693 case GL_CONSTANT_ALPHA:
694 case GL_ONE_MINUS_CONSTANT_ALPHA:
695 break;
696 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000697 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698 }
699
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000700 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
701 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
702
703 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
704 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
705
706 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000707 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000708 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 +0000709 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000710 }
711
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000712 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000713
714 if (context)
715 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000716 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717 }
718 }
719 catch(std::bad_alloc&)
720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000722 }
723}
724
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000725void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000727 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 +0000728 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729
730 try
731 {
732 if (size < 0)
733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000734 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000735 }
736
737 switch (usage)
738 {
739 case GL_STREAM_DRAW:
740 case GL_STATIC_DRAW:
741 case GL_DYNAMIC_DRAW:
742 break;
743 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000744 return gl::error(GL_INVALID_ENUM);
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::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000752
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000753 switch (target)
754 {
755 case GL_ARRAY_BUFFER:
756 buffer = context->getArrayBuffer();
757 break;
758 case GL_ELEMENT_ARRAY_BUFFER:
759 buffer = context->getElementArrayBuffer();
760 break;
761 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000763 }
764
765 if (!buffer)
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
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000770 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771 }
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
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000779void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000781 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 +0000782 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783
784 try
785 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000786 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000788 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000789 }
790
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000791 if (data == NULL)
792 {
793 return;
794 }
795
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000796 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000797
798 if (context)
799 {
800 gl::Buffer *buffer;
801
802 switch (target)
803 {
804 case GL_ARRAY_BUFFER:
805 buffer = context->getArrayBuffer();
806 break;
807 case GL_ELEMENT_ARRAY_BUFFER:
808 buffer = context->getElementArrayBuffer();
809 break;
810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000812 }
813
814 if (!buffer)
815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000816 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000817 }
818
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000819 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000822 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000823
824 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000825 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000826 }
827 catch(std::bad_alloc&)
828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830 }
831}
832
833GLenum __stdcall glCheckFramebufferStatus(GLenum target)
834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000835 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836
837 try
838 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000839 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000841 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000842 }
843
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000845
846 if (context)
847 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000848 gl::Framebuffer *framebuffer = NULL;
849 if (target == GL_READ_FRAMEBUFFER_ANGLE)
850 {
851 framebuffer = context->getReadFramebuffer();
852 }
853 else
854 {
855 framebuffer = context->getDrawFramebuffer();
856 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000857
858 return framebuffer->completeness();
859 }
860 }
861 catch(std::bad_alloc&)
862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000863 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000864 }
865
866 return 0;
867}
868
869void __stdcall glClear(GLbitfield mask)
870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000871 EVENT("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000872
873 try
874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876
877 if (context)
878 {
879 context->clear(mask);
880 }
881 }
882 catch(std::bad_alloc&)
883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000885 }
886}
887
888void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000890 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000891 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000892
893 try
894 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000895 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000896
897 if (context)
898 {
899 context->setClearColor(red, green, blue, alpha);
900 }
901 }
902 catch(std::bad_alloc&)
903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000905 }
906}
907
908void __stdcall glClearDepthf(GLclampf depth)
909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000910 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000911
912 try
913 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915
916 if (context)
917 {
918 context->setClearDepth(depth);
919 }
920 }
921 catch(std::bad_alloc&)
922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000924 }
925}
926
927void __stdcall glClearStencil(GLint s)
928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000929 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000930
931 try
932 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934
935 if (context)
936 {
937 context->setClearStencil(s);
938 }
939 }
940 catch(std::bad_alloc&)
941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000943 }
944}
945
946void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000948 EVENT("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000949 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000950
951 try
952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954
955 if (context)
956 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000957 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000958 }
959 }
960 catch(std::bad_alloc&)
961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000962 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000963 }
964}
965
966void __stdcall glCompileShader(GLuint shader)
967{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000968 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000969
970 try
971 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000972 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000973
974 if (context)
975 {
976 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000977
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000978 if (!shaderObject)
979 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000980 if (context->getProgram(shader))
981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000982 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000983 }
984 else
985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000986 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000987 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000988 }
989
990 shaderObject->compile();
991 }
992 }
993 catch(std::bad_alloc&)
994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000996 }
997}
998
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000999void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
1000 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001002 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001003 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001004 target, level, internalformat, width, height, border, imageSize, data);
1005
1006 try
1007 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001008 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001010 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001011 }
1012
daniel@transgaming.com01868132010-08-24 19:21:17 +00001013 switch (internalformat)
1014 {
1015 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1016 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001017 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1018 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001019 break;
1020 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001021 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001022 }
1023
1024 if (border != 0)
1025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001026 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001027 }
1028
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001029 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001030
1031 if (context)
1032 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001033 if (level > context->getMaximumTextureLevel())
1034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001036 }
1037
1038 switch (target)
1039 {
1040 case GL_TEXTURE_2D:
1041 if (width > (context->getMaximumTextureDimension() >> level) ||
1042 height > (context->getMaximumTextureDimension() >> level))
1043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001044 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001045 }
1046 break;
1047 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1048 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1049 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1050 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1051 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1052 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1053 if (width != height)
1054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001055 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001056 }
1057
1058 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1059 height > (context->getMaximumCubeTextureDimension() >> level))
1060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001061 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001062 }
1063 break;
1064 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001065 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001066 }
1067
gman@chromium.org50c526d2011-08-10 05:19:44 +00001068 switch (internalformat) {
1069 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1070 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1071 if (!context->supportsDXT1Textures())
1072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001073 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 +00001074 }
1075 break;
1076 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1077 if (!context->supportsDXT3Textures())
1078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001079 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 +00001080 }
1081 break;
1082 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1083 if (!context->supportsDXT5Textures())
1084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001085 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 +00001086 }
1087 break;
1088 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001089 }
1090
1091 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001093 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001094 }
1095
1096 if (target == GL_TEXTURE_2D)
1097 {
1098 gl::Texture2D *texture = context->getTexture2D();
1099
1100 if (!texture)
1101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001102 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001103 }
1104
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001105 if (texture->isImmutable())
1106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001107 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001108 }
1109
daniel@transgaming.com01868132010-08-24 19:21:17 +00001110 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1111 }
1112 else
1113 {
1114 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1115
1116 if (!texture)
1117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001118 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001119 }
1120
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001121 if (texture->isImmutable())
1122 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001123 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001124 }
1125
daniel@transgaming.com01868132010-08-24 19:21:17 +00001126 switch (target)
1127 {
1128 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1129 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1130 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1131 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1132 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1133 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1134 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1135 break;
1136 default: UNREACHABLE();
1137 }
1138 }
1139 }
1140
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141 }
1142 catch(std::bad_alloc&)
1143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001144 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001145 }
1146}
1147
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001148void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1149 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001150{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001151 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001152 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001153 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001154 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1155
1156 try
1157 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001158 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001160 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001161 }
1162
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001163 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001165 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001166 }
1167
daniel@transgaming.com01868132010-08-24 19:21:17 +00001168 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001169 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001170 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1171 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001172 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1173 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001174 break;
1175 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001176 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001177 }
1178
daniel@transgaming.com01868132010-08-24 19:21:17 +00001179 if (width == 0 || height == 0 || data == NULL)
1180 {
1181 return;
1182 }
1183
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001184 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001185
1186 if (context)
1187 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001188 if (level > context->getMaximumTextureLevel())
1189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001190 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001191 }
1192
gman@chromium.org50c526d2011-08-10 05:19:44 +00001193 switch (format) {
1194 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1195 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1196 if (!context->supportsDXT1Textures())
1197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001198 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 +00001199 }
1200 break;
1201 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1202 if (!context->supportsDXT3Textures())
1203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001204 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 +00001205 }
1206 break;
1207 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1208 if (!context->supportsDXT5Textures())
1209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001210 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 +00001211 }
1212 break;
1213 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001214 }
1215
1216 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001218 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001219 }
1220
1221 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001223 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 +00001224 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001225 }
1226
1227 if (target == GL_TEXTURE_2D)
1228 {
1229 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001230 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001231 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001232 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001233 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001234 }
1235 else if (gl::IsCubemapTextureTarget(target))
1236 {
1237 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001238 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001239 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001240 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001241 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001242 }
1243 else
1244 {
1245 UNREACHABLE();
1246 }
1247 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001248 }
1249 catch(std::bad_alloc&)
1250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001251 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001252 }
1253}
1254
1255void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001257 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001258 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001259 target, level, internalformat, x, y, width, height, border);
1260
1261 try
1262 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001263 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001266 }
1267
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001268 if (border != 0)
1269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001271 }
1272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001274
1275 if (context)
1276 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001277 if (level > context->getMaximumTextureLevel())
1278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001280 }
1281
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001282 switch (target)
1283 {
1284 case GL_TEXTURE_2D:
1285 if (width > (context->getMaximumTextureDimension() >> level) ||
1286 height > (context->getMaximumTextureDimension() >> level))
1287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001288 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001289 }
1290 break;
1291 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1292 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1293 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1294 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1295 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1296 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1297 if (width != height)
1298 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001299 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001300 }
1301
1302 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1303 height > (context->getMaximumCubeTextureDimension() >> level))
1304 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001305 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001306 }
1307 break;
1308 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001309 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001310 }
1311
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001312 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001313
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001314 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001316 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001317 }
1318
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001319 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001321 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001322 }
1323
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001324 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001325 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001326
1327 // [OpenGL ES 2.0.24] table 3.9
1328 switch (internalformat)
1329 {
1330 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001331 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001332 colorbufferFormat != GL_RGBA4 &&
1333 colorbufferFormat != GL_RGB5_A1 &&
1334 colorbufferFormat != GL_RGBA8_OES)
1335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001336 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001337 }
1338 break;
1339 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001340 case GL_RGB:
1341 if (colorbufferFormat != GL_RGB565 &&
1342 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001343 colorbufferFormat != GL_RGBA4 &&
1344 colorbufferFormat != GL_RGB5_A1 &&
1345 colorbufferFormat != GL_RGBA8_OES)
1346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001347 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001348 }
1349 break;
1350 case GL_LUMINANCE_ALPHA:
1351 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001352 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001353 colorbufferFormat != GL_RGB5_A1 &&
1354 colorbufferFormat != GL_RGBA8_OES)
1355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001356 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001357 }
1358 break;
1359 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1360 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001361 if (context->supportsDXT1Textures())
1362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001363 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001364 }
1365 else
1366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001368 }
1369 break;
1370 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1371 if (context->supportsDXT3Textures())
1372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001373 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001374 }
1375 else
1376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001377 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001378 }
1379 break;
1380 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1381 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001383 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001384 }
1385 else
1386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001387 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001388 }
1389 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001390 case GL_DEPTH_COMPONENT:
1391 case GL_DEPTH_COMPONENT16:
1392 case GL_DEPTH_COMPONENT32_OES:
1393 case GL_DEPTH_STENCIL_OES:
1394 case GL_DEPTH24_STENCIL8_OES:
1395 if (context->supportsDepthTextures())
1396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001397 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001398 }
1399 else
1400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001401 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001402 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001403 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001404 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001405 }
1406
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001407 if (target == GL_TEXTURE_2D)
1408 {
1409 gl::Texture2D *texture = context->getTexture2D();
1410
1411 if (!texture)
1412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001414 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001415
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001416 if (texture->isImmutable())
1417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001418 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001419 }
1420
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001421 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001422 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001423 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001424 {
1425 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1426
1427 if (!texture)
1428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001429 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001430 }
1431
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001432 if (texture->isImmutable())
1433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001434 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001435 }
1436
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001437 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001438 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001439 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001440 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441 }
1442 catch(std::bad_alloc&)
1443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001444 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446}
1447
1448void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001450 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001451 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001452 target, level, xoffset, yoffset, x, y, width, height);
1453
1454 try
1455 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001456 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001458 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001459 }
1460
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001461 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001463 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001464 }
1465
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001466 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001469 }
1470
1471 if (width == 0 || height == 0)
1472 {
1473 return;
1474 }
1475
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001476 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001477
1478 if (context)
1479 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001480 if (level > context->getMaximumTextureLevel())
1481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001483 }
1484
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001485 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001486
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001487 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001489 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001490 }
1491
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001492 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1493 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001494 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001495 }
1496
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001497 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001498 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001499 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001500 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001501
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001502 if (target == GL_TEXTURE_2D)
1503 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001504 gl::Texture2D *tex2d = context->getTexture2D();
1505
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001506 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001507 {
1508 return; // error already registered by validateSubImageParams
1509 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001510 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001511 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001512 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001513 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001514 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001515 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1516
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001517 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001518 {
1519 return; // error already registered by validateSubImageParams
1520 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001521 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001522 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001523 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001524 else UNREACHABLE();
1525
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001526 // [OpenGL ES 2.0.24] table 3.9
1527 switch (textureFormat)
1528 {
1529 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001530 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001531 colorbufferFormat != GL_RGBA4 &&
1532 colorbufferFormat != GL_RGB5_A1 &&
1533 colorbufferFormat != GL_RGBA8_OES)
1534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001535 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001536 }
1537 break;
1538 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001539 case GL_RGB:
1540 if (colorbufferFormat != GL_RGB565 &&
1541 colorbufferFormat != GL_RGB8_OES &&
1542 colorbufferFormat != GL_RGBA4 &&
1543 colorbufferFormat != GL_RGB5_A1 &&
1544 colorbufferFormat != GL_RGBA8_OES)
1545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001546 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001547 }
1548 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001549 case GL_LUMINANCE_ALPHA:
1550 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001551 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001552 colorbufferFormat != GL_RGB5_A1 &&
1553 colorbufferFormat != GL_RGBA8_OES)
1554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001555 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001556 }
1557 break;
1558 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1559 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001560 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1561 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001562 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001563 case GL_DEPTH_COMPONENT:
1564 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001567 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001568 }
1569
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001570 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001571 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001572 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001573
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574 catch(std::bad_alloc&)
1575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577 }
1578}
1579
1580GLuint __stdcall glCreateProgram(void)
1581{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001582 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001583
1584 try
1585 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001586 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001587
1588 if (context)
1589 {
1590 return context->createProgram();
1591 }
1592 }
1593 catch(std::bad_alloc&)
1594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001595 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001596 }
1597
1598 return 0;
1599}
1600
1601GLuint __stdcall glCreateShader(GLenum type)
1602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001603 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001604
1605 try
1606 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001608
1609 if (context)
1610 {
1611 switch (type)
1612 {
1613 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001614 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001615 return context->createShader(type);
1616 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001617 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001618 }
1619 }
1620 }
1621 catch(std::bad_alloc&)
1622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001623 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001624 }
1625
1626 return 0;
1627}
1628
1629void __stdcall glCullFace(GLenum mode)
1630{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001631 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001632
1633 try
1634 {
1635 switch (mode)
1636 {
1637 case GL_FRONT:
1638 case GL_BACK:
1639 case GL_FRONT_AND_BACK:
1640 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001641 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001642
1643 if (context)
1644 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001645 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646 }
1647 }
1648 break;
1649 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001650 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001651 }
1652 }
1653 catch(std::bad_alloc&)
1654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001655 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001656 }
1657}
1658
1659void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1660{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001661 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001662
1663 try
1664 {
1665 if (n < 0)
1666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001667 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001668 }
1669
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001670 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001671
1672 if (context)
1673 {
1674 for (int i = 0; i < n; i++)
1675 {
1676 context->deleteBuffer(buffers[i]);
1677 }
1678 }
1679 }
1680 catch(std::bad_alloc&)
1681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001682 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 }
1684}
1685
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001686void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1687{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001688 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001689
1690 try
1691 {
1692 if (n < 0)
1693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001694 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001695 }
1696
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001697 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001698
1699 if (context)
1700 {
1701 for (int i = 0; i < n; i++)
1702 {
1703 context->deleteFence(fences[i]);
1704 }
1705 }
1706 }
1707 catch(std::bad_alloc&)
1708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001709 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001710 }
1711}
1712
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1714{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001715 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001716
1717 try
1718 {
1719 if (n < 0)
1720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001721 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001722 }
1723
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001724 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001725
1726 if (context)
1727 {
1728 for (int i = 0; i < n; i++)
1729 {
1730 if (framebuffers[i] != 0)
1731 {
1732 context->deleteFramebuffer(framebuffers[i]);
1733 }
1734 }
1735 }
1736 }
1737 catch(std::bad_alloc&)
1738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001740 }
1741}
1742
1743void __stdcall glDeleteProgram(GLuint program)
1744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001745 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001746
1747 try
1748 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001749 if (program == 0)
1750 {
1751 return;
1752 }
1753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001755
1756 if (context)
1757 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001758 if (!context->getProgram(program))
1759 {
1760 if(context->getShader(program))
1761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001762 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001763 }
1764 else
1765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001767 }
1768 }
1769
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770 context->deleteProgram(program);
1771 }
1772 }
1773 catch(std::bad_alloc&)
1774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001776 }
1777}
1778
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001779void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1780{
1781 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1782
1783 try
1784 {
1785 if (n < 0)
1786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001788 }
1789
1790 gl::Context *context = gl::getNonLostContext();
1791
1792 if (context)
1793 {
1794 for (int i = 0; i < n; i++)
1795 {
1796 context->deleteQuery(ids[i]);
1797 }
1798 }
1799 }
1800 catch(std::bad_alloc&)
1801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001802 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001803 }
1804}
1805
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001806void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1807{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001808 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001809
1810 try
1811 {
1812 if (n < 0)
1813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001815 }
1816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001818
1819 if (context)
1820 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001821 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001822 {
1823 context->deleteRenderbuffer(renderbuffers[i]);
1824 }
1825 }
1826 }
1827 catch(std::bad_alloc&)
1828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001830 }
1831}
1832
1833void __stdcall glDeleteShader(GLuint shader)
1834{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001835 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001836
1837 try
1838 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001839 if (shader == 0)
1840 {
1841 return;
1842 }
1843
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001844 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001845
1846 if (context)
1847 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001848 if (!context->getShader(shader))
1849 {
1850 if(context->getProgram(shader))
1851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001852 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001853 }
1854 else
1855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001856 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001857 }
1858 }
1859
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001860 context->deleteShader(shader);
1861 }
1862 }
1863 catch(std::bad_alloc&)
1864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001866 }
1867}
1868
1869void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001871 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872
1873 try
1874 {
1875 if (n < 0)
1876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001877 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878 }
1879
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001880 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001881
1882 if (context)
1883 {
1884 for (int i = 0; i < n; i++)
1885 {
1886 if (textures[i] != 0)
1887 {
1888 context->deleteTexture(textures[i]);
1889 }
1890 }
1891 }
1892 }
1893 catch(std::bad_alloc&)
1894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001895 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896 }
1897}
1898
1899void __stdcall glDepthFunc(GLenum func)
1900{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001901 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001902
1903 try
1904 {
1905 switch (func)
1906 {
1907 case GL_NEVER:
1908 case GL_ALWAYS:
1909 case GL_LESS:
1910 case GL_LEQUAL:
1911 case GL_EQUAL:
1912 case GL_GREATER:
1913 case GL_GEQUAL:
1914 case GL_NOTEQUAL:
1915 break;
1916 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918 }
1919
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921
1922 if (context)
1923 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001924 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925 }
1926 }
1927 catch(std::bad_alloc&)
1928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001930 }
1931}
1932
1933void __stdcall glDepthMask(GLboolean flag)
1934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001935 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001936
1937 try
1938 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001939 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940
1941 if (context)
1942 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001943 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944 }
1945 }
1946 catch(std::bad_alloc&)
1947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001948 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949 }
1950}
1951
1952void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1953{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001954 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001955
1956 try
1957 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001958 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959
1960 if (context)
1961 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001962 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001963 }
1964 }
1965 catch(std::bad_alloc&)
1966 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001967 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968 }
1969}
1970
1971void __stdcall glDetachShader(GLuint program, GLuint shader)
1972{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001973 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001974
1975 try
1976 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001977 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001978
1979 if (context)
1980 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001981
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982 gl::Program *programObject = context->getProgram(program);
1983 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001984
1985 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001987 gl::Shader *shaderByProgramHandle;
1988 shaderByProgramHandle = context->getShader(program);
1989 if (!shaderByProgramHandle)
1990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001991 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001992 }
1993 else
1994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001995 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001996 }
1997 }
1998
1999 if (!shaderObject)
2000 {
2001 gl::Program *programByShaderHandle = context->getProgram(shader);
2002 if (!programByShaderHandle)
2003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002004 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002005 }
2006 else
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002009 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002010 }
2011
2012 if (!programObject->detachShader(shaderObject))
2013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002014 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002016 }
2017 }
2018 catch(std::bad_alloc&)
2019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021 }
2022}
2023
2024void __stdcall glDisable(GLenum cap)
2025{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002026 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002027
2028 try
2029 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002030 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031
2032 if (context)
2033 {
2034 switch (cap)
2035 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002036 case GL_CULL_FACE: context->setCullFace(false); break;
2037 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2038 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2039 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2040 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2041 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2042 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2043 case GL_BLEND: context->setBlend(false); break;
2044 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002045 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002046 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 }
2048 }
2049 }
2050 catch(std::bad_alloc&)
2051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002052 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053 }
2054}
2055
2056void __stdcall glDisableVertexAttribArray(GLuint index)
2057{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002058 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002059
2060 try
2061 {
2062 if (index >= gl::MAX_VERTEX_ATTRIBS)
2063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002064 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002065 }
2066
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068
2069 if (context)
2070 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002071 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072 }
2073 }
2074 catch(std::bad_alloc&)
2075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002076 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002077 }
2078}
2079
2080void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2081{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002082 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002083
2084 try
2085 {
2086 if (count < 0 || first < 0)
2087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002088 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002089 }
2090
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092
2093 if (context)
2094 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002095 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096 }
2097 }
2098 catch(std::bad_alloc&)
2099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002100 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002101 }
2102}
2103
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002104void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2105{
2106 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2107
2108 try
2109 {
2110 if (count < 0 || first < 0 || primcount < 0)
2111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002112 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002113 }
2114
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002115 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002116 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002117 gl::Context *context = gl::getNonLostContext();
2118
2119 if (context)
2120 {
2121 context->drawArrays(mode, first, count, primcount);
2122 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002123 }
2124 }
2125 catch(std::bad_alloc&)
2126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002127 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002128 }
2129}
2130
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002131void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002133 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 +00002134 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135
2136 try
2137 {
2138 if (count < 0)
2139 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002140 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141 }
2142
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002143 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002144
2145 if (context)
2146 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002147 switch (type)
2148 {
2149 case GL_UNSIGNED_BYTE:
2150 case GL_UNSIGNED_SHORT:
2151 break;
2152 case GL_UNSIGNED_INT:
2153 if (!context->supports32bitIndices())
2154 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002155 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002156 }
2157 break;
2158 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002159 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002160 }
2161
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002162 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002163 }
2164 }
2165 catch(std::bad_alloc&)
2166 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002167 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002168 }
2169}
2170
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002171void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2172{
2173 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2174 mode, count, type, indices, primcount);
2175
2176 try
2177 {
2178 if (count < 0 || primcount < 0)
2179 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002180 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002181 }
2182
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002183 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002184 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002185 gl::Context *context = gl::getNonLostContext();
2186
2187 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002188 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002189 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002190 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002191 case GL_UNSIGNED_BYTE:
2192 case GL_UNSIGNED_SHORT:
2193 break;
2194 case GL_UNSIGNED_INT:
2195 if (!context->supports32bitIndices())
2196 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002197 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002198 }
2199 break;
2200 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002201 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002202 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002203
2204 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002205 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002206 }
2207 }
2208 catch(std::bad_alloc&)
2209 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002210 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002211 }
2212}
2213
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002214void __stdcall glEnable(GLenum cap)
2215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002216 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002217
2218 try
2219 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002220 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002221
2222 if (context)
2223 {
2224 switch (cap)
2225 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002226 case GL_CULL_FACE: context->setCullFace(true); break;
2227 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2228 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2229 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2230 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2231 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2232 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2233 case GL_BLEND: context->setBlend(true); break;
2234 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002235 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002236 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002237 }
2238 }
2239 }
2240 catch(std::bad_alloc&)
2241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002242 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243 }
2244}
2245
2246void __stdcall glEnableVertexAttribArray(GLuint index)
2247{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002248 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249
2250 try
2251 {
2252 if (index >= gl::MAX_VERTEX_ATTRIBS)
2253 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002254 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255 }
2256
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002257 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258
2259 if (context)
2260 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002261 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262 }
2263 }
2264 catch(std::bad_alloc&)
2265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002267 }
2268}
2269
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002270void __stdcall glEndQueryEXT(GLenum target)
2271{
2272 EVENT("GLenum target = 0x%X)", target);
2273
2274 try
2275 {
2276 switch (target)
2277 {
2278 case GL_ANY_SAMPLES_PASSED_EXT:
2279 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2280 break;
2281 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002282 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002283 }
2284
2285 gl::Context *context = gl::getNonLostContext();
2286
2287 if (context)
2288 {
2289 context->endQuery(target);
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.com86bdb822012-01-20 18:24:39 +00002295 }
2296}
2297
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002298void __stdcall glFinishFenceNV(GLuint fence)
2299{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002300 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002301
2302 try
2303 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002304 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002305
2306 if (context)
2307 {
2308 gl::Fence* fenceObject = context->getFence(fence);
2309
2310 if (fenceObject == NULL)
2311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002312 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002313 }
2314
2315 fenceObject->finishFence();
2316 }
2317 }
2318 catch(std::bad_alloc&)
2319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002320 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002321 }
2322}
2323
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002324void __stdcall glFinish(void)
2325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002326 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327
2328 try
2329 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002330 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002331
2332 if (context)
2333 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002334 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335 }
2336 }
2337 catch(std::bad_alloc&)
2338 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002339 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340 }
2341}
2342
2343void __stdcall glFlush(void)
2344{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002345 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002346
2347 try
2348 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350
2351 if (context)
2352 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002353 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354 }
2355 }
2356 catch(std::bad_alloc&)
2357 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002358 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002359 }
2360}
2361
2362void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2363{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002364 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002365 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002366
2367 try
2368 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002369 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002370 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002372 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373 }
2374
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002375 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376
2377 if (context)
2378 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002379 gl::Framebuffer *framebuffer = NULL;
2380 GLuint framebufferHandle = 0;
2381 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2382 {
2383 framebuffer = context->getReadFramebuffer();
2384 framebufferHandle = context->getReadFramebufferHandle();
2385 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002386 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002387 {
2388 framebuffer = context->getDrawFramebuffer();
2389 framebufferHandle = context->getDrawFramebufferHandle();
2390 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002391
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002392 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002394 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395 }
2396
2397 switch (attachment)
2398 {
2399 case GL_COLOR_ATTACHMENT0:
2400 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2401 break;
2402 case GL_DEPTH_ATTACHMENT:
2403 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2404 break;
2405 case GL_STENCIL_ATTACHMENT:
2406 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2407 break;
2408 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002409 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 }
2411 }
2412 }
2413 catch(std::bad_alloc&)
2414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002415 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002416 }
2417}
2418
2419void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2420{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002421 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002422 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423
2424 try
2425 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002426 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002428 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002429 }
2430
2431 switch (attachment)
2432 {
2433 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002434 case GL_DEPTH_ATTACHMENT:
2435 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 break;
2437 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439 }
2440
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002441 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002442
2443 if (context)
2444 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002445 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002447 textarget = GL_NONE;
2448 }
2449 else
2450 {
2451 gl::Texture *tex = context->getTexture(texture);
2452
2453 if (tex == NULL)
2454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002455 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002456 }
2457
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002458 switch (textarget)
2459 {
2460 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002461 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002462 if (tex->getTarget() != GL_TEXTURE_2D)
2463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002464 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002465 }
2466 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002467 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002469 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002470 }
2471 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002473
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002476 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002477 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002479 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002480 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002481 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002483 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002484 }
2485 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002486 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002488 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002489 }
2490 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002491 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002492
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002493 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002494 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002495 }
2496
2497 if (level != 0)
2498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002499 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500 }
2501 }
2502
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002503 gl::Framebuffer *framebuffer = NULL;
2504 GLuint framebufferHandle = 0;
2505 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2506 {
2507 framebuffer = context->getReadFramebuffer();
2508 framebufferHandle = context->getReadFramebufferHandle();
2509 }
2510 else
2511 {
2512 framebuffer = context->getDrawFramebuffer();
2513 framebufferHandle = context->getDrawFramebufferHandle();
2514 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002515
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002516 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002518 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519 }
2520
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002521 switch (attachment)
2522 {
2523 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2524 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2525 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2526 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527 }
2528 }
2529 catch(std::bad_alloc&)
2530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002531 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002532 }
2533}
2534
2535void __stdcall glFrontFace(GLenum mode)
2536{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002537 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002538
2539 try
2540 {
2541 switch (mode)
2542 {
2543 case GL_CW:
2544 case GL_CCW:
2545 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002546 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002547
2548 if (context)
2549 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002550 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002551 }
2552 }
2553 break;
2554 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002556 }
2557 }
2558 catch(std::bad_alloc&)
2559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002560 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561 }
2562}
2563
2564void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2565{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002566 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567
2568 try
2569 {
2570 if (n < 0)
2571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002572 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002573 }
2574
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002575 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576
2577 if (context)
2578 {
2579 for (int i = 0; i < n; i++)
2580 {
2581 buffers[i] = context->createBuffer();
2582 }
2583 }
2584 }
2585 catch(std::bad_alloc&)
2586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002587 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588 }
2589}
2590
2591void __stdcall glGenerateMipmap(GLenum target)
2592{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002593 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002594
2595 try
2596 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002597 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002598
2599 if (context)
2600 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002601 switch (target)
2602 {
2603 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002604 {
2605 gl::Texture2D *tex2d = context->getTexture2D();
2606
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002607 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002609 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002610 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002611 if (tex2d->isDepth(0))
2612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002614 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002615
2616 tex2d->generateMipmaps();
2617 break;
2618 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002619
2620 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002621 {
2622 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2623
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002624 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002626 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002627 }
2628
2629 texcube->generateMipmaps();
2630 break;
2631 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002632
2633 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002635 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002636 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637 }
2638 catch(std::bad_alloc&)
2639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002641 }
2642}
2643
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002644void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002646 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002647
2648 try
2649 {
2650 if (n < 0)
2651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002652 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002653 }
2654
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002655 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002656
2657 if (context)
2658 {
2659 for (int i = 0; i < n; i++)
2660 {
2661 fences[i] = context->createFence();
2662 }
2663 }
2664 }
2665 catch(std::bad_alloc&)
2666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002667 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002668 }
2669}
2670
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002671void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2672{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002673 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674
2675 try
2676 {
2677 if (n < 0)
2678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680 }
2681
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002682 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002683
2684 if (context)
2685 {
2686 for (int i = 0; i < n; i++)
2687 {
2688 framebuffers[i] = context->createFramebuffer();
2689 }
2690 }
2691 }
2692 catch(std::bad_alloc&)
2693 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002694 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002695 }
2696}
2697
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002698void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2699{
2700 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2701
2702 try
2703 {
2704 if (n < 0)
2705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002707 }
2708
2709 gl::Context *context = gl::getNonLostContext();
2710
2711 if (context)
2712 {
2713 for (int i = 0; i < n; i++)
2714 {
2715 ids[i] = context->createQuery();
2716 }
2717 }
2718 }
2719 catch(std::bad_alloc&)
2720 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002721 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002722 }
2723}
2724
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2726{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002727 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728
2729 try
2730 {
2731 if (n < 0)
2732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002734 }
2735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002737
2738 if (context)
2739 {
2740 for (int i = 0; i < n; i++)
2741 {
2742 renderbuffers[i] = context->createRenderbuffer();
2743 }
2744 }
2745 }
2746 catch(std::bad_alloc&)
2747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002749 }
2750}
2751
2752void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2753{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002754 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002755
2756 try
2757 {
2758 if (n < 0)
2759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002761 }
2762
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002764
2765 if (context)
2766 {
2767 for (int i = 0; i < n; i++)
2768 {
2769 textures[i] = context->createTexture();
2770 }
2771 }
2772 }
2773 catch(std::bad_alloc&)
2774 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002775 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002776 }
2777}
2778
daniel@transgaming.com85423182010-04-22 13:35:27 +00002779void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002780{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002781 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002782 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002783 program, index, bufsize, length, size, type, name);
2784
2785 try
2786 {
2787 if (bufsize < 0)
2788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002789 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002790 }
2791
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002792 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002793
2794 if (context)
2795 {
2796 gl::Program *programObject = context->getProgram(program);
2797
2798 if (!programObject)
2799 {
2800 if (context->getShader(program))
2801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002802 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002803 }
2804 else
2805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002806 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002807 }
2808 }
2809
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002810 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002813 }
2814
2815 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2816 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002817 }
2818 catch(std::bad_alloc&)
2819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 }
2822}
2823
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002824void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002826 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002827 "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 +00002828 program, index, bufsize, length, size, type, name);
2829
2830 try
2831 {
2832 if (bufsize < 0)
2833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002834 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002835 }
2836
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002837 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002838
2839 if (context)
2840 {
2841 gl::Program *programObject = context->getProgram(program);
2842
2843 if (!programObject)
2844 {
2845 if (context->getShader(program))
2846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002847 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002848 }
2849 else
2850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002852 }
2853 }
2854
2855 if (index >= (GLuint)programObject->getActiveUniformCount())
2856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002857 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002858 }
2859
2860 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2861 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002862 }
2863 catch(std::bad_alloc&)
2864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002865 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866 }
2867}
2868
2869void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002871 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 +00002872 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873
2874 try
2875 {
2876 if (maxcount < 0)
2877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002878 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002879 }
2880
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002881 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002882
2883 if (context)
2884 {
2885 gl::Program *programObject = context->getProgram(program);
2886
2887 if (!programObject)
2888 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002889 if (context->getShader(program))
2890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002891 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002892 }
2893 else
2894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002895 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002896 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002897 }
2898
2899 return programObject->getAttachedShaders(maxcount, count, shaders);
2900 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002901 }
2902 catch(std::bad_alloc&)
2903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002905 }
2906}
2907
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002908int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002910 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002911
2912 try
2913 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915
2916 if (context)
2917 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002918
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919 gl::Program *programObject = context->getProgram(program);
2920
2921 if (!programObject)
2922 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002923 if (context->getShader(program))
2924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002925 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002926 }
2927 else
2928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002930 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002931 }
2932
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002933 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002934 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002936 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002937 }
2938
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002939 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 }
2941 }
2942 catch(std::bad_alloc&)
2943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002944 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002945 }
2946
2947 return -1;
2948}
2949
2950void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002952 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953
2954 try
2955 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002956 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002957
2958 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002959 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002960 if (!(context->getBooleanv(pname, params)))
2961 {
2962 GLenum nativeType;
2963 unsigned int numParams = 0;
2964 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002965 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002966
2967 if (numParams == 0)
2968 return; // it is known that the pname is valid, but there are no parameters to return
2969
2970 if (nativeType == GL_FLOAT)
2971 {
2972 GLfloat *floatParams = NULL;
2973 floatParams = new GLfloat[numParams];
2974
2975 context->getFloatv(pname, floatParams);
2976
2977 for (unsigned int i = 0; i < numParams; ++i)
2978 {
2979 if (floatParams[i] == 0.0f)
2980 params[i] = GL_FALSE;
2981 else
2982 params[i] = GL_TRUE;
2983 }
2984
2985 delete [] floatParams;
2986 }
2987 else if (nativeType == GL_INT)
2988 {
2989 GLint *intParams = NULL;
2990 intParams = new GLint[numParams];
2991
2992 context->getIntegerv(pname, intParams);
2993
2994 for (unsigned int i = 0; i < numParams; ++i)
2995 {
2996 if (intParams[i] == 0)
2997 params[i] = GL_FALSE;
2998 else
2999 params[i] = GL_TRUE;
3000 }
3001
3002 delete [] intParams;
3003 }
3004 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003005 }
3006 }
3007 catch(std::bad_alloc&)
3008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003010 }
3011}
3012
3013void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3014{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003015 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 +00003016
3017 try
3018 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003019 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003020
3021 if (context)
3022 {
3023 gl::Buffer *buffer;
3024
3025 switch (target)
3026 {
3027 case GL_ARRAY_BUFFER:
3028 buffer = context->getArrayBuffer();
3029 break;
3030 case GL_ELEMENT_ARRAY_BUFFER:
3031 buffer = context->getElementArrayBuffer();
3032 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003033 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003034 }
3035
3036 if (!buffer)
3037 {
3038 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003039 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003040 }
3041
3042 switch (pname)
3043 {
3044 case GL_BUFFER_USAGE:
3045 *params = buffer->usage();
3046 break;
3047 case GL_BUFFER_SIZE:
3048 *params = buffer->size();
3049 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003050 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003051 }
3052 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003053 }
3054 catch(std::bad_alloc&)
3055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 }
3058}
3059
3060GLenum __stdcall glGetError(void)
3061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003062 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063
3064 gl::Context *context = gl::getContext();
3065
3066 if (context)
3067 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003068 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003069 }
3070
3071 return GL_NO_ERROR;
3072}
3073
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003074void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003076 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003077
3078 try
3079 {
3080
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003081 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003082
3083 if (context)
3084 {
3085 gl::Fence *fenceObject = context->getFence(fence);
3086
3087 if (fenceObject == NULL)
3088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003089 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003090 }
3091
3092 fenceObject->getFenceiv(pname, params);
3093 }
3094 }
3095 catch(std::bad_alloc&)
3096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003097 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003098 }
3099}
3100
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3102{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003103 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104
3105 try
3106 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003107 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003108
3109 if (context)
3110 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003111 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003112 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003113 GLenum nativeType;
3114 unsigned int numParams = 0;
3115 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003116 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003117
3118 if (numParams == 0)
3119 return; // it is known that the pname is valid, but that there are no parameters to return.
3120
3121 if (nativeType == GL_BOOL)
3122 {
3123 GLboolean *boolParams = NULL;
3124 boolParams = new GLboolean[numParams];
3125
3126 context->getBooleanv(pname, boolParams);
3127
3128 for (unsigned int i = 0; i < numParams; ++i)
3129 {
3130 if (boolParams[i] == GL_FALSE)
3131 params[i] = 0.0f;
3132 else
3133 params[i] = 1.0f;
3134 }
3135
3136 delete [] boolParams;
3137 }
3138 else if (nativeType == GL_INT)
3139 {
3140 GLint *intParams = NULL;
3141 intParams = new GLint[numParams];
3142
3143 context->getIntegerv(pname, intParams);
3144
3145 for (unsigned int i = 0; i < numParams; ++i)
3146 {
3147 params[i] = (GLfloat)intParams[i];
3148 }
3149
3150 delete [] intParams;
3151 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003152 }
3153 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003154 }
3155 catch(std::bad_alloc&)
3156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003157 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003158 }
3159}
3160
3161void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003163 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 +00003164 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003165
3166 try
3167 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003168 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169
3170 if (context)
3171 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003172 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003174 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003175 }
3176
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003177 gl::Framebuffer *framebuffer = NULL;
3178 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3179 {
3180 if(context->getReadFramebufferHandle() == 0)
3181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003182 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003183 }
3184
3185 framebuffer = context->getReadFramebuffer();
3186 }
3187 else
3188 {
3189 if (context->getDrawFramebufferHandle() == 0)
3190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003191 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003192 }
3193
3194 framebuffer = context->getDrawFramebuffer();
3195 }
3196
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003197 GLenum attachmentType;
3198 GLuint attachmentHandle;
3199 switch (attachment)
3200 {
3201 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003202 attachmentType = framebuffer->getColorbufferType();
3203 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003204 break;
3205 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003206 attachmentType = framebuffer->getDepthbufferType();
3207 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003208 break;
3209 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003210 attachmentType = framebuffer->getStencilbufferType();
3211 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003212 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003213 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003214 }
3215
3216 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003217 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003218 {
3219 attachmentObjectType = attachmentType;
3220 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003221 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003222 {
3223 attachmentObjectType = GL_TEXTURE;
3224 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003225 else
3226 {
3227 UNREACHABLE();
3228 return;
3229 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003230
3231 switch (pname)
3232 {
3233 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3234 *params = attachmentObjectType;
3235 break;
3236 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3237 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3238 {
3239 *params = attachmentHandle;
3240 }
3241 else
3242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003243 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003244 }
3245 break;
3246 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3247 if (attachmentObjectType == GL_TEXTURE)
3248 {
3249 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3250 }
3251 else
3252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003253 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003254 }
3255 break;
3256 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3257 if (attachmentObjectType == GL_TEXTURE)
3258 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003259 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003260 {
3261 *params = attachmentType;
3262 }
3263 else
3264 {
3265 *params = 0;
3266 }
3267 }
3268 else
3269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003270 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003271 }
3272 break;
3273 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003275 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276 }
3277 }
3278 catch(std::bad_alloc&)
3279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003280 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003281 }
3282}
3283
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003284GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3285{
3286 EVENT("()");
3287
3288 try
3289 {
3290 gl::Context *context = gl::getContext();
3291
3292 if (context)
3293 {
3294 return context->getResetStatus();
3295 }
3296
3297 return GL_NO_ERROR;
3298 }
3299 catch(std::bad_alloc&)
3300 {
3301 return GL_OUT_OF_MEMORY;
3302 }
3303}
3304
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003305void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3306{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003307 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308
3309 try
3310 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003311 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312
3313 if (context)
3314 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003315 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003317 GLenum nativeType;
3318 unsigned int numParams = 0;
3319 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003320 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003321
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003322 if (numParams == 0)
3323 return; // it is known that pname is valid, but there are no parameters to return
3324
3325 if (nativeType == GL_BOOL)
3326 {
3327 GLboolean *boolParams = NULL;
3328 boolParams = new GLboolean[numParams];
3329
3330 context->getBooleanv(pname, boolParams);
3331
3332 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003333 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003334 if (boolParams[i] == GL_FALSE)
3335 params[i] = 0;
3336 else
3337 params[i] = 1;
3338 }
3339
3340 delete [] boolParams;
3341 }
3342 else if (nativeType == GL_FLOAT)
3343 {
3344 GLfloat *floatParams = NULL;
3345 floatParams = new GLfloat[numParams];
3346
3347 context->getFloatv(pname, floatParams);
3348
3349 for (unsigned int i = 0; i < numParams; ++i)
3350 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003351 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 +00003352 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003353 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003355 else
3356 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 +00003357 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003359 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003360 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003361 }
3362 }
3363 }
3364 catch(std::bad_alloc&)
3365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367 }
3368}
3369
3370void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003372 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003373
3374 try
3375 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003376 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003377
3378 if (context)
3379 {
3380 gl::Program *programObject = context->getProgram(program);
3381
3382 if (!programObject)
3383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003384 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385 }
3386
3387 switch (pname)
3388 {
3389 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003390 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391 return;
3392 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003393 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003394 return;
3395 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003396 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397 return;
3398 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003399 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 return;
3401 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003402 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 return;
3404 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003405 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 return;
3407 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003408 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 return;
3410 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003411 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 return;
3413 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003414 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003415 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003416 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003417 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003418 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003419 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421 }
3422 }
3423 }
3424 catch(std::bad_alloc&)
3425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003426 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003427 }
3428}
3429
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003430void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003431{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003432 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 +00003433 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434
3435 try
3436 {
3437 if (bufsize < 0)
3438 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003439 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003440 }
3441
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003442 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003443
3444 if (context)
3445 {
3446 gl::Program *programObject = context->getProgram(program);
3447
3448 if (!programObject)
3449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003450 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003451 }
3452
3453 programObject->getInfoLog(bufsize, length, infolog);
3454 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003455 }
3456 catch(std::bad_alloc&)
3457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003458 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
3460}
3461
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003462void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3463{
3464 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3465
3466 try
3467 {
3468 switch (pname)
3469 {
3470 case GL_CURRENT_QUERY_EXT:
3471 break;
3472 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003473 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003474 }
3475
3476 gl::Context *context = gl::getNonLostContext();
3477
3478 if (context)
3479 {
3480 params[0] = context->getActiveQuery(target);
3481 }
3482 }
3483 catch(std::bad_alloc&)
3484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003485 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003486 }
3487}
3488
3489void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3490{
3491 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3492
3493 try
3494 {
3495 switch (pname)
3496 {
3497 case GL_QUERY_RESULT_EXT:
3498 case GL_QUERY_RESULT_AVAILABLE_EXT:
3499 break;
3500 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003501 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003502 }
3503 gl::Context *context = gl::getNonLostContext();
3504
3505 if (context)
3506 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003507 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3508
3509 if (!queryObject)
3510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003512 }
3513
3514 if (context->getActiveQuery(queryObject->getType()) == id)
3515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003517 }
3518
3519 switch(pname)
3520 {
3521 case GL_QUERY_RESULT_EXT:
3522 params[0] = queryObject->getResult();
3523 break;
3524 case GL_QUERY_RESULT_AVAILABLE_EXT:
3525 params[0] = queryObject->isResultAvailable();
3526 break;
3527 default:
3528 ASSERT(false);
3529 }
3530 }
3531 }
3532 catch(std::bad_alloc&)
3533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003535 }
3536}
3537
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003538void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003540 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 +00003541
3542 try
3543 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003544 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003545
3546 if (context)
3547 {
3548 if (target != GL_RENDERBUFFER)
3549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003551 }
3552
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003553 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003555 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003556 }
3557
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003558 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003559
3560 switch (pname)
3561 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003562 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3563 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3564 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3565 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3566 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3567 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3568 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3569 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3570 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003571 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003572 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003573 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003574 *params = renderbuffer->getSamples();
3575 }
3576 else
3577 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003578 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003579 }
3580 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003581 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003582 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003583 }
3584 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003585 }
3586 catch(std::bad_alloc&)
3587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003588 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003589 }
3590}
3591
3592void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3593{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003594 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003595
3596 try
3597 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003598 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599
3600 if (context)
3601 {
3602 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003603
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604 if (!shaderObject)
3605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003606 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003607 }
3608
3609 switch (pname)
3610 {
3611 case GL_SHADER_TYPE:
3612 *params = shaderObject->getType();
3613 return;
3614 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003615 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003616 return;
3617 case GL_COMPILE_STATUS:
3618 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3619 return;
3620 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003621 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622 return;
3623 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003624 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003626 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3627 *params = shaderObject->getTranslatedSourceLength();
3628 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003630 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003631 }
3632 }
3633 }
3634 catch(std::bad_alloc&)
3635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003636 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003637 }
3638}
3639
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003640void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003642 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 +00003643 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644
3645 try
3646 {
3647 if (bufsize < 0)
3648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003649 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003650 }
3651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003652 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003653
3654 if (context)
3655 {
3656 gl::Shader *shaderObject = context->getShader(shader);
3657
3658 if (!shaderObject)
3659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003660 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003661 }
3662
3663 shaderObject->getInfoLog(bufsize, length, infolog);
3664 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003665 }
3666 catch(std::bad_alloc&)
3667 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003668 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 }
3670}
3671
3672void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3673{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003674 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 +00003675 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003676
3677 try
3678 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003679 switch (shadertype)
3680 {
3681 case GL_VERTEX_SHADER:
3682 case GL_FRAGMENT_SHADER:
3683 break;
3684 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003686 }
3687
3688 switch (precisiontype)
3689 {
3690 case GL_LOW_FLOAT:
3691 case GL_MEDIUM_FLOAT:
3692 case GL_HIGH_FLOAT:
3693 // Assume IEEE 754 precision
3694 range[0] = 127;
3695 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003696 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003697 break;
3698 case GL_LOW_INT:
3699 case GL_MEDIUM_INT:
3700 case GL_HIGH_INT:
3701 // Some (most) hardware only supports single-precision floating-point numbers,
3702 // which can accurately represent integers up to +/-16777216
3703 range[0] = 24;
3704 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003705 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003706 break;
3707 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003708 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003709 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003710 }
3711 catch(std::bad_alloc&)
3712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003713 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003714 }
3715}
3716
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003717void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003719 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 +00003720 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003721
3722 try
3723 {
3724 if (bufsize < 0)
3725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003726 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003727 }
3728
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003729 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003730
3731 if (context)
3732 {
3733 gl::Shader *shaderObject = context->getShader(shader);
3734
3735 if (!shaderObject)
3736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003737 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003738 }
3739
3740 shaderObject->getSource(bufsize, length, source);
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
zmo@google.coma574f782011-10-03 21:45:23 +00003749void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3750{
3751 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3752 shader, bufsize, length, source);
3753
3754 try
3755 {
3756 if (bufsize < 0)
3757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003758 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003759 }
3760
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003761 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003762
3763 if (context)
3764 {
3765 gl::Shader *shaderObject = context->getShader(shader);
3766
3767 if (!shaderObject)
3768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003769 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003770 }
3771
3772 shaderObject->getTranslatedSource(bufsize, length, source);
3773 }
3774 }
3775 catch(std::bad_alloc&)
3776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003777 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003778 }
3779}
3780
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003781const GLubyte* __stdcall glGetString(GLenum name)
3782{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003783 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784
3785 try
3786 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003787 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003788
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789 switch (name)
3790 {
3791 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003792 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003794 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003795 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003796 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003798 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003799 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003800 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003802 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803 }
3804 }
3805 catch(std::bad_alloc&)
3806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003807 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003808 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003809}
3810
3811void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3812{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003813 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 +00003814
3815 try
3816 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003818
3819 if (context)
3820 {
3821 gl::Texture *texture;
3822
3823 switch (target)
3824 {
3825 case GL_TEXTURE_2D:
3826 texture = context->getTexture2D();
3827 break;
3828 case GL_TEXTURE_CUBE_MAP:
3829 texture = context->getTextureCubeMap();
3830 break;
3831 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003832 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003833 }
3834
3835 switch (pname)
3836 {
3837 case GL_TEXTURE_MAG_FILTER:
3838 *params = (GLfloat)texture->getMagFilter();
3839 break;
3840 case GL_TEXTURE_MIN_FILTER:
3841 *params = (GLfloat)texture->getMinFilter();
3842 break;
3843 case GL_TEXTURE_WRAP_S:
3844 *params = (GLfloat)texture->getWrapS();
3845 break;
3846 case GL_TEXTURE_WRAP_T:
3847 *params = (GLfloat)texture->getWrapT();
3848 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003849 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3850 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3851 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003852 case GL_TEXTURE_USAGE_ANGLE:
3853 *params = (GLfloat)texture->getUsage();
3854 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003855 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3856 if (!context->supportsTextureFilterAnisotropy())
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003859 }
3860 *params = (GLfloat)texture->getMaxAnisotropy();
3861 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003862 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003864 }
3865 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003866 }
3867 catch(std::bad_alloc&)
3868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870 }
3871}
3872
3873void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003875 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 +00003876
3877 try
3878 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003879 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003880
3881 if (context)
3882 {
3883 gl::Texture *texture;
3884
3885 switch (target)
3886 {
3887 case GL_TEXTURE_2D:
3888 texture = context->getTexture2D();
3889 break;
3890 case GL_TEXTURE_CUBE_MAP:
3891 texture = context->getTextureCubeMap();
3892 break;
3893 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003894 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003895 }
3896
3897 switch (pname)
3898 {
3899 case GL_TEXTURE_MAG_FILTER:
3900 *params = texture->getMagFilter();
3901 break;
3902 case GL_TEXTURE_MIN_FILTER:
3903 *params = texture->getMinFilter();
3904 break;
3905 case GL_TEXTURE_WRAP_S:
3906 *params = texture->getWrapS();
3907 break;
3908 case GL_TEXTURE_WRAP_T:
3909 *params = texture->getWrapT();
3910 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003911 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3912 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3913 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003914 case GL_TEXTURE_USAGE_ANGLE:
3915 *params = texture->getUsage();
3916 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003917 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3918 if (!context->supportsTextureFilterAnisotropy())
3919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003921 }
3922 *params = (GLint)texture->getMaxAnisotropy();
3923 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003924 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003925 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003926 }
3927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003928 }
3929 catch(std::bad_alloc&)
3930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003931 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933}
3934
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003935void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3936{
3937 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3938 program, location, bufSize, params);
3939
3940 try
3941 {
3942 if (bufSize < 0)
3943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003944 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003945 }
3946
3947 gl::Context *context = gl::getNonLostContext();
3948
3949 if (context)
3950 {
3951 if (program == 0)
3952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003953 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003954 }
3955
3956 gl::Program *programObject = context->getProgram(program);
3957
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003958 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003961 }
3962
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003963 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3964 if (!programBinary)
3965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003966 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003967 }
3968
3969 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003972 }
3973 }
3974 }
3975 catch(std::bad_alloc&)
3976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003977 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003978 }
3979}
3980
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3982{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003983 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984
3985 try
3986 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003987 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003988
3989 if (context)
3990 {
3991 if (program == 0)
3992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003993 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003994 }
3995
3996 gl::Program *programObject = context->getProgram(program);
3997
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003998 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004000 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004001 }
4002
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004003 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4004 if (!programBinary)
4005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004006 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004007 }
4008
4009 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004011 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004012 }
4013 }
4014 }
4015 catch(std::bad_alloc&)
4016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004018 }
4019}
4020
4021void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4022{
4023 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4024 program, location, bufSize, params);
4025
4026 try
4027 {
4028 if (bufSize < 0)
4029 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004030 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004031 }
4032
4033 gl::Context *context = gl::getNonLostContext();
4034
4035 if (context)
4036 {
4037 if (program == 0)
4038 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004039 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004040 }
4041
4042 gl::Program *programObject = context->getProgram(program);
4043
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004044 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004047 }
4048
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004049 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4050 if (!programBinary)
4051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004052 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004053 }
4054
4055 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004057 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004058 }
4059 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004060 }
4061 catch(std::bad_alloc&)
4062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004063 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004064 }
4065}
4066
4067void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4068{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004069 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004070
4071 try
4072 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004073 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004074
4075 if (context)
4076 {
4077 if (program == 0)
4078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004080 }
4081
4082 gl::Program *programObject = context->getProgram(program);
4083
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004084 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004086 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004087 }
4088
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004089 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4090 if (!programBinary)
4091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004092 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004093 }
4094
4095 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004097 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004098 }
4099 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004100 }
4101 catch(std::bad_alloc&)
4102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004103 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004104 }
4105}
4106
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004107int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004109 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004110
4111 try
4112 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004113 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004114
4115 if (strstr(name, "gl_") == name)
4116 {
4117 return -1;
4118 }
4119
4120 if (context)
4121 {
4122 gl::Program *programObject = context->getProgram(program);
4123
4124 if (!programObject)
4125 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004126 if (context->getShader(program))
4127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004128 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004129 }
4130 else
4131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004132 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004133 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134 }
4135
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004136 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004137 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004139 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004140 }
4141
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004142 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004143 }
4144 }
4145 catch(std::bad_alloc&)
4146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004147 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004148 }
4149
4150 return -1;
4151}
4152
4153void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4154{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004155 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004156
4157 try
4158 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004159 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004160
daniel@transgaming.come0078962010-04-15 20:45:08 +00004161 if (context)
4162 {
4163 if (index >= gl::MAX_VERTEX_ATTRIBS)
4164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004165 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004166 }
4167
daniel@transgaming.com83921382011-01-08 05:46:00 +00004168 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004169
daniel@transgaming.come0078962010-04-15 20:45:08 +00004170 switch (pname)
4171 {
4172 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004173 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004174 break;
4175 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004176 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004177 break;
4178 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004179 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004180 break;
4181 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004182 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004183 break;
4184 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004185 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004186 break;
4187 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004188 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004189 break;
4190 case GL_CURRENT_VERTEX_ATTRIB:
4191 for (int i = 0; i < 4; ++i)
4192 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004193 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004194 }
4195 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004196 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4197 *params = (GLfloat)attribState.mDivisor;
4198 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004200 }
4201 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004202 }
4203 catch(std::bad_alloc&)
4204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004205 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206 }
4207}
4208
4209void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004211 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004212
4213 try
4214 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004215 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216
daniel@transgaming.come0078962010-04-15 20:45:08 +00004217 if (context)
4218 {
4219 if (index >= gl::MAX_VERTEX_ATTRIBS)
4220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004222 }
4223
daniel@transgaming.com83921382011-01-08 05:46:00 +00004224 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004225
daniel@transgaming.come0078962010-04-15 20:45:08 +00004226 switch (pname)
4227 {
4228 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004229 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004230 break;
4231 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004232 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004233 break;
4234 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004235 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004236 break;
4237 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004238 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004239 break;
4240 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004241 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004242 break;
4243 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004244 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004245 break;
4246 case GL_CURRENT_VERTEX_ATTRIB:
4247 for (int i = 0; i < 4; ++i)
4248 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004249 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004250 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4251 }
4252 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004253 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4254 *params = (GLint)attribState.mDivisor;
4255 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004256 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004257 }
4258 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004259 }
4260 catch(std::bad_alloc&)
4261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004262 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263 }
4264}
4265
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004266void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004268 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269
4270 try
4271 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004272 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273
daniel@transgaming.come0078962010-04-15 20:45:08 +00004274 if (context)
4275 {
4276 if (index >= gl::MAX_VERTEX_ATTRIBS)
4277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004278 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004279 }
4280
4281 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004283 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004284 }
4285
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004286 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004287 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004288 }
4289 catch(std::bad_alloc&)
4290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292 }
4293}
4294
4295void __stdcall glHint(GLenum target, GLenum mode)
4296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004297 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004298
4299 try
4300 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004301 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004302 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004303 case GL_FASTEST:
4304 case GL_NICEST:
4305 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004306 break;
4307 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004308 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004309 }
4310
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004311 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004312 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004313 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004314 case GL_GENERATE_MIPMAP_HINT:
4315 if (context) context->setGenerateMipmapHint(mode);
4316 break;
4317 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4318 if (context) context->setFragmentShaderDerivativeHint(mode);
4319 break;
4320 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004321 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004322 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004323 }
4324 catch(std::bad_alloc&)
4325 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004326 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 }
4328}
4329
4330GLboolean __stdcall glIsBuffer(GLuint buffer)
4331{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004332 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333
4334 try
4335 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004336 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337
4338 if (context && buffer)
4339 {
4340 gl::Buffer *bufferObject = context->getBuffer(buffer);
4341
4342 if (bufferObject)
4343 {
4344 return GL_TRUE;
4345 }
4346 }
4347 }
4348 catch(std::bad_alloc&)
4349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004350 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004351 }
4352
4353 return GL_FALSE;
4354}
4355
4356GLboolean __stdcall glIsEnabled(GLenum cap)
4357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004358 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004359
4360 try
4361 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363
4364 if (context)
4365 {
4366 switch (cap)
4367 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004368 case GL_CULL_FACE: return context->isCullFaceEnabled();
4369 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4370 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4371 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4372 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4373 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4374 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4375 case GL_BLEND: return context->isBlendEnabled();
4376 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004377 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004378 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004379 }
4380 }
4381 }
4382 catch(std::bad_alloc&)
4383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004384 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385 }
4386
4387 return false;
4388}
4389
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004390GLboolean __stdcall glIsFenceNV(GLuint fence)
4391{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004392 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004393
4394 try
4395 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004396 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004397
4398 if (context)
4399 {
4400 gl::Fence *fenceObject = context->getFence(fence);
4401
4402 if (fenceObject == NULL)
4403 {
4404 return GL_FALSE;
4405 }
4406
4407 return fenceObject->isFence();
4408 }
4409 }
4410 catch(std::bad_alloc&)
4411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004412 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004413 }
4414
4415 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004416}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004417
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004418GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004420 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421
4422 try
4423 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004424 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425
4426 if (context && framebuffer)
4427 {
4428 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4429
4430 if (framebufferObject)
4431 {
4432 return GL_TRUE;
4433 }
4434 }
4435 }
4436 catch(std::bad_alloc&)
4437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004438 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004439 }
4440
4441 return GL_FALSE;
4442}
4443
4444GLboolean __stdcall glIsProgram(GLuint program)
4445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004446 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004447
4448 try
4449 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451
4452 if (context && program)
4453 {
4454 gl::Program *programObject = context->getProgram(program);
4455
4456 if (programObject)
4457 {
4458 return GL_TRUE;
4459 }
4460 }
4461 }
4462 catch(std::bad_alloc&)
4463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004464 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004465 }
4466
4467 return GL_FALSE;
4468}
4469
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004470GLboolean __stdcall glIsQueryEXT(GLuint id)
4471{
4472 EVENT("(GLuint id = %d)", id);
4473
4474 try
4475 {
4476 if (id == 0)
4477 {
4478 return GL_FALSE;
4479 }
4480
4481 gl::Context *context = gl::getNonLostContext();
4482
4483 if (context)
4484 {
4485 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4486
4487 if (queryObject)
4488 {
4489 return GL_TRUE;
4490 }
4491 }
4492 }
4493 catch(std::bad_alloc&)
4494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004495 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004496 }
4497
4498 return GL_FALSE;
4499}
4500
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4502{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004503 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504
4505 try
4506 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508
4509 if (context && renderbuffer)
4510 {
4511 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4512
4513 if (renderbufferObject)
4514 {
4515 return GL_TRUE;
4516 }
4517 }
4518 }
4519 catch(std::bad_alloc&)
4520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004521 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004522 }
4523
4524 return GL_FALSE;
4525}
4526
4527GLboolean __stdcall glIsShader(GLuint shader)
4528{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004529 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004530
4531 try
4532 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004533 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534
4535 if (context && shader)
4536 {
4537 gl::Shader *shaderObject = context->getShader(shader);
4538
4539 if (shaderObject)
4540 {
4541 return GL_TRUE;
4542 }
4543 }
4544 }
4545 catch(std::bad_alloc&)
4546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004547 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004548 }
4549
4550 return GL_FALSE;
4551}
4552
4553GLboolean __stdcall glIsTexture(GLuint texture)
4554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004555 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004556
4557 try
4558 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004559 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560
4561 if (context && texture)
4562 {
4563 gl::Texture *textureObject = context->getTexture(texture);
4564
4565 if (textureObject)
4566 {
4567 return GL_TRUE;
4568 }
4569 }
4570 }
4571 catch(std::bad_alloc&)
4572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004573 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004574 }
4575
4576 return GL_FALSE;
4577}
4578
4579void __stdcall glLineWidth(GLfloat width)
4580{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004581 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582
4583 try
4584 {
4585 if (width <= 0.0f)
4586 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004587 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004588 }
4589
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004591
4592 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004593 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004594 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004595 }
4596 }
4597 catch(std::bad_alloc&)
4598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004599 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600 }
4601}
4602
4603void __stdcall glLinkProgram(GLuint program)
4604{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004605 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004606
4607 try
4608 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004609 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004610
4611 if (context)
4612 {
4613 gl::Program *programObject = context->getProgram(program);
4614
4615 if (!programObject)
4616 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004617 if (context->getShader(program))
4618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004619 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004620 }
4621 else
4622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004623 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004624 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 }
4626
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004627 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629 }
4630 catch(std::bad_alloc&)
4631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004632 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633 }
4634}
4635
4636void __stdcall glPixelStorei(GLenum pname, GLint param)
4637{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004638 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639
4640 try
4641 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004642 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004643
4644 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004645 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004646 switch (pname)
4647 {
4648 case GL_UNPACK_ALIGNMENT:
4649 if (param != 1 && param != 2 && param != 4 && param != 8)
4650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004651 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004652 }
4653
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004654 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004655 break;
4656
4657 case GL_PACK_ALIGNMENT:
4658 if (param != 1 && param != 2 && param != 4 && param != 8)
4659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004660 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004661 }
4662
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004663 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004664 break;
4665
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004666 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4667 context->setPackReverseRowOrder(param != 0);
4668 break;
4669
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004670 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004671 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004672 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004673 }
4674 }
4675 catch(std::bad_alloc&)
4676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004677 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678 }
4679}
4680
4681void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4682{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004683 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684
4685 try
4686 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004687 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004688
4689 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004691 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004692 }
4693 }
4694 catch(std::bad_alloc&)
4695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004696 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004697 }
4698}
4699
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004700void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4701 GLenum format, GLenum type, GLsizei bufSize,
4702 GLvoid *data)
4703{
4704 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4705 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4706 x, y, width, height, format, type, bufSize, data);
4707
4708 try
4709 {
4710 if (width < 0 || height < 0 || bufSize < 0)
4711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004713 }
4714
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004715 gl::Context *context = gl::getNonLostContext();
4716
4717 if (context)
4718 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004719 GLenum currentFormat, currentType;
4720
4721 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4722 // and attempting to read back if that's the case is an error. The error will be registered
4723 // by getCurrentReadFormat.
4724 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4725 return;
4726
4727 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004729 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004730 }
4731
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004732 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4733 }
4734 }
4735 catch(std::bad_alloc&)
4736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004737 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004738 }
4739}
4740
4741void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4742 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004744 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004745 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004746 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747
4748 try
4749 {
4750 if (width < 0 || height < 0)
4751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004752 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753 }
4754
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004755 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756
4757 if (context)
4758 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004759 GLenum currentFormat, currentType;
4760
4761 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4762 // and attempting to read back if that's the case is an error. The error will be registered
4763 // by getCurrentReadFormat.
4764 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4765 return;
4766
4767 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004769 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004770 }
4771
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004772 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004773 }
4774 }
4775 catch(std::bad_alloc&)
4776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004777 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004778 }
4779}
4780
4781void __stdcall glReleaseShaderCompiler(void)
4782{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004783 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004784
4785 try
4786 {
4787 gl::Shader::releaseCompiler();
4788 }
4789 catch(std::bad_alloc&)
4790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004791 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004792 }
4793}
4794
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004795void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004797 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 +00004798 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799
4800 try
4801 {
4802 switch (target)
4803 {
4804 case GL_RENDERBUFFER:
4805 break;
4806 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004807 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 }
4809
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004810 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004812 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 }
4814
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004815 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818 }
4819
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821
4822 if (context)
4823 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004824 if (width > context->getMaximumRenderbufferDimension() ||
4825 height > context->getMaximumRenderbufferDimension() ||
4826 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004828 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004829 }
4830
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004831 GLuint handle = context->getRenderbufferHandle();
4832 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004833 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004834 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835 }
4836
4837 switch (internalformat)
4838 {
4839 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004840 case GL_RGBA4:
4841 case GL_RGB5_A1:
4842 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004843 case GL_RGB8_OES:
4844 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004846 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004847 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004848 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004850 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004851 }
4852 }
4853 }
4854 catch(std::bad_alloc&)
4855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004856 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004857 }
4858}
4859
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004860void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4861{
4862 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4863}
4864
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4866{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004867 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868
4869 try
4870 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004871 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004872
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873 if (context)
4874 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004875 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004876 }
4877 }
4878 catch(std::bad_alloc&)
4879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004881 }
4882}
4883
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004884void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4885{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004886 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004887
4888 try
4889 {
4890 if (condition != GL_ALL_COMPLETED_NV)
4891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004892 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004893 }
4894
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004895 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004896
4897 if (context)
4898 {
4899 gl::Fence *fenceObject = context->getFence(fence);
4900
4901 if (fenceObject == NULL)
4902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004903 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004904 }
4905
4906 fenceObject->setFence(condition);
4907 }
4908 }
4909 catch(std::bad_alloc&)
4910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004911 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004912 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004913}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004914
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004915void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4916{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004917 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 +00004918
4919 try
4920 {
4921 if (width < 0 || height < 0)
4922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004923 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924 }
4925
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004926 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004927
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 if (context)
4929 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004930 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931 }
4932 }
4933 catch(std::bad_alloc&)
4934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004936 }
4937}
4938
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004939void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004941 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004942 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004943 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944
4945 try
4946 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004947 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004948 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004949 }
4950 catch(std::bad_alloc&)
4951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004953 }
4954}
4955
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004956void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004958 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 +00004959 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960
4961 try
4962 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004963 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004965 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966 }
4967
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004968 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004969
4970 if (context)
4971 {
4972 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004973
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004974 if (!shaderObject)
4975 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004976 if (context->getProgram(shader))
4977 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004978 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004979 }
4980 else
4981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004982 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004984 }
4985
4986 shaderObject->setSource(count, string, length);
4987 }
4988 }
4989 catch(std::bad_alloc&)
4990 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004991 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004992 }
4993}
4994
4995void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4996{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004997 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004998}
4999
5000void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5001{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005002 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 +00005003
5004 try
5005 {
5006 switch (face)
5007 {
5008 case GL_FRONT:
5009 case GL_BACK:
5010 case GL_FRONT_AND_BACK:
5011 break;
5012 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005013 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005014 }
5015
5016 switch (func)
5017 {
5018 case GL_NEVER:
5019 case GL_ALWAYS:
5020 case GL_LESS:
5021 case GL_LEQUAL:
5022 case GL_EQUAL:
5023 case GL_GEQUAL:
5024 case GL_GREATER:
5025 case GL_NOTEQUAL:
5026 break;
5027 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005028 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005029 }
5030
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005031 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032
5033 if (context)
5034 {
5035 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5036 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005037 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005038 }
5039
5040 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5041 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005042 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 }
5044 }
5045 }
5046 catch(std::bad_alloc&)
5047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005048 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049 }
5050}
5051
5052void __stdcall glStencilMask(GLuint mask)
5053{
5054 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5055}
5056
5057void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5058{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005059 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005060
5061 try
5062 {
5063 switch (face)
5064 {
5065 case GL_FRONT:
5066 case GL_BACK:
5067 case GL_FRONT_AND_BACK:
5068 break;
5069 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005070 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071 }
5072
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005073 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074
5075 if (context)
5076 {
5077 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5078 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005079 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005080 }
5081
5082 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5083 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005084 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086 }
5087 }
5088 catch(std::bad_alloc&)
5089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005090 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005091 }
5092}
5093
5094void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5095{
5096 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5097}
5098
5099void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005101 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 +00005102 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005103
5104 try
5105 {
5106 switch (face)
5107 {
5108 case GL_FRONT:
5109 case GL_BACK:
5110 case GL_FRONT_AND_BACK:
5111 break;
5112 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005113 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005114 }
5115
5116 switch (fail)
5117 {
5118 case GL_ZERO:
5119 case GL_KEEP:
5120 case GL_REPLACE:
5121 case GL_INCR:
5122 case GL_DECR:
5123 case GL_INVERT:
5124 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005125 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005126 break;
5127 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005128 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005129 }
5130
5131 switch (zfail)
5132 {
5133 case GL_ZERO:
5134 case GL_KEEP:
5135 case GL_REPLACE:
5136 case GL_INCR:
5137 case GL_DECR:
5138 case GL_INVERT:
5139 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005140 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005141 break;
5142 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005143 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005144 }
5145
5146 switch (zpass)
5147 {
5148 case GL_ZERO:
5149 case GL_KEEP:
5150 case GL_REPLACE:
5151 case GL_INCR:
5152 case GL_DECR:
5153 case GL_INVERT:
5154 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005155 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156 break;
5157 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005158 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159 }
5160
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005161 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162
5163 if (context)
5164 {
5165 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5166 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005167 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005168 }
5169
5170 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5171 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005172 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005173 }
5174 }
5175 }
5176 catch(std::bad_alloc&)
5177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005178 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005179 }
5180}
5181
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005182GLboolean __stdcall glTestFenceNV(GLuint fence)
5183{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005184 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005185
5186 try
5187 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005188 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005189
5190 if (context)
5191 {
5192 gl::Fence *fenceObject = context->getFence(fence);
5193
5194 if (fenceObject == NULL)
5195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005196 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005197 }
5198
5199 return fenceObject->testFence();
5200 }
5201 }
5202 catch(std::bad_alloc&)
5203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005204 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005205 }
5206
5207 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005208}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005209
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005210void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5211 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005212{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005213 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 +00005214 "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 +00005215 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216
5217 try
5218 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005219 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005221 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005223
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005224 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005226 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005227 }
5228
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005229 // validate <type> by itself (used as secondary key below)
5230 switch (type)
5231 {
5232 case GL_UNSIGNED_BYTE:
5233 case GL_UNSIGNED_SHORT_5_6_5:
5234 case GL_UNSIGNED_SHORT_4_4_4_4:
5235 case GL_UNSIGNED_SHORT_5_5_5_1:
5236 case GL_UNSIGNED_SHORT:
5237 case GL_UNSIGNED_INT:
5238 case GL_UNSIGNED_INT_24_8_OES:
5239 case GL_HALF_FLOAT_OES:
5240 case GL_FLOAT:
5241 break;
5242 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005243 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005244 }
5245
5246 // validate <format> + <type> combinations
5247 // - invalid <format> -> sets INVALID_ENUM
5248 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005249 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005250 {
5251 case GL_ALPHA:
5252 case GL_LUMINANCE:
5253 case GL_LUMINANCE_ALPHA:
5254 switch (type)
5255 {
5256 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005257 case GL_FLOAT:
5258 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 break;
5260 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005261 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 }
5263 break;
5264 case GL_RGB:
5265 switch (type)
5266 {
5267 case GL_UNSIGNED_BYTE:
5268 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005269 case GL_FLOAT:
5270 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271 break;
5272 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005273 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 }
5275 break;
5276 case GL_RGBA:
5277 switch (type)
5278 {
5279 case GL_UNSIGNED_BYTE:
5280 case GL_UNSIGNED_SHORT_4_4_4_4:
5281 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005282 case GL_FLOAT:
5283 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284 break;
5285 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005286 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287 }
5288 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005289 case GL_BGRA_EXT:
5290 switch (type)
5291 {
5292 case GL_UNSIGNED_BYTE:
5293 break;
5294 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005295 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005296 }
5297 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005298 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5299 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005300 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5301 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005302 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005303 case GL_DEPTH_COMPONENT:
5304 switch (type)
5305 {
5306 case GL_UNSIGNED_SHORT:
5307 case GL_UNSIGNED_INT:
5308 break;
5309 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005310 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005311 }
5312 break;
5313 case GL_DEPTH_STENCIL_OES:
5314 switch (type)
5315 {
5316 case GL_UNSIGNED_INT_24_8_OES:
5317 break;
5318 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005319 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005320 }
5321 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005323 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005324 }
5325
5326 if (border != 0)
5327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005328 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005329 }
5330
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005331 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005332
5333 if (context)
5334 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005335 if (level > context->getMaximumTextureLevel())
5336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005337 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005338 }
5339
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005340 switch (target)
5341 {
5342 case GL_TEXTURE_2D:
5343 if (width > (context->getMaximumTextureDimension() >> level) ||
5344 height > (context->getMaximumTextureDimension() >> level))
5345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005347 }
5348 break;
5349 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5350 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5351 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5352 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5353 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5354 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5355 if (width != height)
5356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005358 }
5359
5360 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5361 height > (context->getMaximumCubeTextureDimension() >> level))
5362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005363 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005364 }
5365 break;
5366 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005367 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005368 }
5369
gman@chromium.org50c526d2011-08-10 05:19:44 +00005370 switch (format) {
5371 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5372 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5373 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005375 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005376 }
5377 else
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005380 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005381 break;
5382 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5383 if (context->supportsDXT3Textures())
5384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005385 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005386 }
5387 else
5388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005389 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005390 }
5391 break;
5392 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5393 if (context->supportsDXT5Textures())
5394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005395 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005396 }
5397 else
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005400 }
5401 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005402 case GL_DEPTH_COMPONENT:
5403 case GL_DEPTH_STENCIL_OES:
5404 if (!context->supportsDepthTextures())
5405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005406 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005407 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005408 if (target != GL_TEXTURE_2D)
5409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005411 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005412 // OES_depth_texture supports loading depth data and multiple levels,
5413 // but ANGLE_depth_texture does not
5414 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005417 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005418 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005419 default:
5420 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005421 }
5422
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005423 if (type == GL_FLOAT)
5424 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005425 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005427 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005428 }
5429 }
5430 else if (type == GL_HALF_FLOAT_OES)
5431 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005432 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005434 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005435 }
5436 }
5437
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005438 if (target == GL_TEXTURE_2D)
5439 {
5440 gl::Texture2D *texture = context->getTexture2D();
5441
5442 if (!texture)
5443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005444 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005445 }
5446
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005447 if (texture->isImmutable())
5448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005449 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005450 }
5451
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005452 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005453 }
5454 else
5455 {
5456 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5457
5458 if (!texture)
5459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005460 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005461 }
5462
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005463 if (texture->isImmutable())
5464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005465 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005466 }
5467
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005468 switch (target)
5469 {
5470 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005471 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005472 break;
5473 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005474 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475 break;
5476 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005477 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 break;
5479 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005480 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 break;
5482 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005483 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 break;
5485 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005486 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 break;
5488 default: UNREACHABLE();
5489 }
5490 }
5491 }
5492 }
5493 catch(std::bad_alloc&)
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496 }
5497}
5498
5499void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5500{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005501 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5502
5503 try
5504 {
5505 gl::Context *context = gl::getNonLostContext();
5506
5507 if (context)
5508 {
5509 gl::Texture *texture;
5510
5511 switch (target)
5512 {
5513 case GL_TEXTURE_2D:
5514 texture = context->getTexture2D();
5515 break;
5516 case GL_TEXTURE_CUBE_MAP:
5517 texture = context->getTextureCubeMap();
5518 break;
5519 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005520 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005521 }
5522
5523 switch (pname)
5524 {
5525 case GL_TEXTURE_WRAP_S:
5526 if (!texture->setWrapS((GLenum)param))
5527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005528 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005529 }
5530 break;
5531 case GL_TEXTURE_WRAP_T:
5532 if (!texture->setWrapT((GLenum)param))
5533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005534 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005535 }
5536 break;
5537 case GL_TEXTURE_MIN_FILTER:
5538 if (!texture->setMinFilter((GLenum)param))
5539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005541 }
5542 break;
5543 case GL_TEXTURE_MAG_FILTER:
5544 if (!texture->setMagFilter((GLenum)param))
5545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005547 }
5548 break;
5549 case GL_TEXTURE_USAGE_ANGLE:
5550 if (!texture->setUsage((GLenum)param))
5551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005553 }
5554 break;
5555 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5556 if (!context->supportsTextureFilterAnisotropy())
5557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005558 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005559 }
5560 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005563 }
5564 break;
5565 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005567 }
5568 }
5569 }
5570 catch(std::bad_alloc&)
5571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005572 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005574}
5575
5576void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5577{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005578 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005579}
5580
5581void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005583 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005584
5585 try
5586 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005587 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588
5589 if (context)
5590 {
5591 gl::Texture *texture;
5592
5593 switch (target)
5594 {
5595 case GL_TEXTURE_2D:
5596 texture = context->getTexture2D();
5597 break;
5598 case GL_TEXTURE_CUBE_MAP:
5599 texture = context->getTextureCubeMap();
5600 break;
5601 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005602 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005603 }
5604
5605 switch (pname)
5606 {
5607 case GL_TEXTURE_WRAP_S:
5608 if (!texture->setWrapS((GLenum)param))
5609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
5612 break;
5613 case GL_TEXTURE_WRAP_T:
5614 if (!texture->setWrapT((GLenum)param))
5615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005616 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617 }
5618 break;
5619 case GL_TEXTURE_MIN_FILTER:
5620 if (!texture->setMinFilter((GLenum)param))
5621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624 break;
5625 case GL_TEXTURE_MAG_FILTER:
5626 if (!texture->setMagFilter((GLenum)param))
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005629 }
5630 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005631 case GL_TEXTURE_USAGE_ANGLE:
5632 if (!texture->setUsage((GLenum)param))
5633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005635 }
5636 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005637 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5638 if (!context->supportsTextureFilterAnisotropy())
5639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005640 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005641 }
5642 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005645 }
5646 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005647 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
5650 }
5651 }
5652 catch(std::bad_alloc&)
5653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005654 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005655 }
5656}
5657
5658void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5659{
5660 glTexParameteri(target, pname, *params);
5661}
5662
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005663void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5664{
5665 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5666 target, levels, internalformat, width, height);
5667
5668 try
5669 {
5670 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005672 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005673 }
5674
5675 if (width < 1 || height < 1 || levels < 1)
5676 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005677 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005678 }
5679
5680 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005683 }
5684
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005685 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005687 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005688 }
5689
5690 GLenum format = gl::ExtractFormat(internalformat);
5691 GLenum type = gl::ExtractType(internalformat);
5692
5693 if (format == GL_NONE || type == GL_NONE)
5694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005695 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005696 }
5697
5698 gl::Context *context = gl::getNonLostContext();
5699
5700 if (context)
5701 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005702 switch (target)
5703 {
5704 case GL_TEXTURE_2D:
5705 if (width > context->getMaximumTextureDimension() ||
5706 height > context->getMaximumTextureDimension())
5707 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005708 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005709 }
5710 break;
5711 case GL_TEXTURE_CUBE_MAP:
5712 if (width > context->getMaximumCubeTextureDimension() ||
5713 height > context->getMaximumCubeTextureDimension())
5714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005716 }
5717 break;
5718 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005719 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005720 }
5721
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005722 if (levels != 1 && !context->supportsNonPower2Texture())
5723 {
5724 if (!gl::isPow2(width) || !gl::isPow2(height))
5725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005726 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005727 }
5728 }
5729
daniel@transgaming.come1077362011-11-11 04:16:50 +00005730 switch (internalformat)
5731 {
5732 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5733 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5734 if (!context->supportsDXT1Textures())
5735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005737 }
5738 break;
5739 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5740 if (!context->supportsDXT3Textures())
5741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005743 }
5744 break;
5745 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5746 if (!context->supportsDXT5Textures())
5747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005748 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005749 }
5750 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005751 case GL_RGBA32F_EXT:
5752 case GL_RGB32F_EXT:
5753 case GL_ALPHA32F_EXT:
5754 case GL_LUMINANCE32F_EXT:
5755 case GL_LUMINANCE_ALPHA32F_EXT:
5756 if (!context->supportsFloat32Textures())
5757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005758 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005759 }
5760 break;
5761 case GL_RGBA16F_EXT:
5762 case GL_RGB16F_EXT:
5763 case GL_ALPHA16F_EXT:
5764 case GL_LUMINANCE16F_EXT:
5765 case GL_LUMINANCE_ALPHA16F_EXT:
5766 if (!context->supportsFloat16Textures())
5767 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005768 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005769 }
5770 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005771 case GL_DEPTH_COMPONENT16:
5772 case GL_DEPTH_COMPONENT32_OES:
5773 case GL_DEPTH24_STENCIL8_OES:
5774 if (!context->supportsDepthTextures())
5775 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005776 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005777 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005778 if (target != GL_TEXTURE_2D)
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005781 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005782 // ANGLE_depth_texture only supports 1-level textures
5783 if (levels != 1)
5784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005785 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005786 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005787 break;
5788 default:
5789 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005790 }
5791
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005792 if (target == GL_TEXTURE_2D)
5793 {
5794 gl::Texture2D *texture = context->getTexture2D();
5795
5796 if (!texture || texture->id() == 0)
5797 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005798 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005799 }
5800
5801 if (texture->isImmutable())
5802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005803 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005804 }
5805
5806 texture->storage(levels, internalformat, width, height);
5807 }
5808 else if (target == GL_TEXTURE_CUBE_MAP)
5809 {
5810 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5811
5812 if (!texture || texture->id() == 0)
5813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005814 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005815 }
5816
5817 if (texture->isImmutable())
5818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005819 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005820 }
5821
5822 texture->storage(levels, internalformat, width);
5823 }
5824 else UNREACHABLE();
5825 }
5826 }
5827 catch(std::bad_alloc&)
5828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005830 }
5831}
5832
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005833void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5834 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005835{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005836 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005837 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005838 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005839 target, level, xoffset, yoffset, width, height, format, type, pixels);
5840
5841 try
5842 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005843 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005845 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005846 }
5847
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005848 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005851 }
5852
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005853 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005855 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005856 }
5857
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005858 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005859 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005860 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005861 }
5862
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005863 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005864
5865 if (context)
5866 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005867 if (level > context->getMaximumTextureLevel())
5868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005869 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005870 }
5871
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005872 if (format == GL_FLOAT)
5873 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005874 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005875 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005876 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005877 }
5878 }
5879 else if (format == GL_HALF_FLOAT_OES)
5880 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005881 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005883 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005884 }
5885 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005886 else if (gl::IsDepthTexture(format))
5887 {
5888 if (!context->supportsDepthTextures())
5889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005890 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005891 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005892 if (target != GL_TEXTURE_2D)
5893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005894 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005895 }
5896 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005897 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005898 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005899
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005900 if (width == 0 || height == 0 || pixels == NULL)
5901 {
5902 return;
5903 }
5904
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005905 if (target == GL_TEXTURE_2D)
5906 {
5907 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005908 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005909 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005910 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005911 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005912 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005913 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005914 {
5915 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005916 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005917 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005918 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005919 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005920 }
5921 else
5922 {
5923 UNREACHABLE();
5924 }
5925 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005926 }
5927 catch(std::bad_alloc&)
5928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005930 }
5931}
5932
5933void __stdcall glUniform1f(GLint location, GLfloat x)
5934{
5935 glUniform1fv(location, 1, &x);
5936}
5937
5938void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5939{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005940 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941
5942 try
5943 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944 if (count < 0)
5945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005946 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 }
5948
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005949 if (location == -1)
5950 {
5951 return;
5952 }
5953
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005954 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005955
5956 if (context)
5957 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005958 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005959 if (!programBinary)
5960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005961 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005962 }
5963
5964 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005966 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005967 }
5968 }
5969 }
5970 catch(std::bad_alloc&)
5971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005972 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005973 }
5974}
5975
5976void __stdcall glUniform1i(GLint location, GLint x)
5977{
5978 glUniform1iv(location, 1, &x);
5979}
5980
5981void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5982{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005983 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005984
5985 try
5986 {
5987 if (count < 0)
5988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005989 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005990 }
5991
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005992 if (location == -1)
5993 {
5994 return;
5995 }
5996
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005997 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005998
5999 if (context)
6000 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006001 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006002 if (!programBinary)
6003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006004 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006005 }
6006
6007 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011 }
6012 }
6013 catch(std::bad_alloc&)
6014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006015 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006016 }
6017}
6018
6019void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6020{
6021 GLfloat xy[2] = {x, y};
6022
6023 glUniform2fv(location, 1, (GLfloat*)&xy);
6024}
6025
6026void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6027{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006028 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006029
6030 try
6031 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006032 if (count < 0)
6033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006034 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006036
6037 if (location == -1)
6038 {
6039 return;
6040 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006042 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006043
6044 if (context)
6045 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006046 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006047 if (!programBinary)
6048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006049 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006050 }
6051
6052 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006054 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 }
6056 }
6057 }
6058 catch(std::bad_alloc&)
6059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 }
6062}
6063
6064void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6065{
6066 GLint xy[4] = {x, y};
6067
6068 glUniform2iv(location, 1, (GLint*)&xy);
6069}
6070
6071void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006073 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006074
6075 try
6076 {
6077 if (count < 0)
6078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006079 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080 }
6081
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006082 if (location == -1)
6083 {
6084 return;
6085 }
6086
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006087 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006088
6089 if (context)
6090 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006091 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006092 if (!programBinary)
6093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006094 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006095 }
6096
6097 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006099 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006100 }
6101 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006102 }
6103 catch(std::bad_alloc&)
6104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006105 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 }
6107}
6108
6109void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6110{
6111 GLfloat xyz[3] = {x, y, z};
6112
6113 glUniform3fv(location, 1, (GLfloat*)&xyz);
6114}
6115
6116void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6117{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006118 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006119
6120 try
6121 {
6122 if (count < 0)
6123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006124 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006125 }
6126
6127 if (location == -1)
6128 {
6129 return;
6130 }
6131
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006132 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006133
6134 if (context)
6135 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006136 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006137 if (!programBinary)
6138 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006139 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006140 }
6141
6142 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006144 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145 }
6146 }
6147 }
6148 catch(std::bad_alloc&)
6149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006151 }
6152}
6153
6154void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6155{
6156 GLint xyz[3] = {x, y, z};
6157
6158 glUniform3iv(location, 1, (GLint*)&xyz);
6159}
6160
6161void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6162{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006163 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006164
6165 try
6166 {
6167 if (count < 0)
6168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006170 }
6171
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006172 if (location == -1)
6173 {
6174 return;
6175 }
6176
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006177 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006178
6179 if (context)
6180 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006181 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006182 if (!programBinary)
6183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006184 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006185 }
6186
6187 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006189 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006190 }
6191 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006192 }
6193 catch(std::bad_alloc&)
6194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006195 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006196 }
6197}
6198
6199void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6200{
6201 GLfloat xyzw[4] = {x, y, z, w};
6202
6203 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6204}
6205
6206void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006208 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006209
6210 try
6211 {
6212 if (count < 0)
6213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006214 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006215 }
6216
6217 if (location == -1)
6218 {
6219 return;
6220 }
6221
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006222 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006223
6224 if (context)
6225 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006226 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006227 if (!programBinary)
6228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006229 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006230 }
6231
6232 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006235 }
6236 }
6237 }
6238 catch(std::bad_alloc&)
6239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006240 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006241 }
6242}
6243
6244void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6245{
6246 GLint xyzw[4] = {x, y, z, w};
6247
6248 glUniform4iv(location, 1, (GLint*)&xyzw);
6249}
6250
6251void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6252{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006253 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254
6255 try
6256 {
6257 if (count < 0)
6258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006259 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006260 }
6261
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006262 if (location == -1)
6263 {
6264 return;
6265 }
6266
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006268
6269 if (context)
6270 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006271 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006272 if (!programBinary)
6273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006274 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006275 }
6276
6277 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006279 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006280 }
6281 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006282 }
6283 catch(std::bad_alloc&)
6284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006286 }
6287}
6288
6289void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006291 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006292 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006293
6294 try
6295 {
6296 if (count < 0 || transpose != GL_FALSE)
6297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006298 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006299 }
6300
6301 if (location == -1)
6302 {
6303 return;
6304 }
6305
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006306 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006307
6308 if (context)
6309 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006310 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006311 if (!programBinary)
6312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006313 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006314 }
6315
6316 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320 }
6321 }
6322 catch(std::bad_alloc&)
6323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006324 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006325 }
6326}
6327
6328void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6329{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006330 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006331 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006332
6333 try
6334 {
6335 if (count < 0 || transpose != GL_FALSE)
6336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006337 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006338 }
6339
6340 if (location == -1)
6341 {
6342 return;
6343 }
6344
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006345 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006346
6347 if (context)
6348 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006349 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006350 if (!programBinary)
6351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006352 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006353 }
6354
6355 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006357 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006358 }
6359 }
6360 }
6361 catch(std::bad_alloc&)
6362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006364 }
6365}
6366
6367void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006369 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006370 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006371
6372 try
6373 {
6374 if (count < 0 || transpose != GL_FALSE)
6375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006377 }
6378
6379 if (location == -1)
6380 {
6381 return;
6382 }
6383
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006384 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006385
6386 if (context)
6387 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006388 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006389 if (!programBinary)
6390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006391 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006392 }
6393
6394 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006396 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006397 }
6398 }
6399 }
6400 catch(std::bad_alloc&)
6401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006402 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006403 }
6404}
6405
6406void __stdcall glUseProgram(GLuint program)
6407{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006408 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006409
6410 try
6411 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006412 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006413
6414 if (context)
6415 {
6416 gl::Program *programObject = context->getProgram(program);
6417
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006418 if (!programObject && program != 0)
6419 {
6420 if (context->getShader(program))
6421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006423 }
6424 else
6425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006426 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006427 }
6428 }
6429
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006430 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006432 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006433 }
6434
6435 context->useProgram(program);
6436 }
6437 }
6438 catch(std::bad_alloc&)
6439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006440 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006441 }
6442}
6443
6444void __stdcall glValidateProgram(GLuint program)
6445{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006446 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006447
6448 try
6449 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006450 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006451
6452 if (context)
6453 {
6454 gl::Program *programObject = context->getProgram(program);
6455
6456 if (!programObject)
6457 {
6458 if (context->getShader(program))
6459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006460 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006461 }
6462 else
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006465 }
6466 }
6467
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006468 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006470 }
6471 catch(std::bad_alloc&)
6472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006473 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474 }
6475}
6476
6477void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6478{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006479 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006480
6481 try
6482 {
6483 if (index >= gl::MAX_VERTEX_ATTRIBS)
6484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006485 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006486 }
6487
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006488 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006489
6490 if (context)
6491 {
6492 GLfloat vals[4] = { x, 0, 0, 1 };
6493 context->setVertexAttrib(index, vals);
6494 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006495 }
6496 catch(std::bad_alloc&)
6497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006498 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006499 }
6500}
6501
6502void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6503{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006504 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006505
6506 try
6507 {
6508 if (index >= gl::MAX_VERTEX_ATTRIBS)
6509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006510 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006511 }
6512
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006513 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006514
6515 if (context)
6516 {
6517 GLfloat vals[4] = { values[0], 0, 0, 1 };
6518 context->setVertexAttrib(index, vals);
6519 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006520 }
6521 catch(std::bad_alloc&)
6522 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006523 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006524 }
6525}
6526
6527void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6528{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006529 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006530
6531 try
6532 {
6533 if (index >= gl::MAX_VERTEX_ATTRIBS)
6534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006535 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006536 }
6537
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006538 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006539
6540 if (context)
6541 {
6542 GLfloat vals[4] = { x, y, 0, 1 };
6543 context->setVertexAttrib(index, vals);
6544 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006545 }
6546 catch(std::bad_alloc&)
6547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006549 }
6550}
6551
6552void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006554 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006555
6556 try
6557 {
6558 if (index >= gl::MAX_VERTEX_ATTRIBS)
6559 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006560 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006561 }
6562
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006563 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006564
6565 if (context)
6566 {
6567 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6568 context->setVertexAttrib(index, vals);
6569 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006570 }
6571 catch(std::bad_alloc&)
6572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006573 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006574 }
6575}
6576
6577void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006579 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 +00006580
6581 try
6582 {
6583 if (index >= gl::MAX_VERTEX_ATTRIBS)
6584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006585 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006586 }
6587
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006588 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006589
6590 if (context)
6591 {
6592 GLfloat vals[4] = { x, y, z, 1 };
6593 context->setVertexAttrib(index, vals);
6594 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006595 }
6596 catch(std::bad_alloc&)
6597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006598 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006599 }
6600}
6601
6602void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6603{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006604 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006605
6606 try
6607 {
6608 if (index >= gl::MAX_VERTEX_ATTRIBS)
6609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006610 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006611 }
6612
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006613 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006614
6615 if (context)
6616 {
6617 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6618 context->setVertexAttrib(index, vals);
6619 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006620 }
6621 catch(std::bad_alloc&)
6622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006623 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006624 }
6625}
6626
6627void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6628{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006629 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 +00006630
6631 try
6632 {
6633 if (index >= gl::MAX_VERTEX_ATTRIBS)
6634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006635 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006636 }
6637
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006639
6640 if (context)
6641 {
6642 GLfloat vals[4] = { x, y, z, w };
6643 context->setVertexAttrib(index, vals);
6644 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006645 }
6646 catch(std::bad_alloc&)
6647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006649 }
6650}
6651
6652void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6653{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006654 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006655
6656 try
6657 {
6658 if (index >= gl::MAX_VERTEX_ATTRIBS)
6659 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006660 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006661 }
6662
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006663 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006664
6665 if (context)
6666 {
6667 context->setVertexAttrib(index, values);
6668 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006669 }
6670 catch(std::bad_alloc&)
6671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006672 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006673 }
6674}
6675
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006676void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6677{
6678 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6679
6680 try
6681 {
6682 if (index >= gl::MAX_VERTEX_ATTRIBS)
6683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006684 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006685 }
6686
6687 gl::Context *context = gl::getNonLostContext();
6688
6689 if (context)
6690 {
6691 context->setVertexAttribDivisor(index, divisor);
6692 }
6693 }
6694 catch(std::bad_alloc&)
6695 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006696 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006697 }
6698}
6699
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006700void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006701{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006702 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006703 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006704 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006705
6706 try
6707 {
6708 if (index >= gl::MAX_VERTEX_ATTRIBS)
6709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006710 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006711 }
6712
6713 if (size < 1 || size > 4)
6714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006716 }
6717
6718 switch (type)
6719 {
6720 case GL_BYTE:
6721 case GL_UNSIGNED_BYTE:
6722 case GL_SHORT:
6723 case GL_UNSIGNED_SHORT:
6724 case GL_FIXED:
6725 case GL_FLOAT:
6726 break;
6727 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006728 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006729 }
6730
6731 if (stride < 0)
6732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006734 }
6735
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006736 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006737
6738 if (context)
6739 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006740 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006741 }
6742 }
6743 catch(std::bad_alloc&)
6744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006746 }
6747}
6748
6749void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006751 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 +00006752
6753 try
6754 {
6755 if (width < 0 || height < 0)
6756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006757 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006758 }
6759
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006760 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006761
6762 if (context)
6763 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006764 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006765 }
6766 }
6767 catch(std::bad_alloc&)
6768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006769 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006770 }
6771}
6772
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006773void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6774 GLbitfield mask, GLenum filter)
6775{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006776 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006777 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6778 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6779 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6780
6781 try
6782 {
6783 switch (filter)
6784 {
6785 case GL_NEAREST:
6786 break;
6787 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006788 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006789 }
6790
6791 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006793 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006794 }
6795
6796 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6797 {
6798 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006799 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006800 }
6801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006803
6804 if (context)
6805 {
6806 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6807 {
6808 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006809 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006810 }
6811
6812 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6813 }
6814 }
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.com4cbc5902010-08-24 19:20:26 +00006818 }
6819}
6820
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006821void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6822 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006823{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006824 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006825 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006826 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006827 target, level, internalformat, width, height, depth, border, format, type, pixels);
6828
6829 try
6830 {
6831 UNIMPLEMENTED(); // FIXME
6832 }
6833 catch(std::bad_alloc&)
6834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006835 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006836 }
6837}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006838
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006839void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6840 GLenum *binaryFormat, void *binary)
6841{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006842 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 +00006843 program, bufSize, length, binaryFormat, binary);
6844
6845 try
6846 {
6847 gl::Context *context = gl::getNonLostContext();
6848
6849 if (context)
6850 {
6851 gl::Program *programObject = context->getProgram(program);
6852
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006853 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006855 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006856 }
6857
6858 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6859
6860 if (!programBinary)
6861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006862 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006863 }
6864
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006865 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006866 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006867 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006868 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006869
6870 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006871 }
6872 }
6873 catch(std::bad_alloc&)
6874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006875 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006876 }
6877}
6878
6879void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6880 const void *binary, GLint length)
6881{
6882 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6883 program, binaryFormat, binary, length);
6884
6885 try
6886 {
6887 gl::Context *context = gl::getNonLostContext();
6888
6889 if (context)
6890 {
6891 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006893 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006894 }
6895
6896 gl::Program *programObject = context->getProgram(program);
6897
6898 if (!programObject)
6899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006900 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006901 }
6902
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006903 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006904 }
6905 }
6906 catch(std::bad_alloc&)
6907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006908 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006909 }
6910}
6911
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006912__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6913{
6914 struct Extension
6915 {
6916 const char *name;
6917 __eglMustCastToProperFunctionPointerType address;
6918 };
6919
6920 static const Extension glExtensions[] =
6921 {
6922 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006923 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006924 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006925 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6926 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6927 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6928 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6929 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6930 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6931 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006932 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006933 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006934 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6935 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6936 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6937 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006938 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6939 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6940 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6941 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6942 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6943 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6944 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006945 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6946 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6947 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006948 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
6949 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006950
6951 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6952 {
6953 if (strcmp(procname, glExtensions[ext].name) == 0)
6954 {
6955 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6956 }
6957 }
6958
6959 return NULL;
6960}
6961
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006962// Non-public functions used by EGL
6963
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006964bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006965{
6966 EVENT("(egl::Surface* surface = 0x%0.8p)",
6967 surface);
6968
6969 try
6970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006971 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006972
6973 if (context)
6974 {
6975 gl::Texture2D *textureObject = context->getTexture2D();
6976
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006977 if (textureObject->isImmutable())
6978 {
6979 return false;
6980 }
6981
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006982 if (textureObject)
6983 {
6984 textureObject->bindTexImage(surface);
6985 }
6986 }
6987 }
6988 catch(std::bad_alloc&)
6989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006990 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006991 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006992
6993 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006994}
6995
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006996}