blob: dfa97956d43cfa8e8f5f5ea6b1c12c7fe1b0b6ea [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 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001334 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001335 colorbufferFormat != GL_RGBA8_OES)
1336 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001338 }
1339 break;
1340 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001341 case GL_RGB:
1342 if (colorbufferFormat != GL_RGB565 &&
1343 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001344 colorbufferFormat != GL_RGBA4 &&
1345 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001346 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001347 colorbufferFormat != GL_RGBA8_OES)
1348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001349 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001350 }
1351 break;
1352 case GL_LUMINANCE_ALPHA:
1353 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001354 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001355 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001356 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001357 colorbufferFormat != GL_RGBA8_OES)
1358 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001359 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001360 }
1361 break;
1362 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1363 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001364 if (context->supportsDXT1Textures())
1365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001366 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001367 }
1368 else
1369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001370 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001371 }
1372 break;
1373 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1374 if (context->supportsDXT3Textures())
1375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001376 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001377 }
1378 else
1379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001380 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001381 }
1382 break;
1383 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1384 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001386 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001387 }
1388 else
1389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001390 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001391 }
1392 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001393 case GL_DEPTH_COMPONENT:
1394 case GL_DEPTH_COMPONENT16:
1395 case GL_DEPTH_COMPONENT32_OES:
1396 case GL_DEPTH_STENCIL_OES:
1397 case GL_DEPTH24_STENCIL8_OES:
1398 if (context->supportsDepthTextures())
1399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001400 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001401 }
1402 else
1403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001404 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001405 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001406 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001407 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001408 }
1409
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001410 if (target == GL_TEXTURE_2D)
1411 {
1412 gl::Texture2D *texture = context->getTexture2D();
1413
1414 if (!texture)
1415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001417 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001418
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001419 if (texture->isImmutable())
1420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001421 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001422 }
1423
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001424 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001425 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001426 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001427 {
1428 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1429
1430 if (!texture)
1431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001432 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001433 }
1434
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001435 if (texture->isImmutable())
1436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001437 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001438 }
1439
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001440 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001441 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001442 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001443 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001444 }
1445 catch(std::bad_alloc&)
1446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001447 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001448 }
1449}
1450
1451void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1452{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001453 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001454 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001455 target, level, xoffset, yoffset, x, y, width, height);
1456
1457 try
1458 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001459 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001461 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001462 }
1463
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001464 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001466 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001467 }
1468
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001469 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1470 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001471 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001472 }
1473
1474 if (width == 0 || height == 0)
1475 {
1476 return;
1477 }
1478
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001479 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001480
1481 if (context)
1482 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001483 if (level > context->getMaximumTextureLevel())
1484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001485 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001486 }
1487
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001488 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001489
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001490 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001492 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001493 }
1494
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001495 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1496 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001497 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001498 }
1499
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001500 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001501 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001502 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001503 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001504
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001505 if (target == GL_TEXTURE_2D)
1506 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001507 gl::Texture2D *tex2d = context->getTexture2D();
1508
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001509 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001510 {
1511 return; // error already registered by validateSubImageParams
1512 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001513 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001514 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001515 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001516 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001517 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001518 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1519
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001520 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001521 {
1522 return; // error already registered by validateSubImageParams
1523 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001524 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001525 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001526 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001527 else UNREACHABLE();
1528
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001529 // [OpenGL ES 2.0.24] table 3.9
1530 switch (textureFormat)
1531 {
1532 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001533 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001534 colorbufferFormat != GL_RGBA4 &&
1535 colorbufferFormat != GL_RGB5_A1 &&
1536 colorbufferFormat != GL_RGBA8_OES)
1537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001538 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001539 }
1540 break;
1541 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001542 case GL_RGB:
1543 if (colorbufferFormat != GL_RGB565 &&
1544 colorbufferFormat != GL_RGB8_OES &&
1545 colorbufferFormat != GL_RGBA4 &&
1546 colorbufferFormat != GL_RGB5_A1 &&
1547 colorbufferFormat != GL_RGBA8_OES)
1548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001550 }
1551 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001552 case GL_LUMINANCE_ALPHA:
1553 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001554 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001555 colorbufferFormat != GL_RGB5_A1 &&
1556 colorbufferFormat != GL_RGBA8_OES)
1557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001558 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001559 }
1560 break;
1561 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1562 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001563 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1564 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001565 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001566 case GL_DEPTH_COMPONENT:
1567 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001568 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001569 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001571 }
1572
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001573 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001574 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001575 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001576
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577 catch(std::bad_alloc&)
1578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001579 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001580 }
1581}
1582
1583GLuint __stdcall glCreateProgram(void)
1584{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001585 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001586
1587 try
1588 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001590
1591 if (context)
1592 {
1593 return context->createProgram();
1594 }
1595 }
1596 catch(std::bad_alloc&)
1597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001598 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001599 }
1600
1601 return 0;
1602}
1603
1604GLuint __stdcall glCreateShader(GLenum type)
1605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001606 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001607
1608 try
1609 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001611
1612 if (context)
1613 {
1614 switch (type)
1615 {
1616 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001617 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001618 return context->createShader(type);
1619 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001620 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001621 }
1622 }
1623 }
1624 catch(std::bad_alloc&)
1625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001626 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001627 }
1628
1629 return 0;
1630}
1631
1632void __stdcall glCullFace(GLenum mode)
1633{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001634 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001635
1636 try
1637 {
1638 switch (mode)
1639 {
1640 case GL_FRONT:
1641 case GL_BACK:
1642 case GL_FRONT_AND_BACK:
1643 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001644 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645
1646 if (context)
1647 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001648 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001649 }
1650 }
1651 break;
1652 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001654 }
1655 }
1656 catch(std::bad_alloc&)
1657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001659 }
1660}
1661
1662void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1663{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001664 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665
1666 try
1667 {
1668 if (n < 0)
1669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001670 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001671 }
1672
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001673 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001674
1675 if (context)
1676 {
1677 for (int i = 0; i < n; i++)
1678 {
1679 context->deleteBuffer(buffers[i]);
1680 }
1681 }
1682 }
1683 catch(std::bad_alloc&)
1684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001685 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001686 }
1687}
1688
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001689void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1690{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001691 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001692
1693 try
1694 {
1695 if (n < 0)
1696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001697 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001698 }
1699
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001700 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001701
1702 if (context)
1703 {
1704 for (int i = 0; i < n; i++)
1705 {
1706 context->deleteFence(fences[i]);
1707 }
1708 }
1709 }
1710 catch(std::bad_alloc&)
1711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001712 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001713 }
1714}
1715
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001716void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001718 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719
1720 try
1721 {
1722 if (n < 0)
1723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001724 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001725 }
1726
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001727 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001728
1729 if (context)
1730 {
1731 for (int i = 0; i < n; i++)
1732 {
1733 if (framebuffers[i] != 0)
1734 {
1735 context->deleteFramebuffer(framebuffers[i]);
1736 }
1737 }
1738 }
1739 }
1740 catch(std::bad_alloc&)
1741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001743 }
1744}
1745
1746void __stdcall glDeleteProgram(GLuint program)
1747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001748 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001749
1750 try
1751 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001752 if (program == 0)
1753 {
1754 return;
1755 }
1756
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001757 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001758
1759 if (context)
1760 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001761 if (!context->getProgram(program))
1762 {
1763 if(context->getShader(program))
1764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001765 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001766 }
1767 else
1768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001769 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001770 }
1771 }
1772
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001773 context->deleteProgram(program);
1774 }
1775 }
1776 catch(std::bad_alloc&)
1777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001778 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001779 }
1780}
1781
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001782void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1783{
1784 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1785
1786 try
1787 {
1788 if (n < 0)
1789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001790 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001791 }
1792
1793 gl::Context *context = gl::getNonLostContext();
1794
1795 if (context)
1796 {
1797 for (int i = 0; i < n; i++)
1798 {
1799 context->deleteQuery(ids[i]);
1800 }
1801 }
1802 }
1803 catch(std::bad_alloc&)
1804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001805 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001806 }
1807}
1808
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001809void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1810{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001811 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812
1813 try
1814 {
1815 if (n < 0)
1816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001817 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001818 }
1819
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001821
1822 if (context)
1823 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001824 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001825 {
1826 context->deleteRenderbuffer(renderbuffers[i]);
1827 }
1828 }
1829 }
1830 catch(std::bad_alloc&)
1831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001833 }
1834}
1835
1836void __stdcall glDeleteShader(GLuint shader)
1837{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001838 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839
1840 try
1841 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001842 if (shader == 0)
1843 {
1844 return;
1845 }
1846
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001847 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001848
1849 if (context)
1850 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001851 if (!context->getShader(shader))
1852 {
1853 if(context->getProgram(shader))
1854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001855 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001856 }
1857 else
1858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001859 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001860 }
1861 }
1862
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863 context->deleteShader(shader);
1864 }
1865 }
1866 catch(std::bad_alloc&)
1867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001869 }
1870}
1871
1872void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001874 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001875
1876 try
1877 {
1878 if (n < 0)
1879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001880 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001881 }
1882
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001884
1885 if (context)
1886 {
1887 for (int i = 0; i < n; i++)
1888 {
1889 if (textures[i] != 0)
1890 {
1891 context->deleteTexture(textures[i]);
1892 }
1893 }
1894 }
1895 }
1896 catch(std::bad_alloc&)
1897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001899 }
1900}
1901
1902void __stdcall glDepthFunc(GLenum func)
1903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001904 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905
1906 try
1907 {
1908 switch (func)
1909 {
1910 case GL_NEVER:
1911 case GL_ALWAYS:
1912 case GL_LESS:
1913 case GL_LEQUAL:
1914 case GL_EQUAL:
1915 case GL_GREATER:
1916 case GL_GEQUAL:
1917 case GL_NOTEQUAL:
1918 break;
1919 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001920 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001921 }
1922
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001923 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924
1925 if (context)
1926 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001927 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001928 }
1929 }
1930 catch(std::bad_alloc&)
1931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933 }
1934}
1935
1936void __stdcall glDepthMask(GLboolean flag)
1937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001938 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001939
1940 try
1941 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001942 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943
1944 if (context)
1945 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001946 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947 }
1948 }
1949 catch(std::bad_alloc&)
1950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001951 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952 }
1953}
1954
1955void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1956{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001957 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001958
1959 try
1960 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001961 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962
1963 if (context)
1964 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001965 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001966 }
1967 }
1968 catch(std::bad_alloc&)
1969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001970 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971 }
1972}
1973
1974void __stdcall glDetachShader(GLuint program, GLuint shader)
1975{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001976 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977
1978 try
1979 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001980 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001981
1982 if (context)
1983 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001984
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001985 gl::Program *programObject = context->getProgram(program);
1986 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001987
1988 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001989 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001990 gl::Shader *shaderByProgramHandle;
1991 shaderByProgramHandle = context->getShader(program);
1992 if (!shaderByProgramHandle)
1993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001994 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001995 }
1996 else
1997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001998 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001999 }
2000 }
2001
2002 if (!shaderObject)
2003 {
2004 gl::Program *programByShaderHandle = context->getProgram(shader);
2005 if (!programByShaderHandle)
2006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002007 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002008 }
2009 else
2010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002011 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002013 }
2014
2015 if (!programObject->detachShader(shaderObject))
2016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002017 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002019 }
2020 }
2021 catch(std::bad_alloc&)
2022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002023 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024 }
2025}
2026
2027void __stdcall glDisable(GLenum cap)
2028{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002029 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002030
2031 try
2032 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002033 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002034
2035 if (context)
2036 {
2037 switch (cap)
2038 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002039 case GL_CULL_FACE: context->setCullFace(false); break;
2040 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2041 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2042 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2043 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2044 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2045 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2046 case GL_BLEND: context->setBlend(false); break;
2047 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002048 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002049 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050 }
2051 }
2052 }
2053 catch(std::bad_alloc&)
2054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002055 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056 }
2057}
2058
2059void __stdcall glDisableVertexAttribArray(GLuint index)
2060{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002061 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002062
2063 try
2064 {
2065 if (index >= gl::MAX_VERTEX_ATTRIBS)
2066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002067 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002071
2072 if (context)
2073 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002074 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002075 }
2076 }
2077 catch(std::bad_alloc&)
2078 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002079 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002080 }
2081}
2082
2083void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2084{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002085 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086
2087 try
2088 {
2089 if (count < 0 || first < 0)
2090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002091 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092 }
2093
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002094 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002095
2096 if (context)
2097 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002098 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002099 }
2100 }
2101 catch(std::bad_alloc&)
2102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002103 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002104 }
2105}
2106
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002107void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2108{
2109 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2110
2111 try
2112 {
2113 if (count < 0 || first < 0 || primcount < 0)
2114 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002115 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002116 }
2117
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002118 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002119 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002120 gl::Context *context = gl::getNonLostContext();
2121
2122 if (context)
2123 {
2124 context->drawArrays(mode, first, count, primcount);
2125 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002126 }
2127 }
2128 catch(std::bad_alloc&)
2129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002130 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002131 }
2132}
2133
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002134void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002136 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 +00002137 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138
2139 try
2140 {
2141 if (count < 0)
2142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002143 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002144 }
2145
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002146 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002147
2148 if (context)
2149 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002150 switch (type)
2151 {
2152 case GL_UNSIGNED_BYTE:
2153 case GL_UNSIGNED_SHORT:
2154 break;
2155 case GL_UNSIGNED_INT:
2156 if (!context->supports32bitIndices())
2157 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002158 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002159 }
2160 break;
2161 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002162 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002163 }
2164
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002165 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002166 }
2167 }
2168 catch(std::bad_alloc&)
2169 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002170 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002171 }
2172}
2173
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002174void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2175{
2176 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2177 mode, count, type, indices, primcount);
2178
2179 try
2180 {
2181 if (count < 0 || primcount < 0)
2182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002183 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002184 }
2185
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002186 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002187 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002188 gl::Context *context = gl::getNonLostContext();
2189
2190 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002191 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002192 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002193 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002194 case GL_UNSIGNED_BYTE:
2195 case GL_UNSIGNED_SHORT:
2196 break;
2197 case GL_UNSIGNED_INT:
2198 if (!context->supports32bitIndices())
2199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002200 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002201 }
2202 break;
2203 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002205 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002206
2207 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002208 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002209 }
2210 }
2211 catch(std::bad_alloc&)
2212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002213 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002214 }
2215}
2216
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002217void __stdcall glEnable(GLenum cap)
2218{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002219 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220
2221 try
2222 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002223 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002224
2225 if (context)
2226 {
2227 switch (cap)
2228 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002229 case GL_CULL_FACE: context->setCullFace(true); break;
2230 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2231 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2232 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2233 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2234 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2235 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2236 case GL_BLEND: context->setBlend(true); break;
2237 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002238 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002239 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240 }
2241 }
2242 }
2243 catch(std::bad_alloc&)
2244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002245 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246 }
2247}
2248
2249void __stdcall glEnableVertexAttribArray(GLuint index)
2250{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002251 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252
2253 try
2254 {
2255 if (index >= gl::MAX_VERTEX_ATTRIBS)
2256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002257 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002258 }
2259
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002260 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002261
2262 if (context)
2263 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002264 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002265 }
2266 }
2267 catch(std::bad_alloc&)
2268 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002269 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270 }
2271}
2272
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002273void __stdcall glEndQueryEXT(GLenum target)
2274{
2275 EVENT("GLenum target = 0x%X)", target);
2276
2277 try
2278 {
2279 switch (target)
2280 {
2281 case GL_ANY_SAMPLES_PASSED_EXT:
2282 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2283 break;
2284 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002285 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002286 }
2287
2288 gl::Context *context = gl::getNonLostContext();
2289
2290 if (context)
2291 {
2292 context->endQuery(target);
2293 }
2294 }
2295 catch(std::bad_alloc&)
2296 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002297 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002298 }
2299}
2300
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002301void __stdcall glFinishFenceNV(GLuint fence)
2302{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002303 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002304
2305 try
2306 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002307 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002308
2309 if (context)
2310 {
2311 gl::Fence* fenceObject = context->getFence(fence);
2312
2313 if (fenceObject == NULL)
2314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002315 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002316 }
2317
2318 fenceObject->finishFence();
2319 }
2320 }
2321 catch(std::bad_alloc&)
2322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002323 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002324 }
2325}
2326
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327void __stdcall glFinish(void)
2328{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002329 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002330
2331 try
2332 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334
2335 if (context)
2336 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002337 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002338 }
2339 }
2340 catch(std::bad_alloc&)
2341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002342 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343 }
2344}
2345
2346void __stdcall glFlush(void)
2347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002348 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002349
2350 try
2351 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002352 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353
2354 if (context)
2355 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002356 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002357 }
2358 }
2359 catch(std::bad_alloc&)
2360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002362 }
2363}
2364
2365void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002367 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002368 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369
2370 try
2371 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002372 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002373 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002375 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376 }
2377
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002379
2380 if (context)
2381 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002382 gl::Framebuffer *framebuffer = NULL;
2383 GLuint framebufferHandle = 0;
2384 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2385 {
2386 framebuffer = context->getReadFramebuffer();
2387 framebufferHandle = context->getReadFramebufferHandle();
2388 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002389 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002390 {
2391 framebuffer = context->getDrawFramebuffer();
2392 framebufferHandle = context->getDrawFramebufferHandle();
2393 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002394
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002395 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002397 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002398 }
2399
2400 switch (attachment)
2401 {
2402 case GL_COLOR_ATTACHMENT0:
2403 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2404 break;
2405 case GL_DEPTH_ATTACHMENT:
2406 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2407 break;
2408 case GL_STENCIL_ATTACHMENT:
2409 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2410 break;
2411 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002412 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002413 }
2414 }
2415 }
2416 catch(std::bad_alloc&)
2417 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002418 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002419 }
2420}
2421
2422void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2423{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002424 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002425 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426
2427 try
2428 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002429 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002432 }
2433
2434 switch (attachment)
2435 {
2436 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002437 case GL_DEPTH_ATTACHMENT:
2438 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439 break;
2440 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002441 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002442 }
2443
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002444 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002445
2446 if (context)
2447 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002448 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002450 textarget = GL_NONE;
2451 }
2452 else
2453 {
2454 gl::Texture *tex = context->getTexture(texture);
2455
2456 if (tex == NULL)
2457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002458 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002459 }
2460
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002461 switch (textarget)
2462 {
2463 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002465 if (tex->getTarget() != GL_TEXTURE_2D)
2466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002468 }
2469 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002470 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002472 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002473 }
2474 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002476
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002477 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002479 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002483 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002484 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002486 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002487 }
2488 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002489 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002491 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002492 }
2493 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002494 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002495
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002496 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002497 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002498 }
2499
2500 if (level != 0)
2501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002502 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002503 }
2504 }
2505
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002506 gl::Framebuffer *framebuffer = NULL;
2507 GLuint framebufferHandle = 0;
2508 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2509 {
2510 framebuffer = context->getReadFramebuffer();
2511 framebufferHandle = context->getReadFramebufferHandle();
2512 }
2513 else
2514 {
2515 framebuffer = context->getDrawFramebuffer();
2516 framebufferHandle = context->getDrawFramebufferHandle();
2517 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002519 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002520 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002521 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002522 }
2523
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002524 switch (attachment)
2525 {
2526 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2527 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2528 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2529 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002530 }
2531 }
2532 catch(std::bad_alloc&)
2533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002534 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535 }
2536}
2537
2538void __stdcall glFrontFace(GLenum mode)
2539{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002540 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541
2542 try
2543 {
2544 switch (mode)
2545 {
2546 case GL_CW:
2547 case GL_CCW:
2548 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002549 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550
2551 if (context)
2552 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002553 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002554 }
2555 }
2556 break;
2557 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002558 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002559 }
2560 }
2561 catch(std::bad_alloc&)
2562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002563 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564 }
2565}
2566
2567void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2568{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002569 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002570
2571 try
2572 {
2573 if (n < 0)
2574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002575 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002576 }
2577
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002578 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002579
2580 if (context)
2581 {
2582 for (int i = 0; i < n; i++)
2583 {
2584 buffers[i] = context->createBuffer();
2585 }
2586 }
2587 }
2588 catch(std::bad_alloc&)
2589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002590 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591 }
2592}
2593
2594void __stdcall glGenerateMipmap(GLenum target)
2595{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002596 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002597
2598 try
2599 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002600 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002601
2602 if (context)
2603 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002604 switch (target)
2605 {
2606 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002607 {
2608 gl::Texture2D *tex2d = context->getTexture2D();
2609
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002610 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002611 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002612 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002613 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002614 if (tex2d->isDepth(0))
2615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002616 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002617 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002618
2619 tex2d->generateMipmaps();
2620 break;
2621 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002622
2623 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002624 {
2625 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2626
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002627 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002629 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002630 }
2631
2632 texcube->generateMipmaps();
2633 break;
2634 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002635
2636 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002638 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002639 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002640 }
2641 catch(std::bad_alloc&)
2642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002643 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002644 }
2645}
2646
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002647void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2648{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002649 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002650
2651 try
2652 {
2653 if (n < 0)
2654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002655 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002656 }
2657
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002658 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002659
2660 if (context)
2661 {
2662 for (int i = 0; i < n; i++)
2663 {
2664 fences[i] = context->createFence();
2665 }
2666 }
2667 }
2668 catch(std::bad_alloc&)
2669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002670 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002671 }
2672}
2673
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2675{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002676 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677
2678 try
2679 {
2680 if (n < 0)
2681 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002682 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002683 }
2684
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002685 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002686
2687 if (context)
2688 {
2689 for (int i = 0; i < n; i++)
2690 {
2691 framebuffers[i] = context->createFramebuffer();
2692 }
2693 }
2694 }
2695 catch(std::bad_alloc&)
2696 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002697 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002698 }
2699}
2700
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002701void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2702{
2703 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2704
2705 try
2706 {
2707 if (n < 0)
2708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002709 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002710 }
2711
2712 gl::Context *context = gl::getNonLostContext();
2713
2714 if (context)
2715 {
2716 for (int i = 0; i < n; i++)
2717 {
2718 ids[i] = context->createQuery();
2719 }
2720 }
2721 }
2722 catch(std::bad_alloc&)
2723 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002724 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002725 }
2726}
2727
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2729{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002730 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731
2732 try
2733 {
2734 if (n < 0)
2735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002736 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002737 }
2738
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002739 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002740
2741 if (context)
2742 {
2743 for (int i = 0; i < n; i++)
2744 {
2745 renderbuffers[i] = context->createRenderbuffer();
2746 }
2747 }
2748 }
2749 catch(std::bad_alloc&)
2750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002751 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752 }
2753}
2754
2755void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2756{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002757 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002758
2759 try
2760 {
2761 if (n < 0)
2762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002764 }
2765
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002766 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767
2768 if (context)
2769 {
2770 for (int i = 0; i < n; i++)
2771 {
2772 textures[i] = context->createTexture();
2773 }
2774 }
2775 }
2776 catch(std::bad_alloc&)
2777 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002778 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002779 }
2780}
2781
daniel@transgaming.com85423182010-04-22 13:35:27 +00002782void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002783{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002784 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002785 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002786 program, index, bufsize, length, size, type, name);
2787
2788 try
2789 {
2790 if (bufsize < 0)
2791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002792 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002793 }
2794
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002795 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002796
2797 if (context)
2798 {
2799 gl::Program *programObject = context->getProgram(program);
2800
2801 if (!programObject)
2802 {
2803 if (context->getShader(program))
2804 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002805 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002806 }
2807 else
2808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002809 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002810 }
2811 }
2812
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002813 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002816 }
2817
2818 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2819 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002820 }
2821 catch(std::bad_alloc&)
2822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002824 }
2825}
2826
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002827void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002828{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002829 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002830 "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 +00002831 program, index, bufsize, length, size, type, name);
2832
2833 try
2834 {
2835 if (bufsize < 0)
2836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002837 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002838 }
2839
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002840 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002841
2842 if (context)
2843 {
2844 gl::Program *programObject = context->getProgram(program);
2845
2846 if (!programObject)
2847 {
2848 if (context->getShader(program))
2849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002850 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002851 }
2852 else
2853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002855 }
2856 }
2857
2858 if (index >= (GLuint)programObject->getActiveUniformCount())
2859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002861 }
2862
2863 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2864 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002865 }
2866 catch(std::bad_alloc&)
2867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002869 }
2870}
2871
2872void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2873{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002874 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 +00002875 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002876
2877 try
2878 {
2879 if (maxcount < 0)
2880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002882 }
2883
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002884 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002885
2886 if (context)
2887 {
2888 gl::Program *programObject = context->getProgram(program);
2889
2890 if (!programObject)
2891 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002892 if (context->getShader(program))
2893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002894 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002895 }
2896 else
2897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002898 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002899 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002900 }
2901
2902 return programObject->getAttachedShaders(maxcount, count, shaders);
2903 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002904 }
2905 catch(std::bad_alloc&)
2906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002907 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002908 }
2909}
2910
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002911int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002913 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002914
2915 try
2916 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002917 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918
2919 if (context)
2920 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002921
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002922 gl::Program *programObject = context->getProgram(program);
2923
2924 if (!programObject)
2925 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002926 if (context->getShader(program))
2927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002928 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002929 }
2930 else
2931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002932 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002933 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 }
2935
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002936 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002937 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002939 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002940 }
2941
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002942 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002943 }
2944 }
2945 catch(std::bad_alloc&)
2946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002947 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948 }
2949
2950 return -1;
2951}
2952
2953void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002955 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956
2957 try
2958 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002959 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002960
2961 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002962 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002963 if (!(context->getBooleanv(pname, params)))
2964 {
2965 GLenum nativeType;
2966 unsigned int numParams = 0;
2967 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002968 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002969
2970 if (numParams == 0)
2971 return; // it is known that the pname is valid, but there are no parameters to return
2972
2973 if (nativeType == GL_FLOAT)
2974 {
2975 GLfloat *floatParams = NULL;
2976 floatParams = new GLfloat[numParams];
2977
2978 context->getFloatv(pname, floatParams);
2979
2980 for (unsigned int i = 0; i < numParams; ++i)
2981 {
2982 if (floatParams[i] == 0.0f)
2983 params[i] = GL_FALSE;
2984 else
2985 params[i] = GL_TRUE;
2986 }
2987
2988 delete [] floatParams;
2989 }
2990 else if (nativeType == GL_INT)
2991 {
2992 GLint *intParams = NULL;
2993 intParams = new GLint[numParams];
2994
2995 context->getIntegerv(pname, intParams);
2996
2997 for (unsigned int i = 0; i < numParams; ++i)
2998 {
2999 if (intParams[i] == 0)
3000 params[i] = GL_FALSE;
3001 else
3002 params[i] = GL_TRUE;
3003 }
3004
3005 delete [] intParams;
3006 }
3007 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 }
3009 }
3010 catch(std::bad_alloc&)
3011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003012 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003013 }
3014}
3015
3016void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3017{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003018 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 +00003019
3020 try
3021 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003022 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003023
3024 if (context)
3025 {
3026 gl::Buffer *buffer;
3027
3028 switch (target)
3029 {
3030 case GL_ARRAY_BUFFER:
3031 buffer = context->getArrayBuffer();
3032 break;
3033 case GL_ELEMENT_ARRAY_BUFFER:
3034 buffer = context->getElementArrayBuffer();
3035 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003036 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003037 }
3038
3039 if (!buffer)
3040 {
3041 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003042 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003043 }
3044
3045 switch (pname)
3046 {
3047 case GL_BUFFER_USAGE:
3048 *params = buffer->usage();
3049 break;
3050 case GL_BUFFER_SIZE:
3051 *params = buffer->size();
3052 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003053 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003054 }
3055 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003056 }
3057 catch(std::bad_alloc&)
3058 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003059 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060 }
3061}
3062
3063GLenum __stdcall glGetError(void)
3064{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003065 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066
3067 gl::Context *context = gl::getContext();
3068
3069 if (context)
3070 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003071 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003072 }
3073
3074 return GL_NO_ERROR;
3075}
3076
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003077void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003079 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003080
3081 try
3082 {
3083
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003084 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003085
3086 if (context)
3087 {
3088 gl::Fence *fenceObject = context->getFence(fence);
3089
3090 if (fenceObject == NULL)
3091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003092 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003093 }
3094
3095 fenceObject->getFenceiv(pname, params);
3096 }
3097 }
3098 catch(std::bad_alloc&)
3099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003100 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003101 }
3102}
3103
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003104void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003106 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003107
3108 try
3109 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003111
3112 if (context)
3113 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003114 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003115 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003116 GLenum nativeType;
3117 unsigned int numParams = 0;
3118 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003119 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003120
3121 if (numParams == 0)
3122 return; // it is known that the pname is valid, but that there are no parameters to return.
3123
3124 if (nativeType == GL_BOOL)
3125 {
3126 GLboolean *boolParams = NULL;
3127 boolParams = new GLboolean[numParams];
3128
3129 context->getBooleanv(pname, boolParams);
3130
3131 for (unsigned int i = 0; i < numParams; ++i)
3132 {
3133 if (boolParams[i] == GL_FALSE)
3134 params[i] = 0.0f;
3135 else
3136 params[i] = 1.0f;
3137 }
3138
3139 delete [] boolParams;
3140 }
3141 else if (nativeType == GL_INT)
3142 {
3143 GLint *intParams = NULL;
3144 intParams = new GLint[numParams];
3145
3146 context->getIntegerv(pname, intParams);
3147
3148 for (unsigned int i = 0; i < numParams; ++i)
3149 {
3150 params[i] = (GLfloat)intParams[i];
3151 }
3152
3153 delete [] intParams;
3154 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003155 }
3156 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003157 }
3158 catch(std::bad_alloc&)
3159 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003160 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003161 }
3162}
3163
3164void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3165{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003166 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 +00003167 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003168
3169 try
3170 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003172
3173 if (context)
3174 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003175 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003177 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003178 }
3179
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003180 gl::Framebuffer *framebuffer = NULL;
3181 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3182 {
3183 if(context->getReadFramebufferHandle() == 0)
3184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003185 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003186 }
3187
3188 framebuffer = context->getReadFramebuffer();
3189 }
3190 else
3191 {
3192 if (context->getDrawFramebufferHandle() == 0)
3193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003194 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003195 }
3196
3197 framebuffer = context->getDrawFramebuffer();
3198 }
3199
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003200 GLenum attachmentType;
3201 GLuint attachmentHandle;
3202 switch (attachment)
3203 {
3204 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003205 attachmentType = framebuffer->getColorbufferType();
3206 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003207 break;
3208 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003209 attachmentType = framebuffer->getDepthbufferType();
3210 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003211 break;
3212 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003213 attachmentType = framebuffer->getStencilbufferType();
3214 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003215 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003216 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003217 }
3218
3219 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003220 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003221 {
3222 attachmentObjectType = attachmentType;
3223 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003224 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003225 {
3226 attachmentObjectType = GL_TEXTURE;
3227 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003228 else
3229 {
3230 UNREACHABLE();
3231 return;
3232 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003233
3234 switch (pname)
3235 {
3236 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3237 *params = attachmentObjectType;
3238 break;
3239 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3240 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3241 {
3242 *params = attachmentHandle;
3243 }
3244 else
3245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003247 }
3248 break;
3249 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3250 if (attachmentObjectType == GL_TEXTURE)
3251 {
3252 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3253 }
3254 else
3255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003256 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003257 }
3258 break;
3259 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3260 if (attachmentObjectType == GL_TEXTURE)
3261 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003262 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003263 {
3264 *params = attachmentType;
3265 }
3266 else
3267 {
3268 *params = 0;
3269 }
3270 }
3271 else
3272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003273 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003274 }
3275 break;
3276 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003277 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003278 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279 }
3280 }
3281 catch(std::bad_alloc&)
3282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003283 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003284 }
3285}
3286
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003287GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3288{
3289 EVENT("()");
3290
3291 try
3292 {
3293 gl::Context *context = gl::getContext();
3294
3295 if (context)
3296 {
3297 return context->getResetStatus();
3298 }
3299
3300 return GL_NO_ERROR;
3301 }
3302 catch(std::bad_alloc&)
3303 {
3304 return GL_OUT_OF_MEMORY;
3305 }
3306}
3307
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003308void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3309{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003310 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003311
3312 try
3313 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003314 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315
3316 if (context)
3317 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003318 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003319 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003320 GLenum nativeType;
3321 unsigned int numParams = 0;
3322 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003323 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003324
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003325 if (numParams == 0)
3326 return; // it is known that pname is valid, but there are no parameters to return
3327
3328 if (nativeType == GL_BOOL)
3329 {
3330 GLboolean *boolParams = NULL;
3331 boolParams = new GLboolean[numParams];
3332
3333 context->getBooleanv(pname, boolParams);
3334
3335 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003336 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003337 if (boolParams[i] == GL_FALSE)
3338 params[i] = 0;
3339 else
3340 params[i] = 1;
3341 }
3342
3343 delete [] boolParams;
3344 }
3345 else if (nativeType == GL_FLOAT)
3346 {
3347 GLfloat *floatParams = NULL;
3348 floatParams = new GLfloat[numParams];
3349
3350 context->getFloatv(pname, floatParams);
3351
3352 for (unsigned int i = 0; i < numParams; ++i)
3353 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003354 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 +00003355 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003356 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003358 else
3359 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 +00003360 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003361
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003362 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003363 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365 }
3366 }
3367 catch(std::bad_alloc&)
3368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003369 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003370 }
3371}
3372
3373void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3374{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003375 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003376
3377 try
3378 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003380
3381 if (context)
3382 {
3383 gl::Program *programObject = context->getProgram(program);
3384
3385 if (!programObject)
3386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003387 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003388 }
3389
3390 switch (pname)
3391 {
3392 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003393 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003394 return;
3395 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003396 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397 return;
3398 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003399 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 return;
3401 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003402 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 return;
3404 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003405 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 return;
3407 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003408 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 return;
3410 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003411 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 return;
3413 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003414 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003415 return;
3416 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003417 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003419 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003420 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003421 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003422 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003423 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424 }
3425 }
3426 }
3427 catch(std::bad_alloc&)
3428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003429 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 }
3431}
3432
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003433void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003435 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 +00003436 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003437
3438 try
3439 {
3440 if (bufsize < 0)
3441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003442 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003443 }
3444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003446
3447 if (context)
3448 {
3449 gl::Program *programObject = context->getProgram(program);
3450
3451 if (!programObject)
3452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003453 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003454 }
3455
3456 programObject->getInfoLog(bufsize, length, infolog);
3457 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003458 }
3459 catch(std::bad_alloc&)
3460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003461 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462 }
3463}
3464
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003465void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3466{
3467 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3468
3469 try
3470 {
3471 switch (pname)
3472 {
3473 case GL_CURRENT_QUERY_EXT:
3474 break;
3475 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003476 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003477 }
3478
3479 gl::Context *context = gl::getNonLostContext();
3480
3481 if (context)
3482 {
3483 params[0] = context->getActiveQuery(target);
3484 }
3485 }
3486 catch(std::bad_alloc&)
3487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003488 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003489 }
3490}
3491
3492void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3493{
3494 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3495
3496 try
3497 {
3498 switch (pname)
3499 {
3500 case GL_QUERY_RESULT_EXT:
3501 case GL_QUERY_RESULT_AVAILABLE_EXT:
3502 break;
3503 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003504 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003505 }
3506 gl::Context *context = gl::getNonLostContext();
3507
3508 if (context)
3509 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003510 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3511
3512 if (!queryObject)
3513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003515 }
3516
3517 if (context->getActiveQuery(queryObject->getType()) == id)
3518 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003519 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003520 }
3521
3522 switch(pname)
3523 {
3524 case GL_QUERY_RESULT_EXT:
3525 params[0] = queryObject->getResult();
3526 break;
3527 case GL_QUERY_RESULT_AVAILABLE_EXT:
3528 params[0] = queryObject->isResultAvailable();
3529 break;
3530 default:
3531 ASSERT(false);
3532 }
3533 }
3534 }
3535 catch(std::bad_alloc&)
3536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003537 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003538 }
3539}
3540
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003541void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3542{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003543 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 +00003544
3545 try
3546 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003547 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003548
3549 if (context)
3550 {
3551 if (target != GL_RENDERBUFFER)
3552 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003553 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003554 }
3555
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003556 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003557 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003558 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003559 }
3560
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003561 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003562
3563 switch (pname)
3564 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003565 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3566 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3567 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3568 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3569 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3570 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3571 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3572 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3573 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003574 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003575 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003576 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003577 *params = renderbuffer->getSamples();
3578 }
3579 else
3580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003581 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003582 }
3583 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003584 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003586 }
3587 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588 }
3589 catch(std::bad_alloc&)
3590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592 }
3593}
3594
3595void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003597 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598
3599 try
3600 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003601 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003602
3603 if (context)
3604 {
3605 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003606
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003607 if (!shaderObject)
3608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003609 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003610 }
3611
3612 switch (pname)
3613 {
3614 case GL_SHADER_TYPE:
3615 *params = shaderObject->getType();
3616 return;
3617 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003618 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003619 return;
3620 case GL_COMPILE_STATUS:
3621 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3622 return;
3623 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003624 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625 return;
3626 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003627 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003628 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003629 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3630 *params = shaderObject->getTranslatedSourceLength();
3631 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003632 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003634 }
3635 }
3636 }
3637 catch(std::bad_alloc&)
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003640 }
3641}
3642
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003643void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003645 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 +00003646 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003647
3648 try
3649 {
3650 if (bufsize < 0)
3651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003652 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003653 }
3654
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003655 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003656
3657 if (context)
3658 {
3659 gl::Shader *shaderObject = context->getShader(shader);
3660
3661 if (!shaderObject)
3662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003664 }
3665
3666 shaderObject->getInfoLog(bufsize, length, infolog);
3667 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003668 }
3669 catch(std::bad_alloc&)
3670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003671 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003672 }
3673}
3674
3675void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3676{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003677 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 +00003678 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003679
3680 try
3681 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003682 switch (shadertype)
3683 {
3684 case GL_VERTEX_SHADER:
3685 case GL_FRAGMENT_SHADER:
3686 break;
3687 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003688 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003689 }
3690
3691 switch (precisiontype)
3692 {
3693 case GL_LOW_FLOAT:
3694 case GL_MEDIUM_FLOAT:
3695 case GL_HIGH_FLOAT:
3696 // Assume IEEE 754 precision
3697 range[0] = 127;
3698 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003699 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003700 break;
3701 case GL_LOW_INT:
3702 case GL_MEDIUM_INT:
3703 case GL_HIGH_INT:
3704 // Some (most) hardware only supports single-precision floating-point numbers,
3705 // which can accurately represent integers up to +/-16777216
3706 range[0] = 24;
3707 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003708 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003709 break;
3710 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003711 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003712 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003713 }
3714 catch(std::bad_alloc&)
3715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003716 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003717 }
3718}
3719
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003720void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003721{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003722 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 +00003723 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003724
3725 try
3726 {
3727 if (bufsize < 0)
3728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003729 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003730 }
3731
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003732 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003733
3734 if (context)
3735 {
3736 gl::Shader *shaderObject = context->getShader(shader);
3737
3738 if (!shaderObject)
3739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003740 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003741 }
3742
3743 shaderObject->getSource(bufsize, length, source);
3744 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003745 }
3746 catch(std::bad_alloc&)
3747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003749 }
3750}
3751
zmo@google.coma574f782011-10-03 21:45:23 +00003752void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3753{
3754 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3755 shader, bufsize, length, source);
3756
3757 try
3758 {
3759 if (bufsize < 0)
3760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003761 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003762 }
3763
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003764 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003765
3766 if (context)
3767 {
3768 gl::Shader *shaderObject = context->getShader(shader);
3769
3770 if (!shaderObject)
3771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003772 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003773 }
3774
3775 shaderObject->getTranslatedSource(bufsize, length, source);
3776 }
3777 }
3778 catch(std::bad_alloc&)
3779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003780 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003781 }
3782}
3783
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003784const GLubyte* __stdcall glGetString(GLenum name)
3785{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003786 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787
3788 try
3789 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003791
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003792 switch (name)
3793 {
3794 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003795 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003796 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003797 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003799 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003801 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003803 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003804 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003805 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806 }
3807 }
3808 catch(std::bad_alloc&)
3809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003810 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003811 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812}
3813
3814void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3815{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003816 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 +00003817
3818 try
3819 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003820 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003821
3822 if (context)
3823 {
3824 gl::Texture *texture;
3825
3826 switch (target)
3827 {
3828 case GL_TEXTURE_2D:
3829 texture = context->getTexture2D();
3830 break;
3831 case GL_TEXTURE_CUBE_MAP:
3832 texture = context->getTextureCubeMap();
3833 break;
3834 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003835 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003836 }
3837
3838 switch (pname)
3839 {
3840 case GL_TEXTURE_MAG_FILTER:
3841 *params = (GLfloat)texture->getMagFilter();
3842 break;
3843 case GL_TEXTURE_MIN_FILTER:
3844 *params = (GLfloat)texture->getMinFilter();
3845 break;
3846 case GL_TEXTURE_WRAP_S:
3847 *params = (GLfloat)texture->getWrapS();
3848 break;
3849 case GL_TEXTURE_WRAP_T:
3850 *params = (GLfloat)texture->getWrapT();
3851 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003852 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3853 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3854 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003855 case GL_TEXTURE_USAGE_ANGLE:
3856 *params = (GLfloat)texture->getUsage();
3857 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003858 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3859 if (!context->supportsTextureFilterAnisotropy())
3860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003861 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003862 }
3863 *params = (GLfloat)texture->getMaxAnisotropy();
3864 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003865 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003866 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003867 }
3868 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003869 }
3870 catch(std::bad_alloc&)
3871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003872 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873 }
3874}
3875
3876void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3877{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003878 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 +00003879
3880 try
3881 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003882 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003883
3884 if (context)
3885 {
3886 gl::Texture *texture;
3887
3888 switch (target)
3889 {
3890 case GL_TEXTURE_2D:
3891 texture = context->getTexture2D();
3892 break;
3893 case GL_TEXTURE_CUBE_MAP:
3894 texture = context->getTextureCubeMap();
3895 break;
3896 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003897 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003898 }
3899
3900 switch (pname)
3901 {
3902 case GL_TEXTURE_MAG_FILTER:
3903 *params = texture->getMagFilter();
3904 break;
3905 case GL_TEXTURE_MIN_FILTER:
3906 *params = texture->getMinFilter();
3907 break;
3908 case GL_TEXTURE_WRAP_S:
3909 *params = texture->getWrapS();
3910 break;
3911 case GL_TEXTURE_WRAP_T:
3912 *params = texture->getWrapT();
3913 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003914 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3915 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3916 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003917 case GL_TEXTURE_USAGE_ANGLE:
3918 *params = texture->getUsage();
3919 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003920 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3921 if (!context->supportsTextureFilterAnisotropy())
3922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003923 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003924 }
3925 *params = (GLint)texture->getMaxAnisotropy();
3926 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003927 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003928 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003929 }
3930 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003931 }
3932 catch(std::bad_alloc&)
3933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003934 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003935 }
3936}
3937
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003938void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3939{
3940 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3941 program, location, bufSize, params);
3942
3943 try
3944 {
3945 if (bufSize < 0)
3946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003948 }
3949
3950 gl::Context *context = gl::getNonLostContext();
3951
3952 if (context)
3953 {
3954 if (program == 0)
3955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003956 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003957 }
3958
3959 gl::Program *programObject = context->getProgram(program);
3960
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003961 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003964 }
3965
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003966 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3967 if (!programBinary)
3968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003969 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003970 }
3971
3972 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003975 }
3976 }
3977 }
3978 catch(std::bad_alloc&)
3979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003980 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003981 }
3982}
3983
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003984void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3985{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003986 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003987
3988 try
3989 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003990 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003991
3992 if (context)
3993 {
3994 if (program == 0)
3995 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003996 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003997 }
3998
3999 gl::Program *programObject = context->getProgram(program);
4000
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004001 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004003 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004004 }
4005
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004006 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4007 if (!programBinary)
4008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004009 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004010 }
4011
4012 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004014 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004015 }
4016 }
4017 }
4018 catch(std::bad_alloc&)
4019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004020 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004021 }
4022}
4023
4024void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4025{
4026 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4027 program, location, bufSize, params);
4028
4029 try
4030 {
4031 if (bufSize < 0)
4032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004034 }
4035
4036 gl::Context *context = gl::getNonLostContext();
4037
4038 if (context)
4039 {
4040 if (program == 0)
4041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004042 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004043 }
4044
4045 gl::Program *programObject = context->getProgram(program);
4046
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004047 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004049 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004050 }
4051
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004052 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4053 if (!programBinary)
4054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004055 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004056 }
4057
4058 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004061 }
4062 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004063 }
4064 catch(std::bad_alloc&)
4065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067 }
4068}
4069
4070void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4071{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004072 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073
4074 try
4075 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004077
4078 if (context)
4079 {
4080 if (program == 0)
4081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004083 }
4084
4085 gl::Program *programObject = context->getProgram(program);
4086
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004087 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004089 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004090 }
4091
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004092 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4093 if (!programBinary)
4094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004095 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004096 }
4097
4098 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004100 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004101 }
4102 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004103 }
4104 catch(std::bad_alloc&)
4105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004106 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004107 }
4108}
4109
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004110int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004112 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004113
4114 try
4115 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004116 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004117
4118 if (strstr(name, "gl_") == name)
4119 {
4120 return -1;
4121 }
4122
4123 if (context)
4124 {
4125 gl::Program *programObject = context->getProgram(program);
4126
4127 if (!programObject)
4128 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004129 if (context->getShader(program))
4130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004131 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004132 }
4133 else
4134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004135 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004136 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004137 }
4138
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004139 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004140 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004142 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004143 }
4144
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004145 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004146 }
4147 }
4148 catch(std::bad_alloc&)
4149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004150 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004151 }
4152
4153 return -1;
4154}
4155
4156void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4157{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004158 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159
4160 try
4161 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004163
daniel@transgaming.come0078962010-04-15 20:45:08 +00004164 if (context)
4165 {
4166 if (index >= gl::MAX_VERTEX_ATTRIBS)
4167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004168 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004169 }
4170
daniel@transgaming.com83921382011-01-08 05:46:00 +00004171 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004172
daniel@transgaming.come0078962010-04-15 20:45:08 +00004173 switch (pname)
4174 {
4175 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004176 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004177 break;
4178 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004179 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004180 break;
4181 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004182 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004183 break;
4184 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004185 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004186 break;
4187 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004188 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004189 break;
4190 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004191 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004192 break;
4193 case GL_CURRENT_VERTEX_ATTRIB:
4194 for (int i = 0; i < 4; ++i)
4195 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004196 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004197 }
4198 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004199 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4200 *params = (GLfloat)attribState.mDivisor;
4201 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004202 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004203 }
4204 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004205 }
4206 catch(std::bad_alloc&)
4207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004208 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209 }
4210}
4211
4212void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004214 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004215
4216 try
4217 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004218 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004219
daniel@transgaming.come0078962010-04-15 20:45:08 +00004220 if (context)
4221 {
4222 if (index >= gl::MAX_VERTEX_ATTRIBS)
4223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004225 }
4226
daniel@transgaming.com83921382011-01-08 05:46:00 +00004227 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004228
daniel@transgaming.come0078962010-04-15 20:45:08 +00004229 switch (pname)
4230 {
4231 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004232 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004233 break;
4234 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004235 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004236 break;
4237 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004238 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004239 break;
4240 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004241 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004242 break;
4243 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004244 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004245 break;
4246 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004247 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004248 break;
4249 case GL_CURRENT_VERTEX_ATTRIB:
4250 for (int i = 0; i < 4; ++i)
4251 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004252 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004253 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4254 }
4255 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004256 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4257 *params = (GLint)attribState.mDivisor;
4258 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004259 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004260 }
4261 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004262 }
4263 catch(std::bad_alloc&)
4264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004265 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266 }
4267}
4268
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004269void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004270{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004271 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272
4273 try
4274 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004275 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004276
daniel@transgaming.come0078962010-04-15 20:45:08 +00004277 if (context)
4278 {
4279 if (index >= gl::MAX_VERTEX_ATTRIBS)
4280 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004281 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004282 }
4283
4284 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4285 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004286 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004287 }
4288
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004289 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004290 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004291 }
4292 catch(std::bad_alloc&)
4293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004294 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295 }
4296}
4297
4298void __stdcall glHint(GLenum target, GLenum mode)
4299{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004300 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004301
4302 try
4303 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004304 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004305 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004306 case GL_FASTEST:
4307 case GL_NICEST:
4308 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004309 break;
4310 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004311 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004312 }
4313
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004314 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004315 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004316 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004317 case GL_GENERATE_MIPMAP_HINT:
4318 if (context) context->setGenerateMipmapHint(mode);
4319 break;
4320 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4321 if (context) context->setFragmentShaderDerivativeHint(mode);
4322 break;
4323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004325 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004326 }
4327 catch(std::bad_alloc&)
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330 }
4331}
4332
4333GLboolean __stdcall glIsBuffer(GLuint buffer)
4334{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004335 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004336
4337 try
4338 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004339 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004340
4341 if (context && buffer)
4342 {
4343 gl::Buffer *bufferObject = context->getBuffer(buffer);
4344
4345 if (bufferObject)
4346 {
4347 return GL_TRUE;
4348 }
4349 }
4350 }
4351 catch(std::bad_alloc&)
4352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004353 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004354 }
4355
4356 return GL_FALSE;
4357}
4358
4359GLboolean __stdcall glIsEnabled(GLenum cap)
4360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004361 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004362
4363 try
4364 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004365 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366
4367 if (context)
4368 {
4369 switch (cap)
4370 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004371 case GL_CULL_FACE: return context->isCullFaceEnabled();
4372 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4373 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4374 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4375 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4376 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4377 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4378 case GL_BLEND: return context->isBlendEnabled();
4379 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004380 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004381 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004382 }
4383 }
4384 }
4385 catch(std::bad_alloc&)
4386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004387 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004388 }
4389
4390 return false;
4391}
4392
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004393GLboolean __stdcall glIsFenceNV(GLuint fence)
4394{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004395 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004396
4397 try
4398 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004399 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004400
4401 if (context)
4402 {
4403 gl::Fence *fenceObject = context->getFence(fence);
4404
4405 if (fenceObject == NULL)
4406 {
4407 return GL_FALSE;
4408 }
4409
4410 return fenceObject->isFence();
4411 }
4412 }
4413 catch(std::bad_alloc&)
4414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004415 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004416 }
4417
4418 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004419}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004420
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004421GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4422{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004423 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004424
4425 try
4426 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004427 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428
4429 if (context && framebuffer)
4430 {
4431 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4432
4433 if (framebufferObject)
4434 {
4435 return GL_TRUE;
4436 }
4437 }
4438 }
4439 catch(std::bad_alloc&)
4440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004441 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442 }
4443
4444 return GL_FALSE;
4445}
4446
4447GLboolean __stdcall glIsProgram(GLuint program)
4448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004449 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004450
4451 try
4452 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004453 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004454
4455 if (context && program)
4456 {
4457 gl::Program *programObject = context->getProgram(program);
4458
4459 if (programObject)
4460 {
4461 return GL_TRUE;
4462 }
4463 }
4464 }
4465 catch(std::bad_alloc&)
4466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004467 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004468 }
4469
4470 return GL_FALSE;
4471}
4472
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004473GLboolean __stdcall glIsQueryEXT(GLuint id)
4474{
4475 EVENT("(GLuint id = %d)", id);
4476
4477 try
4478 {
4479 if (id == 0)
4480 {
4481 return GL_FALSE;
4482 }
4483
4484 gl::Context *context = gl::getNonLostContext();
4485
4486 if (context)
4487 {
4488 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4489
4490 if (queryObject)
4491 {
4492 return GL_TRUE;
4493 }
4494 }
4495 }
4496 catch(std::bad_alloc&)
4497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004498 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004499 }
4500
4501 return GL_FALSE;
4502}
4503
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004504GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4505{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004506 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004507
4508 try
4509 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004511
4512 if (context && renderbuffer)
4513 {
4514 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4515
4516 if (renderbufferObject)
4517 {
4518 return GL_TRUE;
4519 }
4520 }
4521 }
4522 catch(std::bad_alloc&)
4523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004524 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004525 }
4526
4527 return GL_FALSE;
4528}
4529
4530GLboolean __stdcall glIsShader(GLuint shader)
4531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004532 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004533
4534 try
4535 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004536 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004537
4538 if (context && shader)
4539 {
4540 gl::Shader *shaderObject = context->getShader(shader);
4541
4542 if (shaderObject)
4543 {
4544 return GL_TRUE;
4545 }
4546 }
4547 }
4548 catch(std::bad_alloc&)
4549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004550 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004551 }
4552
4553 return GL_FALSE;
4554}
4555
4556GLboolean __stdcall glIsTexture(GLuint texture)
4557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004558 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004559
4560 try
4561 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004562 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004563
4564 if (context && texture)
4565 {
4566 gl::Texture *textureObject = context->getTexture(texture);
4567
4568 if (textureObject)
4569 {
4570 return GL_TRUE;
4571 }
4572 }
4573 }
4574 catch(std::bad_alloc&)
4575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004576 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004577 }
4578
4579 return GL_FALSE;
4580}
4581
4582void __stdcall glLineWidth(GLfloat width)
4583{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004584 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585
4586 try
4587 {
4588 if (width <= 0.0f)
4589 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004590 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004591 }
4592
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004593 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004594
4595 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004596 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004597 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004598 }
4599 }
4600 catch(std::bad_alloc&)
4601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603 }
4604}
4605
4606void __stdcall glLinkProgram(GLuint program)
4607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004608 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004609
4610 try
4611 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004612 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004613
4614 if (context)
4615 {
4616 gl::Program *programObject = context->getProgram(program);
4617
4618 if (!programObject)
4619 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004620 if (context->getShader(program))
4621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004622 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004623 }
4624 else
4625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004626 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004627 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004628 }
4629
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004630 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004631 }
4632 }
4633 catch(std::bad_alloc&)
4634 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004635 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636 }
4637}
4638
4639void __stdcall glPixelStorei(GLenum pname, GLint param)
4640{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004641 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642
4643 try
4644 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004645 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004646
4647 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004648 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004649 switch (pname)
4650 {
4651 case GL_UNPACK_ALIGNMENT:
4652 if (param != 1 && param != 2 && param != 4 && param != 8)
4653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004654 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004655 }
4656
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004657 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004658 break;
4659
4660 case GL_PACK_ALIGNMENT:
4661 if (param != 1 && param != 2 && param != 4 && param != 8)
4662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004664 }
4665
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004666 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004667 break;
4668
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004669 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4670 context->setPackReverseRowOrder(param != 0);
4671 break;
4672
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004673 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004674 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004675 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004676 }
4677 }
4678 catch(std::bad_alloc&)
4679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004680 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681 }
4682}
4683
4684void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4685{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004686 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687
4688 try
4689 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004690 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004691
4692 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004693 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004694 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004695 }
4696 }
4697 catch(std::bad_alloc&)
4698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004700 }
4701}
4702
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004703void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4704 GLenum format, GLenum type, GLsizei bufSize,
4705 GLvoid *data)
4706{
4707 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4708 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4709 x, y, width, height, format, type, bufSize, data);
4710
4711 try
4712 {
4713 if (width < 0 || height < 0 || bufSize < 0)
4714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004716 }
4717
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004718 gl::Context *context = gl::getNonLostContext();
4719
4720 if (context)
4721 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004722 GLenum currentFormat, currentType;
4723
4724 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4725 // and attempting to read back if that's the case is an error. The error will be registered
4726 // by getCurrentReadFormat.
4727 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4728 return;
4729
4730 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4731 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004732 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004733 }
4734
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004735 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4736 }
4737 }
4738 catch(std::bad_alloc&)
4739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004740 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004741 }
4742}
4743
4744void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4745 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004746{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004747 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004748 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004749 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750
4751 try
4752 {
4753 if (width < 0 || height < 0)
4754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004755 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004756 }
4757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004759
4760 if (context)
4761 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004762 GLenum currentFormat, currentType;
4763
4764 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4765 // and attempting to read back if that's the case is an error. The error will be registered
4766 // by getCurrentReadFormat.
4767 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4768 return;
4769
4770 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004772 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004773 }
4774
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004775 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004776 }
4777 }
4778 catch(std::bad_alloc&)
4779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004780 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781 }
4782}
4783
4784void __stdcall glReleaseShaderCompiler(void)
4785{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004786 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004787
4788 try
4789 {
4790 gl::Shader::releaseCompiler();
4791 }
4792 catch(std::bad_alloc&)
4793 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004794 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004795 }
4796}
4797
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004798void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004799{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004800 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 +00004801 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802
4803 try
4804 {
4805 switch (target)
4806 {
4807 case GL_RENDERBUFFER:
4808 break;
4809 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004810 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004811 }
4812
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004813 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004815 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004816 }
4817
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004818 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004820 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004821 }
4822
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004823 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824
4825 if (context)
4826 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004827 if (width > context->getMaximumRenderbufferDimension() ||
4828 height > context->getMaximumRenderbufferDimension() ||
4829 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004831 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004832 }
4833
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004834 GLuint handle = context->getRenderbufferHandle();
4835 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004836 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004837 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004838 }
4839
4840 switch (internalformat)
4841 {
4842 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004843 case GL_RGBA4:
4844 case GL_RGB5_A1:
4845 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004846 case GL_RGB8_OES:
4847 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004849 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004850 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004851 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854 }
4855 }
4856 }
4857 catch(std::bad_alloc&)
4858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004860 }
4861}
4862
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004863void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4864{
4865 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4866}
4867
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004868void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4869{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004870 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004871
4872 try
4873 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004874 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004875
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004876 if (context)
4877 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004878 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004879 }
4880 }
4881 catch(std::bad_alloc&)
4882 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004883 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004884 }
4885}
4886
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004887void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4888{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004889 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004890
4891 try
4892 {
4893 if (condition != GL_ALL_COMPLETED_NV)
4894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004895 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004896 }
4897
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004898 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004899
4900 if (context)
4901 {
4902 gl::Fence *fenceObject = context->getFence(fence);
4903
4904 if (fenceObject == NULL)
4905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004906 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004907 }
4908
4909 fenceObject->setFence(condition);
4910 }
4911 }
4912 catch(std::bad_alloc&)
4913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004914 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004915 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004916}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004917
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004920 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 +00004921
4922 try
4923 {
4924 if (width < 0 || height < 0)
4925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004926 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004927 }
4928
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004929 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004930
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004931 if (context)
4932 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004933 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934 }
4935 }
4936 catch(std::bad_alloc&)
4937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004938 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004939 }
4940}
4941
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004942void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004944 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004945 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004946 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947
4948 try
4949 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004950 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004951 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004952 }
4953 catch(std::bad_alloc&)
4954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004955 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004956 }
4957}
4958
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004959void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004961 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 +00004962 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004963
4964 try
4965 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004966 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004968 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004969 }
4970
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004972
4973 if (context)
4974 {
4975 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004976
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004977 if (!shaderObject)
4978 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004979 if (context->getProgram(shader))
4980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004981 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004982 }
4983 else
4984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004986 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004987 }
4988
4989 shaderObject->setSource(count, string, length);
4990 }
4991 }
4992 catch(std::bad_alloc&)
4993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004994 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995 }
4996}
4997
4998void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4999{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005000 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005001}
5002
5003void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5004{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005005 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 +00005006
5007 try
5008 {
5009 switch (face)
5010 {
5011 case GL_FRONT:
5012 case GL_BACK:
5013 case GL_FRONT_AND_BACK:
5014 break;
5015 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005016 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005017 }
5018
5019 switch (func)
5020 {
5021 case GL_NEVER:
5022 case GL_ALWAYS:
5023 case GL_LESS:
5024 case GL_LEQUAL:
5025 case GL_EQUAL:
5026 case GL_GEQUAL:
5027 case GL_GREATER:
5028 case GL_NOTEQUAL:
5029 break;
5030 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005031 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032 }
5033
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005034 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035
5036 if (context)
5037 {
5038 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5039 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005040 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005041 }
5042
5043 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5044 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005045 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046 }
5047 }
5048 }
5049 catch(std::bad_alloc&)
5050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005051 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005052 }
5053}
5054
5055void __stdcall glStencilMask(GLuint mask)
5056{
5057 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5058}
5059
5060void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005062 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005063
5064 try
5065 {
5066 switch (face)
5067 {
5068 case GL_FRONT:
5069 case GL_BACK:
5070 case GL_FRONT_AND_BACK:
5071 break;
5072 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005073 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074 }
5075
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005076 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005077
5078 if (context)
5079 {
5080 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5081 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005082 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005083 }
5084
5085 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5086 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005087 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088 }
5089 }
5090 }
5091 catch(std::bad_alloc&)
5092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005093 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094 }
5095}
5096
5097void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5098{
5099 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5100}
5101
5102void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5103{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005104 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 +00005105 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005106
5107 try
5108 {
5109 switch (face)
5110 {
5111 case GL_FRONT:
5112 case GL_BACK:
5113 case GL_FRONT_AND_BACK:
5114 break;
5115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005116 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005117 }
5118
5119 switch (fail)
5120 {
5121 case GL_ZERO:
5122 case GL_KEEP:
5123 case GL_REPLACE:
5124 case GL_INCR:
5125 case GL_DECR:
5126 case GL_INVERT:
5127 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005128 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005129 break;
5130 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005131 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005132 }
5133
5134 switch (zfail)
5135 {
5136 case GL_ZERO:
5137 case GL_KEEP:
5138 case GL_REPLACE:
5139 case GL_INCR:
5140 case GL_DECR:
5141 case GL_INVERT:
5142 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005143 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005144 break;
5145 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005146 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005147 }
5148
5149 switch (zpass)
5150 {
5151 case GL_ZERO:
5152 case GL_KEEP:
5153 case GL_REPLACE:
5154 case GL_INCR:
5155 case GL_DECR:
5156 case GL_INVERT:
5157 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005158 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159 break;
5160 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162 }
5163
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165
5166 if (context)
5167 {
5168 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5169 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005170 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005171 }
5172
5173 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5174 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005175 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176 }
5177 }
5178 }
5179 catch(std::bad_alloc&)
5180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005181 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005182 }
5183}
5184
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005185GLboolean __stdcall glTestFenceNV(GLuint fence)
5186{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005187 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005188
5189 try
5190 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005191 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005192
5193 if (context)
5194 {
5195 gl::Fence *fenceObject = context->getFence(fence);
5196
5197 if (fenceObject == NULL)
5198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005199 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005200 }
5201
5202 return fenceObject->testFence();
5203 }
5204 }
5205 catch(std::bad_alloc&)
5206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005207 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005208 }
5209
5210 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005211}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005212
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005213void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5214 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005215{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005216 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 +00005217 "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 +00005218 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219
5220 try
5221 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005222 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005224 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005225 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005226
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005227 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005229 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 }
5231
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005232 // validate <type> by itself (used as secondary key below)
5233 switch (type)
5234 {
5235 case GL_UNSIGNED_BYTE:
5236 case GL_UNSIGNED_SHORT_5_6_5:
5237 case GL_UNSIGNED_SHORT_4_4_4_4:
5238 case GL_UNSIGNED_SHORT_5_5_5_1:
5239 case GL_UNSIGNED_SHORT:
5240 case GL_UNSIGNED_INT:
5241 case GL_UNSIGNED_INT_24_8_OES:
5242 case GL_HALF_FLOAT_OES:
5243 case GL_FLOAT:
5244 break;
5245 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005246 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005247 }
5248
5249 // validate <format> + <type> combinations
5250 // - invalid <format> -> sets INVALID_ENUM
5251 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005252 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 {
5254 case GL_ALPHA:
5255 case GL_LUMINANCE:
5256 case GL_LUMINANCE_ALPHA:
5257 switch (type)
5258 {
5259 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005260 case GL_FLOAT:
5261 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005262 break;
5263 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005264 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 }
5266 break;
5267 case GL_RGB:
5268 switch (type)
5269 {
5270 case GL_UNSIGNED_BYTE:
5271 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005272 case GL_FLOAT:
5273 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005274 break;
5275 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005276 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005277 }
5278 break;
5279 case GL_RGBA:
5280 switch (type)
5281 {
5282 case GL_UNSIGNED_BYTE:
5283 case GL_UNSIGNED_SHORT_4_4_4_4:
5284 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005285 case GL_FLOAT:
5286 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005287 break;
5288 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005290 }
5291 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005292 case GL_BGRA_EXT:
5293 switch (type)
5294 {
5295 case GL_UNSIGNED_BYTE:
5296 break;
5297 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005298 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005299 }
5300 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005301 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5302 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005303 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5304 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005305 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005306 case GL_DEPTH_COMPONENT:
5307 switch (type)
5308 {
5309 case GL_UNSIGNED_SHORT:
5310 case GL_UNSIGNED_INT:
5311 break;
5312 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005313 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005314 }
5315 break;
5316 case GL_DEPTH_STENCIL_OES:
5317 switch (type)
5318 {
5319 case GL_UNSIGNED_INT_24_8_OES:
5320 break;
5321 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005322 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005323 }
5324 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005326 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005327 }
5328
5329 if (border != 0)
5330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005332 }
5333
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335
5336 if (context)
5337 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005338 if (level > context->getMaximumTextureLevel())
5339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005341 }
5342
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005343 switch (target)
5344 {
5345 case GL_TEXTURE_2D:
5346 if (width > (context->getMaximumTextureDimension() >> level) ||
5347 height > (context->getMaximumTextureDimension() >> level))
5348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005350 }
5351 break;
5352 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5353 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5354 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5355 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5356 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5357 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5358 if (width != height)
5359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005360 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005361 }
5362
5363 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5364 height > (context->getMaximumCubeTextureDimension() >> level))
5365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005366 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005367 }
5368 break;
5369 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005370 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005371 }
5372
gman@chromium.org50c526d2011-08-10 05:19:44 +00005373 switch (format) {
5374 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5375 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5376 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005378 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005379 }
5380 else
5381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005382 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005383 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005384 break;
5385 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5386 if (context->supportsDXT3Textures())
5387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005388 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005389 }
5390 else
5391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005392 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005393 }
5394 break;
5395 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5396 if (context->supportsDXT5Textures())
5397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005398 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005399 }
5400 else
5401 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005402 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005403 }
5404 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005405 case GL_DEPTH_COMPONENT:
5406 case GL_DEPTH_STENCIL_OES:
5407 if (!context->supportsDepthTextures())
5408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005409 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005410 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005411 if (target != GL_TEXTURE_2D)
5412 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005413 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005414 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005415 // OES_depth_texture supports loading depth data and multiple levels,
5416 // but ANGLE_depth_texture does not
5417 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005419 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005420 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005421 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005422 default:
5423 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005424 }
5425
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005426 if (type == GL_FLOAT)
5427 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005428 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005430 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005431 }
5432 }
5433 else if (type == GL_HALF_FLOAT_OES)
5434 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005435 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005437 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005438 }
5439 }
5440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005441 if (target == GL_TEXTURE_2D)
5442 {
5443 gl::Texture2D *texture = context->getTexture2D();
5444
5445 if (!texture)
5446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005447 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005448 }
5449
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005450 if (texture->isImmutable())
5451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005452 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005453 }
5454
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005455 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005456 }
5457 else
5458 {
5459 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5460
5461 if (!texture)
5462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005463 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005464 }
5465
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005466 if (texture->isImmutable())
5467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005468 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005469 }
5470
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005471 switch (target)
5472 {
5473 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005474 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475 break;
5476 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005477 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 break;
5479 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005480 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 break;
5482 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005483 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 break;
5485 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005486 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005487 break;
5488 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005489 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490 break;
5491 default: UNREACHABLE();
5492 }
5493 }
5494 }
5495 }
5496 catch(std::bad_alloc&)
5497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005498 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005499 }
5500}
5501
5502void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5503{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005504 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5505
5506 try
5507 {
5508 gl::Context *context = gl::getNonLostContext();
5509
5510 if (context)
5511 {
5512 gl::Texture *texture;
5513
5514 switch (target)
5515 {
5516 case GL_TEXTURE_2D:
5517 texture = context->getTexture2D();
5518 break;
5519 case GL_TEXTURE_CUBE_MAP:
5520 texture = context->getTextureCubeMap();
5521 break;
5522 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005523 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005524 }
5525
5526 switch (pname)
5527 {
5528 case GL_TEXTURE_WRAP_S:
5529 if (!texture->setWrapS((GLenum)param))
5530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005531 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005532 }
5533 break;
5534 case GL_TEXTURE_WRAP_T:
5535 if (!texture->setWrapT((GLenum)param))
5536 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005537 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005538 }
5539 break;
5540 case GL_TEXTURE_MIN_FILTER:
5541 if (!texture->setMinFilter((GLenum)param))
5542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005543 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005544 }
5545 break;
5546 case GL_TEXTURE_MAG_FILTER:
5547 if (!texture->setMagFilter((GLenum)param))
5548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005549 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005550 }
5551 break;
5552 case GL_TEXTURE_USAGE_ANGLE:
5553 if (!texture->setUsage((GLenum)param))
5554 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005555 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005556 }
5557 break;
5558 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5559 if (!context->supportsTextureFilterAnisotropy())
5560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005561 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005562 }
5563 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5564 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005565 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005566 }
5567 break;
5568 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005569 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005570 }
5571 }
5572 }
5573 catch(std::bad_alloc&)
5574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005575 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005576 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005577}
5578
5579void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5580{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005581 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005582}
5583
5584void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005586 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005587
5588 try
5589 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005591
5592 if (context)
5593 {
5594 gl::Texture *texture;
5595
5596 switch (target)
5597 {
5598 case GL_TEXTURE_2D:
5599 texture = context->getTexture2D();
5600 break;
5601 case GL_TEXTURE_CUBE_MAP:
5602 texture = context->getTextureCubeMap();
5603 break;
5604 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005605 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005606 }
5607
5608 switch (pname)
5609 {
5610 case GL_TEXTURE_WRAP_S:
5611 if (!texture->setWrapS((GLenum)param))
5612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005613 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005614 }
5615 break;
5616 case GL_TEXTURE_WRAP_T:
5617 if (!texture->setWrapT((GLenum)param))
5618 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005619 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005620 }
5621 break;
5622 case GL_TEXTURE_MIN_FILTER:
5623 if (!texture->setMinFilter((GLenum)param))
5624 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005625 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005626 }
5627 break;
5628 case GL_TEXTURE_MAG_FILTER:
5629 if (!texture->setMagFilter((GLenum)param))
5630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005631 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005632 }
5633 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005634 case GL_TEXTURE_USAGE_ANGLE:
5635 if (!texture->setUsage((GLenum)param))
5636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005638 }
5639 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005640 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5641 if (!context->supportsTextureFilterAnisotropy())
5642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005643 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005644 }
5645 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5646 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005647 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005648 }
5649 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005650 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005652 }
5653 }
5654 }
5655 catch(std::bad_alloc&)
5656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005657 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005658 }
5659}
5660
5661void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5662{
5663 glTexParameteri(target, pname, *params);
5664}
5665
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005666void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5667{
5668 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5669 target, levels, internalformat, width, height);
5670
5671 try
5672 {
5673 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005675 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005676 }
5677
5678 if (width < 1 || height < 1 || levels < 1)
5679 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005680 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005681 }
5682
5683 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005685 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005686 }
5687
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005688 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005690 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005691 }
5692
5693 GLenum format = gl::ExtractFormat(internalformat);
5694 GLenum type = gl::ExtractType(internalformat);
5695
5696 if (format == GL_NONE || type == GL_NONE)
5697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005698 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005699 }
5700
5701 gl::Context *context = gl::getNonLostContext();
5702
5703 if (context)
5704 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005705 switch (target)
5706 {
5707 case GL_TEXTURE_2D:
5708 if (width > context->getMaximumTextureDimension() ||
5709 height > context->getMaximumTextureDimension())
5710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005711 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005712 }
5713 break;
5714 case GL_TEXTURE_CUBE_MAP:
5715 if (width > context->getMaximumCubeTextureDimension() ||
5716 height > context->getMaximumCubeTextureDimension())
5717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005719 }
5720 break;
5721 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005722 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005723 }
5724
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005725 if (levels != 1 && !context->supportsNonPower2Texture())
5726 {
5727 if (!gl::isPow2(width) || !gl::isPow2(height))
5728 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005729 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005730 }
5731 }
5732
daniel@transgaming.come1077362011-11-11 04:16:50 +00005733 switch (internalformat)
5734 {
5735 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5736 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5737 if (!context->supportsDXT1Textures())
5738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005739 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005740 }
5741 break;
5742 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5743 if (!context->supportsDXT3Textures())
5744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005745 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005746 }
5747 break;
5748 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5749 if (!context->supportsDXT5Textures())
5750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005751 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005752 }
5753 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005754 case GL_RGBA32F_EXT:
5755 case GL_RGB32F_EXT:
5756 case GL_ALPHA32F_EXT:
5757 case GL_LUMINANCE32F_EXT:
5758 case GL_LUMINANCE_ALPHA32F_EXT:
5759 if (!context->supportsFloat32Textures())
5760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005761 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005762 }
5763 break;
5764 case GL_RGBA16F_EXT:
5765 case GL_RGB16F_EXT:
5766 case GL_ALPHA16F_EXT:
5767 case GL_LUMINANCE16F_EXT:
5768 case GL_LUMINANCE_ALPHA16F_EXT:
5769 if (!context->supportsFloat16Textures())
5770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005771 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005772 }
5773 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005774 case GL_DEPTH_COMPONENT16:
5775 case GL_DEPTH_COMPONENT32_OES:
5776 case GL_DEPTH24_STENCIL8_OES:
5777 if (!context->supportsDepthTextures())
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005780 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005781 if (target != GL_TEXTURE_2D)
5782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005783 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005784 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005785 // ANGLE_depth_texture only supports 1-level textures
5786 if (levels != 1)
5787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005788 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005789 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005790 break;
5791 default:
5792 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005793 }
5794
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005795 if (target == GL_TEXTURE_2D)
5796 {
5797 gl::Texture2D *texture = context->getTexture2D();
5798
5799 if (!texture || texture->id() == 0)
5800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005801 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005802 }
5803
5804 if (texture->isImmutable())
5805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005806 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005807 }
5808
5809 texture->storage(levels, internalformat, width, height);
5810 }
5811 else if (target == GL_TEXTURE_CUBE_MAP)
5812 {
5813 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5814
5815 if (!texture || texture->id() == 0)
5816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005817 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005818 }
5819
5820 if (texture->isImmutable())
5821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005822 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005823 }
5824
5825 texture->storage(levels, internalformat, width);
5826 }
5827 else UNREACHABLE();
5828 }
5829 }
5830 catch(std::bad_alloc&)
5831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005833 }
5834}
5835
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005836void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5837 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005838{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005839 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005840 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005841 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005842 target, level, xoffset, yoffset, width, height, format, type, pixels);
5843
5844 try
5845 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005846 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005848 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005849 }
5850
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005851 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005853 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005854 }
5855
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005856 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005858 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005859 }
5860
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005861 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005862 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005863 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005864 }
5865
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005866 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005867
5868 if (context)
5869 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005870 if (level > context->getMaximumTextureLevel())
5871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005872 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005873 }
5874
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005875 if (format == GL_FLOAT)
5876 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005877 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005879 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005880 }
5881 }
5882 else if (format == GL_HALF_FLOAT_OES)
5883 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005884 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005886 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005887 }
5888 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005889 else if (gl::IsDepthTexture(format))
5890 {
5891 if (!context->supportsDepthTextures())
5892 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005893 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005894 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005895 if (target != GL_TEXTURE_2D)
5896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005897 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005898 }
5899 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005900 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005901 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005902
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005903 if (width == 0 || height == 0 || pixels == NULL)
5904 {
5905 return;
5906 }
5907
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005908 if (target == GL_TEXTURE_2D)
5909 {
5910 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005911 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005912 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005913 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005914 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005915 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005916 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005917 {
5918 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005919 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005920 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005921 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005922 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005923 }
5924 else
5925 {
5926 UNREACHABLE();
5927 }
5928 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005929 }
5930 catch(std::bad_alloc&)
5931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005933 }
5934}
5935
5936void __stdcall glUniform1f(GLint location, GLfloat x)
5937{
5938 glUniform1fv(location, 1, &x);
5939}
5940
5941void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5942{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005943 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944
5945 try
5946 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005947 if (count < 0)
5948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005949 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005950 }
5951
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005952 if (location == -1)
5953 {
5954 return;
5955 }
5956
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005957 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005958
5959 if (context)
5960 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005961 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005962 if (!programBinary)
5963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005964 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005965 }
5966
5967 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005969 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970 }
5971 }
5972 }
5973 catch(std::bad_alloc&)
5974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005975 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005976 }
5977}
5978
5979void __stdcall glUniform1i(GLint location, GLint x)
5980{
5981 glUniform1iv(location, 1, &x);
5982}
5983
5984void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5985{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005986 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005987
5988 try
5989 {
5990 if (count < 0)
5991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005992 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005993 }
5994
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005995 if (location == -1)
5996 {
5997 return;
5998 }
5999
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006000 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006001
6002 if (context)
6003 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006004 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006005 if (!programBinary)
6006 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006007 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006008 }
6009
6010 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006012 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006013 }
6014 }
6015 }
6016 catch(std::bad_alloc&)
6017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006018 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006019 }
6020}
6021
6022void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6023{
6024 GLfloat xy[2] = {x, y};
6025
6026 glUniform2fv(location, 1, (GLfloat*)&xy);
6027}
6028
6029void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6030{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006031 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006032
6033 try
6034 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035 if (count < 0)
6036 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006037 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006038 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006039
6040 if (location == -1)
6041 {
6042 return;
6043 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006044
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006045 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006046
6047 if (context)
6048 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006049 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006050 if (!programBinary)
6051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006052 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006053 }
6054
6055 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006057 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 }
6059 }
6060 }
6061 catch(std::bad_alloc&)
6062 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006063 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006064 }
6065}
6066
6067void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6068{
6069 GLint xy[4] = {x, y};
6070
6071 glUniform2iv(location, 1, (GLint*)&xy);
6072}
6073
6074void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006076 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006077
6078 try
6079 {
6080 if (count < 0)
6081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006083 }
6084
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006085 if (location == -1)
6086 {
6087 return;
6088 }
6089
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006090 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006091
6092 if (context)
6093 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006094 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006095 if (!programBinary)
6096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006097 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006098 }
6099
6100 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006102 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006103 }
6104 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006105 }
6106 catch(std::bad_alloc&)
6107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006108 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006109 }
6110}
6111
6112void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6113{
6114 GLfloat xyz[3] = {x, y, z};
6115
6116 glUniform3fv(location, 1, (GLfloat*)&xyz);
6117}
6118
6119void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6120{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006121 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006122
6123 try
6124 {
6125 if (count < 0)
6126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006127 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006128 }
6129
6130 if (location == -1)
6131 {
6132 return;
6133 }
6134
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006135 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006136
6137 if (context)
6138 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006139 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006140 if (!programBinary)
6141 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006142 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006143 }
6144
6145 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006147 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006148 }
6149 }
6150 }
6151 catch(std::bad_alloc&)
6152 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006153 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006154 }
6155}
6156
6157void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6158{
6159 GLint xyz[3] = {x, y, z};
6160
6161 glUniform3iv(location, 1, (GLint*)&xyz);
6162}
6163
6164void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6165{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006166 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006167
6168 try
6169 {
6170 if (count < 0)
6171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006172 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006173 }
6174
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006175 if (location == -1)
6176 {
6177 return;
6178 }
6179
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006180 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006181
6182 if (context)
6183 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006184 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006185 if (!programBinary)
6186 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006187 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006188 }
6189
6190 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006192 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006193 }
6194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006195 }
6196 catch(std::bad_alloc&)
6197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006198 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006199 }
6200}
6201
6202void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6203{
6204 GLfloat xyzw[4] = {x, y, z, w};
6205
6206 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6207}
6208
6209void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6210{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006211 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006212
6213 try
6214 {
6215 if (count < 0)
6216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006217 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006218 }
6219
6220 if (location == -1)
6221 {
6222 return;
6223 }
6224
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006225 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006226
6227 if (context)
6228 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006229 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006230 if (!programBinary)
6231 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006232 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006233 }
6234
6235 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006237 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006238 }
6239 }
6240 }
6241 catch(std::bad_alloc&)
6242 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006243 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006244 }
6245}
6246
6247void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6248{
6249 GLint xyzw[4] = {x, y, z, w};
6250
6251 glUniform4iv(location, 1, (GLint*)&xyzw);
6252}
6253
6254void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6255{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006256 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006257
6258 try
6259 {
6260 if (count < 0)
6261 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006262 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006263 }
6264
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006265 if (location == -1)
6266 {
6267 return;
6268 }
6269
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006270 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006271
6272 if (context)
6273 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006274 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006275 if (!programBinary)
6276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006277 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006278 }
6279
6280 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006282 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006283 }
6284 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006285 }
6286 catch(std::bad_alloc&)
6287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006288 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006289 }
6290}
6291
6292void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006294 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006295 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006296
6297 try
6298 {
6299 if (count < 0 || transpose != GL_FALSE)
6300 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006301 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006302 }
6303
6304 if (location == -1)
6305 {
6306 return;
6307 }
6308
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006309 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006310
6311 if (context)
6312 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006313 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006314 if (!programBinary)
6315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006316 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006317 }
6318
6319 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006321 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006322 }
6323 }
6324 }
6325 catch(std::bad_alloc&)
6326 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006327 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006328 }
6329}
6330
6331void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6332{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006333 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006334 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006335
6336 try
6337 {
6338 if (count < 0 || transpose != GL_FALSE)
6339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006341 }
6342
6343 if (location == -1)
6344 {
6345 return;
6346 }
6347
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006348 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006349
6350 if (context)
6351 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006352 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006353 if (!programBinary)
6354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006355 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006356 }
6357
6358 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006360 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006361 }
6362 }
6363 }
6364 catch(std::bad_alloc&)
6365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006366 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006367 }
6368}
6369
6370void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6371{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006372 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006373 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006374
6375 try
6376 {
6377 if (count < 0 || transpose != GL_FALSE)
6378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006380 }
6381
6382 if (location == -1)
6383 {
6384 return;
6385 }
6386
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006388
6389 if (context)
6390 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006391 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006392 if (!programBinary)
6393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006394 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006395 }
6396
6397 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006400 }
6401 }
6402 }
6403 catch(std::bad_alloc&)
6404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006405 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006406 }
6407}
6408
6409void __stdcall glUseProgram(GLuint program)
6410{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006411 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006412
6413 try
6414 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006415 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006416
6417 if (context)
6418 {
6419 gl::Program *programObject = context->getProgram(program);
6420
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006421 if (!programObject && program != 0)
6422 {
6423 if (context->getShader(program))
6424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006425 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006426 }
6427 else
6428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006429 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006430 }
6431 }
6432
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006433 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006435 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006436 }
6437
6438 context->useProgram(program);
6439 }
6440 }
6441 catch(std::bad_alloc&)
6442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006443 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006444 }
6445}
6446
6447void __stdcall glValidateProgram(GLuint program)
6448{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006449 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006450
6451 try
6452 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006453 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006454
6455 if (context)
6456 {
6457 gl::Program *programObject = context->getProgram(program);
6458
6459 if (!programObject)
6460 {
6461 if (context->getShader(program))
6462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006463 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006464 }
6465 else
6466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006468 }
6469 }
6470
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006471 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006473 }
6474 catch(std::bad_alloc&)
6475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006476 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006477 }
6478}
6479
6480void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6481{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006482 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006483
6484 try
6485 {
6486 if (index >= gl::MAX_VERTEX_ATTRIBS)
6487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006488 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006489 }
6490
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006491 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006492
6493 if (context)
6494 {
6495 GLfloat vals[4] = { x, 0, 0, 1 };
6496 context->setVertexAttrib(index, vals);
6497 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006498 }
6499 catch(std::bad_alloc&)
6500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006501 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006502 }
6503}
6504
6505void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6506{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006507 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006508
6509 try
6510 {
6511 if (index >= gl::MAX_VERTEX_ATTRIBS)
6512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006513 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006514 }
6515
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006516 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006517
6518 if (context)
6519 {
6520 GLfloat vals[4] = { values[0], 0, 0, 1 };
6521 context->setVertexAttrib(index, vals);
6522 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006523 }
6524 catch(std::bad_alloc&)
6525 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006526 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006527 }
6528}
6529
6530void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6531{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006532 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006533
6534 try
6535 {
6536 if (index >= gl::MAX_VERTEX_ATTRIBS)
6537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006538 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006539 }
6540
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006541 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006542
6543 if (context)
6544 {
6545 GLfloat vals[4] = { x, y, 0, 1 };
6546 context->setVertexAttrib(index, vals);
6547 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006548 }
6549 catch(std::bad_alloc&)
6550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006551 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006552 }
6553}
6554
6555void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6556{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006557 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006558
6559 try
6560 {
6561 if (index >= gl::MAX_VERTEX_ATTRIBS)
6562 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006563 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006564 }
6565
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006566 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006567
6568 if (context)
6569 {
6570 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6571 context->setVertexAttrib(index, vals);
6572 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006573 }
6574 catch(std::bad_alloc&)
6575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006577 }
6578}
6579
6580void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6581{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006582 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 +00006583
6584 try
6585 {
6586 if (index >= gl::MAX_VERTEX_ATTRIBS)
6587 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006588 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006589 }
6590
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006592
6593 if (context)
6594 {
6595 GLfloat vals[4] = { x, y, z, 1 };
6596 context->setVertexAttrib(index, vals);
6597 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006598 }
6599 catch(std::bad_alloc&)
6600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006601 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006602 }
6603}
6604
6605void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006607 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006608
6609 try
6610 {
6611 if (index >= gl::MAX_VERTEX_ATTRIBS)
6612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006614 }
6615
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006616 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006617
6618 if (context)
6619 {
6620 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6621 context->setVertexAttrib(index, vals);
6622 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006623 }
6624 catch(std::bad_alloc&)
6625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006627 }
6628}
6629
6630void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006632 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 +00006633
6634 try
6635 {
6636 if (index >= gl::MAX_VERTEX_ATTRIBS)
6637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006639 }
6640
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006641 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006642
6643 if (context)
6644 {
6645 GLfloat vals[4] = { x, y, z, w };
6646 context->setVertexAttrib(index, vals);
6647 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006648 }
6649 catch(std::bad_alloc&)
6650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006651 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006652 }
6653}
6654
6655void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6656{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006657 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006658
6659 try
6660 {
6661 if (index >= gl::MAX_VERTEX_ATTRIBS)
6662 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006663 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006664 }
6665
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006666 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006667
6668 if (context)
6669 {
6670 context->setVertexAttrib(index, values);
6671 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006672 }
6673 catch(std::bad_alloc&)
6674 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006675 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006676 }
6677}
6678
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006679void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6680{
6681 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6682
6683 try
6684 {
6685 if (index >= gl::MAX_VERTEX_ATTRIBS)
6686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006687 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006688 }
6689
6690 gl::Context *context = gl::getNonLostContext();
6691
6692 if (context)
6693 {
6694 context->setVertexAttribDivisor(index, divisor);
6695 }
6696 }
6697 catch(std::bad_alloc&)
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006700 }
6701}
6702
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006703void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006705 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006706 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006707 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006708
6709 try
6710 {
6711 if (index >= gl::MAX_VERTEX_ATTRIBS)
6712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006713 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006714 }
6715
6716 if (size < 1 || size > 4)
6717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006719 }
6720
6721 switch (type)
6722 {
6723 case GL_BYTE:
6724 case GL_UNSIGNED_BYTE:
6725 case GL_SHORT:
6726 case GL_UNSIGNED_SHORT:
6727 case GL_FIXED:
6728 case GL_FLOAT:
6729 break;
6730 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006731 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006732 }
6733
6734 if (stride < 0)
6735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006736 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006737 }
6738
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006739 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740
6741 if (context)
6742 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006743 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006744 }
6745 }
6746 catch(std::bad_alloc&)
6747 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006748 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006749 }
6750}
6751
6752void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6753{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006754 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 +00006755
6756 try
6757 {
6758 if (width < 0 || height < 0)
6759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006761 }
6762
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006763 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006764
6765 if (context)
6766 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006767 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006768 }
6769 }
6770 catch(std::bad_alloc&)
6771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006773 }
6774}
6775
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006776void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6777 GLbitfield mask, GLenum filter)
6778{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006779 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006780 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6781 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6782 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6783
6784 try
6785 {
6786 switch (filter)
6787 {
6788 case GL_NEAREST:
6789 break;
6790 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006791 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006792 }
6793
6794 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006796 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006797 }
6798
6799 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6800 {
6801 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006802 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006803 }
6804
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006805 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006806
6807 if (context)
6808 {
6809 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6810 {
6811 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006812 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006813 }
6814
6815 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6816 }
6817 }
6818 catch(std::bad_alloc&)
6819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006821 }
6822}
6823
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006824void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6825 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006827 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006828 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006829 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006830 target, level, internalformat, width, height, depth, border, format, type, pixels);
6831
6832 try
6833 {
6834 UNIMPLEMENTED(); // FIXME
6835 }
6836 catch(std::bad_alloc&)
6837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006838 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006839 }
6840}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006841
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006842void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6843 GLenum *binaryFormat, void *binary)
6844{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006845 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 +00006846 program, bufSize, length, binaryFormat, binary);
6847
6848 try
6849 {
6850 gl::Context *context = gl::getNonLostContext();
6851
6852 if (context)
6853 {
6854 gl::Program *programObject = context->getProgram(program);
6855
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006856 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006858 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006859 }
6860
6861 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6862
6863 if (!programBinary)
6864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006865 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006866 }
6867
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006868 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006870 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006871 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006872
6873 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006874 }
6875 }
6876 catch(std::bad_alloc&)
6877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006878 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006879 }
6880}
6881
6882void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6883 const void *binary, GLint length)
6884{
6885 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6886 program, binaryFormat, binary, length);
6887
6888 try
6889 {
6890 gl::Context *context = gl::getNonLostContext();
6891
6892 if (context)
6893 {
6894 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006896 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006897 }
6898
6899 gl::Program *programObject = context->getProgram(program);
6900
6901 if (!programObject)
6902 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006903 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006904 }
6905
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006906 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006907 }
6908 }
6909 catch(std::bad_alloc&)
6910 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006911 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006912 }
6913}
6914
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006915__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6916{
6917 struct Extension
6918 {
6919 const char *name;
6920 __eglMustCastToProperFunctionPointerType address;
6921 };
6922
6923 static const Extension glExtensions[] =
6924 {
6925 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006926 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006927 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006928 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6929 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6930 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6931 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6932 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6933 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6934 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006935 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006936 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006937 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6938 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6939 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6940 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006941 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6942 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6943 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6944 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6945 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6946 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6947 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006948 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6949 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6950 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006951 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
6952 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006953
6954 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6955 {
6956 if (strcmp(procname, glExtensions[ext].name) == 0)
6957 {
6958 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6959 }
6960 }
6961
6962 return NULL;
6963}
6964
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006965// Non-public functions used by EGL
6966
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006967bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006968{
6969 EVENT("(egl::Surface* surface = 0x%0.8p)",
6970 surface);
6971
6972 try
6973 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006974 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006975
6976 if (context)
6977 {
6978 gl::Texture2D *textureObject = context->getTexture2D();
6979
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006980 if (textureObject->isImmutable())
6981 {
6982 return false;
6983 }
6984
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006985 if (textureObject)
6986 {
6987 textureObject->bindTexImage(surface);
6988 }
6989 }
6990 }
6991 catch(std::bad_alloc&)
6992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006993 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006994 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006995
6996 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006997}
6998
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006999}