blob: 9ec402a7ef72e5ba044acad7a98d1d093fecc05d [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.coma0ce7e62011-01-25 14:47:16 +000013#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000014
15#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/utilities.h"
17#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000018#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000020#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000021#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000022#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000023#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000024#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000025#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000027bool validImageSize(GLint level, GLsizei width, GLsizei height)
28{
29 if (level < 0 || width < 0 || height < 0)
30 {
31 return false;
32 }
33
34 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
35 {
36 return true;
37 }
38
39 if (level == 0)
40 {
41 return true;
42 }
43
44 if (gl::isPow2(width) && gl::isPow2(height))
45 {
46 return true;
47 }
48
49 return false;
50}
51
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000052// Verify that format/type are one of the combinations from table 3.4.
53bool checkTextureFormatType(GLenum format, GLenum type)
54{
55 // validate <format> by itself (used as secondary key below)
56 switch (format)
57 {
58 case GL_RGBA:
59 case GL_BGRA_EXT:
60 case GL_RGB:
61 case GL_ALPHA:
62 case GL_LUMINANCE:
63 case GL_LUMINANCE_ALPHA:
64 case GL_DEPTH_COMPONENT:
65 case GL_DEPTH_STENCIL_OES:
66 break;
67 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000068 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000069 }
70
71 // invalid <type> -> sets INVALID_ENUM
72 // invalid <format>+<type> combination -> sets INVALID_OPERATION
73 switch (type)
74 {
75 case GL_UNSIGNED_BYTE:
76 switch (format)
77 {
78 case GL_RGBA:
79 case GL_BGRA_EXT:
80 case GL_RGB:
81 case GL_ALPHA:
82 case GL_LUMINANCE:
83 case GL_LUMINANCE_ALPHA:
84 return true;
85 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000086 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000087 }
88
89 case GL_FLOAT:
90 case GL_HALF_FLOAT_OES:
91 switch (format)
92 {
93 case GL_RGBA:
94 case GL_RGB:
95 case GL_ALPHA:
96 case GL_LUMINANCE:
97 case GL_LUMINANCE_ALPHA:
98 return true;
99 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000100 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000101 }
102
103 case GL_UNSIGNED_SHORT_4_4_4_4:
104 case GL_UNSIGNED_SHORT_5_5_5_1:
105 switch (format)
106 {
107 case GL_RGBA:
108 return true;
109 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000110 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000111 }
112
113 case GL_UNSIGNED_SHORT_5_6_5:
114 switch (format)
115 {
116 case GL_RGB:
117 return true;
118 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000119 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000120 }
121
122 case GL_UNSIGNED_SHORT:
123 case GL_UNSIGNED_INT:
124 switch (format)
125 {
126 case GL_DEPTH_COMPONENT:
127 return true;
128 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000129 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000130 }
131
132 case GL_UNSIGNED_INT_24_8_OES:
133 switch (format)
134 {
135 case GL_DEPTH_STENCIL_OES:
136 return true;
137 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000138 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000139 }
140
141 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000142 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000143 }
144}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000145
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000146bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000147 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000148 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000149{
150 if (!texture)
151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000152 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 }
154
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000155 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000156 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000157 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 }
159
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000160 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000161 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000162 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
163 if (internalformat != texture->getInternalFormat(level))
164 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000165 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000166 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000167 }
168
169 if (compressed)
170 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000171 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
172 (height % 4 != 0 && height != texture->getHeight(0)))
173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000174 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000175 }
176 }
177
178 if (xoffset + width > texture->getWidth(level) ||
179 yoffset + height > texture->getHeight(level))
180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000181 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000182 }
183
184 return true;
185}
186
187bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000188 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000189 gl::TextureCubeMap *texture)
190{
191 if (!texture)
192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000193 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 }
195
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000196 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000198 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 }
200
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000201 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000202 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000203 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
204 if (internalformat != texture->getInternalFormat(target, level))
205 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000206 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000207 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000208 }
209
210 if (compressed)
211 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000212 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
213 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000215 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000216 }
217 }
218
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000219 if (xoffset + width > texture->getWidth(target, level) ||
220 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000221 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000222 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000223 }
224
225 return true;
226}
227
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000228// check for combinations of format and type that are valid for ReadPixels
229bool validReadFormatType(GLenum format, GLenum type)
230{
231 switch (format)
232 {
233 case GL_RGBA:
234 switch (type)
235 {
236 case GL_UNSIGNED_BYTE:
237 break;
238 default:
239 return false;
240 }
241 break;
242 case GL_BGRA_EXT:
243 switch (type)
244 {
245 case GL_UNSIGNED_BYTE:
246 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
247 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
248 break;
249 default:
250 return false;
251 }
252 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000253 default:
254 return false;
255 }
256 return true;
257}
258
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259extern "C"
260{
261
262void __stdcall glActiveTexture(GLenum texture)
263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000264 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265
266 try
267 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000268 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000269
270 if (context)
271 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000272 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000275 }
276
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000277 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278 }
279 }
280 catch(std::bad_alloc&)
281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000283 }
284}
285
286void __stdcall glAttachShader(GLuint program, GLuint shader)
287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000288 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000289
290 try
291 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000292 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293
294 if (context)
295 {
296 gl::Program *programObject = context->getProgram(program);
297 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000298
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000299 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000301 if (context->getShader(program))
302 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000303 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000304 }
305 else
306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000307 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000308 }
309 }
310
311 if (!shaderObject)
312 {
313 if (context->getProgram(shader))
314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000315 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000316 }
317 else
318 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000319 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000320 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000321 }
322
323 if (!programObject->attachShader(shaderObject))
324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000325 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326 }
327 }
328 }
329 catch(std::bad_alloc&)
330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000332 }
333}
334
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000335void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
336{
337 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
338
339 try
340 {
341 switch (target)
342 {
343 case GL_ANY_SAMPLES_PASSED_EXT:
344 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
345 break;
346 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000347 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000348 }
349
350 if (id == 0)
351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000352 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000353 }
354
355 gl::Context *context = gl::getNonLostContext();
356
357 if (context)
358 {
359 context->beginQuery(target, id);
360 }
361 }
362 catch(std::bad_alloc&)
363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000364 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000365 }
366}
367
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000368void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000369{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000370 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000371
372 try
373 {
374 if (index >= gl::MAX_VERTEX_ATTRIBS)
375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000376 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377 }
378
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000380
381 if (context)
382 {
383 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000384
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000385 if (!programObject)
386 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000387 if (context->getShader(program))
388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000389 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000390 }
391 else
392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000393 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000394 }
395 }
396
397 if (strncmp(name, "gl_", 3) == 0)
398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000399 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400 }
401
402 programObject->bindAttributeLocation(index, name);
403 }
404 }
405 catch(std::bad_alloc&)
406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000407 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000408 }
409}
410
411void __stdcall glBindBuffer(GLenum target, GLuint buffer)
412{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000413 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000414
415 try
416 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000417 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418
419 if (context)
420 {
421 switch (target)
422 {
423 case GL_ARRAY_BUFFER:
424 context->bindArrayBuffer(buffer);
425 return;
426 case GL_ELEMENT_ARRAY_BUFFER:
427 context->bindElementArrayBuffer(buffer);
428 return;
429 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000430 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000431 }
432 }
433 }
434 catch(std::bad_alloc&)
435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000436 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000437 }
438}
439
440void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
441{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000442 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443
444 try
445 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000446 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000448 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449 }
450
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000451 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000452
453 if (context)
454 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000455 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
456 {
457 context->bindReadFramebuffer(framebuffer);
458 }
459
460 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
461 {
462 context->bindDrawFramebuffer(framebuffer);
463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000464 }
465 }
466 catch(std::bad_alloc&)
467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000468 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 }
470}
471
472void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
473{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000474 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000475
476 try
477 {
478 if (target != GL_RENDERBUFFER)
479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000480 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481 }
482
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000483 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000484
485 if (context)
486 {
487 context->bindRenderbuffer(renderbuffer);
488 }
489 }
490 catch(std::bad_alloc&)
491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000493 }
494}
495
496void __stdcall glBindTexture(GLenum target, GLuint texture)
497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000498 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000499
500 try
501 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000502 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000503
504 if (context)
505 {
506 gl::Texture *textureObject = context->getTexture(texture);
507
508 if (textureObject && textureObject->getTarget() != target && texture != 0)
509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000511 }
512
513 switch (target)
514 {
515 case GL_TEXTURE_2D:
516 context->bindTexture2D(texture);
517 return;
518 case GL_TEXTURE_CUBE_MAP:
519 context->bindTextureCubeMap(texture);
520 return;
521 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000522 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000523 }
524 }
525 }
526 catch(std::bad_alloc&)
527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000529 }
530}
531
532void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000534 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000535 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000536
537 try
538 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000539 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000540
541 if (context)
542 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000543 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000544 }
545 }
546 catch(std::bad_alloc&)
547 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000548 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549 }
550}
551
552void __stdcall glBlendEquation(GLenum mode)
553{
554 glBlendEquationSeparate(mode, mode);
555}
556
557void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
558{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000559 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560
561 try
562 {
563 switch (modeRGB)
564 {
565 case GL_FUNC_ADD:
566 case GL_FUNC_SUBTRACT:
567 case GL_FUNC_REVERSE_SUBTRACT:
568 break;
569 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000570 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000571 }
572
573 switch (modeAlpha)
574 {
575 case GL_FUNC_ADD:
576 case GL_FUNC_SUBTRACT:
577 case GL_FUNC_REVERSE_SUBTRACT:
578 break;
579 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000580 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581 }
582
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584
585 if (context)
586 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000587 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588 }
589 }
590 catch(std::bad_alloc&)
591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000593 }
594}
595
596void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
597{
598 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
599}
600
601void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
602{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000603 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 +0000604 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000605
606 try
607 {
608 switch (srcRGB)
609 {
610 case GL_ZERO:
611 case GL_ONE:
612 case GL_SRC_COLOR:
613 case GL_ONE_MINUS_SRC_COLOR:
614 case GL_DST_COLOR:
615 case GL_ONE_MINUS_DST_COLOR:
616 case GL_SRC_ALPHA:
617 case GL_ONE_MINUS_SRC_ALPHA:
618 case GL_DST_ALPHA:
619 case GL_ONE_MINUS_DST_ALPHA:
620 case GL_CONSTANT_COLOR:
621 case GL_ONE_MINUS_CONSTANT_COLOR:
622 case GL_CONSTANT_ALPHA:
623 case GL_ONE_MINUS_CONSTANT_ALPHA:
624 case GL_SRC_ALPHA_SATURATE:
625 break;
626 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000628 }
629
630 switch (dstRGB)
631 {
632 case GL_ZERO:
633 case GL_ONE:
634 case GL_SRC_COLOR:
635 case GL_ONE_MINUS_SRC_COLOR:
636 case GL_DST_COLOR:
637 case GL_ONE_MINUS_DST_COLOR:
638 case GL_SRC_ALPHA:
639 case GL_ONE_MINUS_SRC_ALPHA:
640 case GL_DST_ALPHA:
641 case GL_ONE_MINUS_DST_ALPHA:
642 case GL_CONSTANT_COLOR:
643 case GL_ONE_MINUS_CONSTANT_COLOR:
644 case GL_CONSTANT_ALPHA:
645 case GL_ONE_MINUS_CONSTANT_ALPHA:
646 break;
647 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000648 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000649 }
650
651 switch (srcAlpha)
652 {
653 case GL_ZERO:
654 case GL_ONE:
655 case GL_SRC_COLOR:
656 case GL_ONE_MINUS_SRC_COLOR:
657 case GL_DST_COLOR:
658 case GL_ONE_MINUS_DST_COLOR:
659 case GL_SRC_ALPHA:
660 case GL_ONE_MINUS_SRC_ALPHA:
661 case GL_DST_ALPHA:
662 case GL_ONE_MINUS_DST_ALPHA:
663 case GL_CONSTANT_COLOR:
664 case GL_ONE_MINUS_CONSTANT_COLOR:
665 case GL_CONSTANT_ALPHA:
666 case GL_ONE_MINUS_CONSTANT_ALPHA:
667 case GL_SRC_ALPHA_SATURATE:
668 break;
669 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000670 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 }
672
673 switch (dstAlpha)
674 {
675 case GL_ZERO:
676 case GL_ONE:
677 case GL_SRC_COLOR:
678 case GL_ONE_MINUS_SRC_COLOR:
679 case GL_DST_COLOR:
680 case GL_ONE_MINUS_DST_COLOR:
681 case GL_SRC_ALPHA:
682 case GL_ONE_MINUS_SRC_ALPHA:
683 case GL_DST_ALPHA:
684 case GL_ONE_MINUS_DST_ALPHA:
685 case GL_CONSTANT_COLOR:
686 case GL_ONE_MINUS_CONSTANT_COLOR:
687 case GL_CONSTANT_ALPHA:
688 case GL_ONE_MINUS_CONSTANT_ALPHA:
689 break;
690 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000692 }
693
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000694 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
695 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
696
697 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
698 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
699
700 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000701 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000702 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 +0000703 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000704 }
705
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000706 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000707
708 if (context)
709 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000710 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000711 }
712 }
713 catch(std::bad_alloc&)
714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000715 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000716 }
717}
718
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000719void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000720{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000721 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 +0000722 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000723
724 try
725 {
726 if (size < 0)
727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000728 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729 }
730
731 switch (usage)
732 {
733 case GL_STREAM_DRAW:
734 case GL_STATIC_DRAW:
735 case GL_DYNAMIC_DRAW:
736 break;
737 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000738 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739 }
740
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000741 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000742
743 if (context)
744 {
745 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000746
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000747 switch (target)
748 {
749 case GL_ARRAY_BUFFER:
750 buffer = context->getArrayBuffer();
751 break;
752 case GL_ELEMENT_ARRAY_BUFFER:
753 buffer = context->getElementArrayBuffer();
754 break;
755 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000756 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 }
758
759 if (!buffer)
760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000761 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762 }
763
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000764 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000765 }
766 }
767 catch(std::bad_alloc&)
768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000769 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000770 }
771}
772
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000773void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000775 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 +0000776 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777
778 try
779 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000780 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000782 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000783 }
784
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000785 if (data == NULL)
786 {
787 return;
788 }
789
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000790 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000791
792 if (context)
793 {
794 gl::Buffer *buffer;
795
796 switch (target)
797 {
798 case GL_ARRAY_BUFFER:
799 buffer = context->getArrayBuffer();
800 break;
801 case GL_ELEMENT_ARRAY_BUFFER:
802 buffer = context->getElementArrayBuffer();
803 break;
804 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000805 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000806 }
807
808 if (!buffer)
809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000810 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000811 }
812
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000813 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000814 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000815 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000816 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000817
818 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000819 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000820 }
821 catch(std::bad_alloc&)
822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000824 }
825}
826
827GLenum __stdcall glCheckFramebufferStatus(GLenum target)
828{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000829 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830
831 try
832 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000833 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000834 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000835 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836 }
837
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000839
840 if (context)
841 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000842 gl::Framebuffer *framebuffer = NULL;
843 if (target == GL_READ_FRAMEBUFFER_ANGLE)
844 {
845 framebuffer = context->getReadFramebuffer();
846 }
847 else
848 {
849 framebuffer = context->getDrawFramebuffer();
850 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000851
852 return framebuffer->completeness();
853 }
854 }
855 catch(std::bad_alloc&)
856 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000857 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000858 }
859
860 return 0;
861}
862
863void __stdcall glClear(GLbitfield mask)
864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000865 EVENT("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000866
867 try
868 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000869 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000870
871 if (context)
872 {
873 context->clear(mask);
874 }
875 }
876 catch(std::bad_alloc&)
877 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000878 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000879 }
880}
881
882void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
883{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000884 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000885 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000886
887 try
888 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000889 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000890
891 if (context)
892 {
893 context->setClearColor(red, green, blue, alpha);
894 }
895 }
896 catch(std::bad_alloc&)
897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000899 }
900}
901
902void __stdcall glClearDepthf(GLclampf depth)
903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000904 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000905
906 try
907 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000908 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000909
910 if (context)
911 {
912 context->setClearDepth(depth);
913 }
914 }
915 catch(std::bad_alloc&)
916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000917 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000918 }
919}
920
921void __stdcall glClearStencil(GLint s)
922{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000923 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000924
925 try
926 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000927 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000928
929 if (context)
930 {
931 context->setClearStencil(s);
932 }
933 }
934 catch(std::bad_alloc&)
935 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000936 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000937 }
938}
939
940void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
941{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000942 EVENT("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000943 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000944
945 try
946 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000947 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000948
949 if (context)
950 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000951 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000952 }
953 }
954 catch(std::bad_alloc&)
955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
958}
959
960void __stdcall glCompileShader(GLuint shader)
961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000962 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000963
964 try
965 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000966 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000967
968 if (context)
969 {
970 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000971
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000972 if (!shaderObject)
973 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000974 if (context->getProgram(shader))
975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000976 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000977 }
978 else
979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000980 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000981 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000982 }
983
984 shaderObject->compile();
985 }
986 }
987 catch(std::bad_alloc&)
988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000989 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000990 }
991}
992
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000993void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
994 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000996 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000997 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000998 target, level, internalformat, width, height, border, imageSize, data);
999
1000 try
1001 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001002 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001004 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001005 }
1006
daniel@transgaming.com01868132010-08-24 19:21:17 +00001007 switch (internalformat)
1008 {
1009 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1010 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001011 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1012 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001013 break;
1014 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001015 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001016 }
1017
1018 if (border != 0)
1019 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001020 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001021 }
1022
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001023 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001024
1025 if (context)
1026 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001027 if (level > context->getMaximumTextureLevel())
1028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001029 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001030 }
1031
1032 switch (target)
1033 {
1034 case GL_TEXTURE_2D:
1035 if (width > (context->getMaximumTextureDimension() >> level) ||
1036 height > (context->getMaximumTextureDimension() >> level))
1037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001038 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001039 }
1040 break;
1041 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1042 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1043 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1044 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1045 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1046 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1047 if (width != height)
1048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001049 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001050 }
1051
1052 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1053 height > (context->getMaximumCubeTextureDimension() >> level))
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 break;
1058 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001059 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001060 }
1061
gman@chromium.org50c526d2011-08-10 05:19:44 +00001062 switch (internalformat) {
1063 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1064 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1065 if (!context->supportsDXT1Textures())
1066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001067 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 +00001068 }
1069 break;
1070 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1071 if (!context->supportsDXT3Textures())
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_DXT5_ANGLE:
1077 if (!context->supportsDXT5Textures())
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 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001083 }
1084
1085 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001087 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001088 }
1089
1090 if (target == GL_TEXTURE_2D)
1091 {
1092 gl::Texture2D *texture = context->getTexture2D();
1093
1094 if (!texture)
1095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001096 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001097 }
1098
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001099 if (texture->isImmutable())
1100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001102 }
1103
daniel@transgaming.com01868132010-08-24 19:21:17 +00001104 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1105 }
1106 else
1107 {
1108 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1109
1110 if (!texture)
1111 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001112 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001113 }
1114
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001115 if (texture->isImmutable())
1116 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001117 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001118 }
1119
daniel@transgaming.com01868132010-08-24 19:21:17 +00001120 switch (target)
1121 {
1122 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1123 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1124 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1125 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1126 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1127 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1128 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1129 break;
1130 default: UNREACHABLE();
1131 }
1132 }
1133 }
1134
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001135 }
1136 catch(std::bad_alloc&)
1137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001138 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001139 }
1140}
1141
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001142void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1143 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001145 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001146 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001147 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001148 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1149
1150 try
1151 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001152 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001154 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001155 }
1156
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001157 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001160 }
1161
daniel@transgaming.com01868132010-08-24 19:21:17 +00001162 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001163 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001164 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1165 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001166 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1167 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001168 break;
1169 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001170 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001171 }
1172
daniel@transgaming.com01868132010-08-24 19:21:17 +00001173 if (width == 0 || height == 0 || data == NULL)
1174 {
1175 return;
1176 }
1177
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001178 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001179
1180 if (context)
1181 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001182 if (level > context->getMaximumTextureLevel())
1183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001184 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001185 }
1186
gman@chromium.org50c526d2011-08-10 05:19:44 +00001187 switch (format) {
1188 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1189 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1190 if (!context->supportsDXT1Textures())
1191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001192 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 +00001193 }
1194 break;
1195 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1196 if (!context->supportsDXT3Textures())
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_DXT5_ANGLE:
1202 if (!context->supportsDXT5Textures())
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 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001208 }
1209
1210 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001212 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001213 }
1214
1215 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1216 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001217 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 +00001218 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001219 }
1220
1221 if (target == GL_TEXTURE_2D)
1222 {
1223 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001224 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001225 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001226 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001227 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001228 }
1229 else if (gl::IsCubemapTextureTarget(target))
1230 {
1231 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001232 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001233 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001234 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001235 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001236 }
1237 else
1238 {
1239 UNREACHABLE();
1240 }
1241 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001242 }
1243 catch(std::bad_alloc&)
1244 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001245 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001246 }
1247}
1248
1249void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1250{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001251 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001252 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253 target, level, internalformat, x, y, width, height, border);
1254
1255 try
1256 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001257 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001259 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001260 }
1261
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001262 if (border != 0)
1263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001264 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001265 }
1266
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001267 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001268
1269 if (context)
1270 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001271 if (level > context->getMaximumTextureLevel())
1272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001273 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001274 }
1275
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001276 switch (target)
1277 {
1278 case GL_TEXTURE_2D:
1279 if (width > (context->getMaximumTextureDimension() >> level) ||
1280 height > (context->getMaximumTextureDimension() >> level))
1281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001283 }
1284 break;
1285 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1286 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1287 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1288 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1289 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1290 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1291 if (width != height)
1292 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001293 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001294 }
1295
1296 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1297 height > (context->getMaximumCubeTextureDimension() >> level))
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 break;
1302 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001303 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001304 }
1305
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001306 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001307
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001308 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001310 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001311 }
1312
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001313 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001315 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001316 }
1317
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001318 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001319 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001320
1321 // [OpenGL ES 2.0.24] table 3.9
1322 switch (internalformat)
1323 {
1324 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001325 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001326 colorbufferFormat != GL_RGBA4 &&
1327 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001328 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001329 colorbufferFormat != GL_RGBA8_OES)
1330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001331 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001332 }
1333 break;
1334 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001335 case GL_RGB:
1336 if (colorbufferFormat != GL_RGB565 &&
1337 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001338 colorbufferFormat != GL_RGBA4 &&
1339 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001340 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001341 colorbufferFormat != GL_RGBA8_OES)
1342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001343 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001344 }
1345 break;
1346 case GL_LUMINANCE_ALPHA:
1347 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001348 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001349 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001350 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001351 colorbufferFormat != GL_RGBA8_OES)
1352 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001353 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001354 }
1355 break;
1356 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1357 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001358 if (context->supportsDXT1Textures())
1359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001360 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001361 }
1362 else
1363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001364 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001365 }
1366 break;
1367 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1368 if (context->supportsDXT3Textures())
1369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001370 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001371 }
1372 else
1373 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001374 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001375 }
1376 break;
1377 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1378 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001380 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001381 }
1382 else
1383 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001384 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001385 }
1386 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001387 case GL_DEPTH_COMPONENT:
1388 case GL_DEPTH_COMPONENT16:
1389 case GL_DEPTH_COMPONENT32_OES:
1390 case GL_DEPTH_STENCIL_OES:
1391 case GL_DEPTH24_STENCIL8_OES:
1392 if (context->supportsDepthTextures())
1393 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001394 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001395 }
1396 else
1397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001398 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001399 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001400 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001401 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001402 }
1403
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001404 if (target == GL_TEXTURE_2D)
1405 {
1406 gl::Texture2D *texture = context->getTexture2D();
1407
1408 if (!texture)
1409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001411 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001412
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001413 if (texture->isImmutable())
1414 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001415 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001416 }
1417
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001418 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001419 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001420 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001421 {
1422 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1423
1424 if (!texture)
1425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001426 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001427 }
1428
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001429 if (texture->isImmutable())
1430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001431 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001432 }
1433
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001434 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001435 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001436 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001437 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001438 }
1439 catch(std::bad_alloc&)
1440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001441 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442 }
1443}
1444
1445void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1446{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001447 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001448 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 target, level, xoffset, yoffset, x, y, width, height);
1450
1451 try
1452 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001453 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001455 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001456 }
1457
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001458 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001459 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001460 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001461 }
1462
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001463 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001465 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001466 }
1467
1468 if (width == 0 || height == 0)
1469 {
1470 return;
1471 }
1472
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001473 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001474
1475 if (context)
1476 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001477 if (level > context->getMaximumTextureLevel())
1478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001479 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001480 }
1481
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001482 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001483
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001484 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001486 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001487 }
1488
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001489 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001491 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001492 }
1493
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001494 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001495 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001496 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001497 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001498
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001499 if (target == GL_TEXTURE_2D)
1500 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001501 gl::Texture2D *tex2d = context->getTexture2D();
1502
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001503 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001504 {
1505 return; // error already registered by validateSubImageParams
1506 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001507 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001508 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001509 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001510 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001511 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001512 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1513
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001514 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001515 {
1516 return; // error already registered by validateSubImageParams
1517 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001518 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001519 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001520 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001521 else UNREACHABLE();
1522
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001523 // [OpenGL ES 2.0.24] table 3.9
1524 switch (textureFormat)
1525 {
1526 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001527 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001528 colorbufferFormat != GL_RGBA4 &&
1529 colorbufferFormat != GL_RGB5_A1 &&
1530 colorbufferFormat != GL_RGBA8_OES)
1531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001532 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001533 }
1534 break;
1535 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001536 case GL_RGB:
1537 if (colorbufferFormat != GL_RGB565 &&
1538 colorbufferFormat != GL_RGB8_OES &&
1539 colorbufferFormat != GL_RGBA4 &&
1540 colorbufferFormat != GL_RGB5_A1 &&
1541 colorbufferFormat != GL_RGBA8_OES)
1542 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001543 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001544 }
1545 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001546 case GL_LUMINANCE_ALPHA:
1547 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001548 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001549 colorbufferFormat != GL_RGB5_A1 &&
1550 colorbufferFormat != GL_RGBA8_OES)
1551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001552 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001553 }
1554 break;
1555 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1556 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001557 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1558 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001560 case GL_DEPTH_COMPONENT:
1561 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001562 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001563 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001564 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001565 }
1566
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001567 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001568 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001569 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001570
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 catch(std::bad_alloc&)
1572 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001573 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001574 }
1575}
1576
1577GLuint __stdcall glCreateProgram(void)
1578{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001579 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001580
1581 try
1582 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001583 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001584
1585 if (context)
1586 {
1587 return context->createProgram();
1588 }
1589 }
1590 catch(std::bad_alloc&)
1591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001592 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593 }
1594
1595 return 0;
1596}
1597
1598GLuint __stdcall glCreateShader(GLenum type)
1599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001600 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001601
1602 try
1603 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001604 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001605
1606 if (context)
1607 {
1608 switch (type)
1609 {
1610 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001611 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612 return context->createShader(type);
1613 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001614 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001615 }
1616 }
1617 }
1618 catch(std::bad_alloc&)
1619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001620 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001621 }
1622
1623 return 0;
1624}
1625
1626void __stdcall glCullFace(GLenum mode)
1627{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001628 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001629
1630 try
1631 {
1632 switch (mode)
1633 {
1634 case GL_FRONT:
1635 case GL_BACK:
1636 case GL_FRONT_AND_BACK:
1637 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001639
1640 if (context)
1641 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001642 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001643 }
1644 }
1645 break;
1646 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001647 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001648 }
1649 }
1650 catch(std::bad_alloc&)
1651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001653 }
1654}
1655
1656void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001658 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001659
1660 try
1661 {
1662 if (n < 0)
1663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665 }
1666
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001667 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001668
1669 if (context)
1670 {
1671 for (int i = 0; i < n; i++)
1672 {
1673 context->deleteBuffer(buffers[i]);
1674 }
1675 }
1676 }
1677 catch(std::bad_alloc&)
1678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001680 }
1681}
1682
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001683void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001685 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001686
1687 try
1688 {
1689 if (n < 0)
1690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001691 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001692 }
1693
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001694 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001695
1696 if (context)
1697 {
1698 for (int i = 0; i < n; i++)
1699 {
1700 context->deleteFence(fences[i]);
1701 }
1702 }
1703 }
1704 catch(std::bad_alloc&)
1705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001706 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001707 }
1708}
1709
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1711{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001712 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001713
1714 try
1715 {
1716 if (n < 0)
1717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719 }
1720
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001721 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001722
1723 if (context)
1724 {
1725 for (int i = 0; i < n; i++)
1726 {
1727 if (framebuffers[i] != 0)
1728 {
1729 context->deleteFramebuffer(framebuffers[i]);
1730 }
1731 }
1732 }
1733 }
1734 catch(std::bad_alloc&)
1735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001736 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001737 }
1738}
1739
1740void __stdcall glDeleteProgram(GLuint program)
1741{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001742 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001743
1744 try
1745 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001746 if (program == 0)
1747 {
1748 return;
1749 }
1750
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001751 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001752
1753 if (context)
1754 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001755 if (!context->getProgram(program))
1756 {
1757 if(context->getShader(program))
1758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001759 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001760 }
1761 else
1762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001764 }
1765 }
1766
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001767 context->deleteProgram(program);
1768 }
1769 }
1770 catch(std::bad_alloc&)
1771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001773 }
1774}
1775
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001776void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1777{
1778 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1779
1780 try
1781 {
1782 if (n < 0)
1783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001784 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001785 }
1786
1787 gl::Context *context = gl::getNonLostContext();
1788
1789 if (context)
1790 {
1791 for (int i = 0; i < n; i++)
1792 {
1793 context->deleteQuery(ids[i]);
1794 }
1795 }
1796 }
1797 catch(std::bad_alloc&)
1798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001799 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001800 }
1801}
1802
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1804{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001805 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001806
1807 try
1808 {
1809 if (n < 0)
1810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812 }
1813
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001814 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001815
1816 if (context)
1817 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001818 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819 {
1820 context->deleteRenderbuffer(renderbuffers[i]);
1821 }
1822 }
1823 }
1824 catch(std::bad_alloc&)
1825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001827 }
1828}
1829
1830void __stdcall glDeleteShader(GLuint shader)
1831{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001832 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001833
1834 try
1835 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001836 if (shader == 0)
1837 {
1838 return;
1839 }
1840
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001841 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001842
1843 if (context)
1844 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001845 if (!context->getShader(shader))
1846 {
1847 if(context->getProgram(shader))
1848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001849 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001850 }
1851 else
1852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001853 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001854 }
1855 }
1856
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001857 context->deleteShader(shader);
1858 }
1859 }
1860 catch(std::bad_alloc&)
1861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863 }
1864}
1865
1866void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001868 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001869
1870 try
1871 {
1872 if (n < 0)
1873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001874 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001875 }
1876
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001877 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001878
1879 if (context)
1880 {
1881 for (int i = 0; i < n; i++)
1882 {
1883 if (textures[i] != 0)
1884 {
1885 context->deleteTexture(textures[i]);
1886 }
1887 }
1888 }
1889 }
1890 catch(std::bad_alloc&)
1891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001892 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001893 }
1894}
1895
1896void __stdcall glDepthFunc(GLenum func)
1897{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001898 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001899
1900 try
1901 {
1902 switch (func)
1903 {
1904 case GL_NEVER:
1905 case GL_ALWAYS:
1906 case GL_LESS:
1907 case GL_LEQUAL:
1908 case GL_EQUAL:
1909 case GL_GREATER:
1910 case GL_GEQUAL:
1911 case GL_NOTEQUAL:
1912 break;
1913 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001914 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915 }
1916
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001917 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001918
1919 if (context)
1920 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001921 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922 }
1923 }
1924 catch(std::bad_alloc&)
1925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001926 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001927 }
1928}
1929
1930void __stdcall glDepthMask(GLboolean flag)
1931{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001932 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001933
1934 try
1935 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001936 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001937
1938 if (context)
1939 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001940 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001941 }
1942 }
1943 catch(std::bad_alloc&)
1944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001945 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001946 }
1947}
1948
1949void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1950{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001951 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001952
1953 try
1954 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001955 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001956
1957 if (context)
1958 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001959 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001960 }
1961 }
1962 catch(std::bad_alloc&)
1963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001964 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001965 }
1966}
1967
1968void __stdcall glDetachShader(GLuint program, GLuint shader)
1969{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001970 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001971
1972 try
1973 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001974 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001975
1976 if (context)
1977 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001978
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001979 gl::Program *programObject = context->getProgram(program);
1980 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001981
1982 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001983 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001984 gl::Shader *shaderByProgramHandle;
1985 shaderByProgramHandle = context->getShader(program);
1986 if (!shaderByProgramHandle)
1987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001988 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001989 }
1990 else
1991 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001992 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001993 }
1994 }
1995
1996 if (!shaderObject)
1997 {
1998 gl::Program *programByShaderHandle = context->getProgram(shader);
1999 if (!programByShaderHandle)
2000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002002 }
2003 else
2004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002005 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002006 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002007 }
2008
2009 if (!programObject->detachShader(shaderObject))
2010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002011 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002012 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002013 }
2014 }
2015 catch(std::bad_alloc&)
2016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002017 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002018 }
2019}
2020
2021void __stdcall glDisable(GLenum cap)
2022{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002023 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002024
2025 try
2026 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002027 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002028
2029 if (context)
2030 {
2031 switch (cap)
2032 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002033 case GL_CULL_FACE: context->setCullFace(false); break;
2034 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2035 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2036 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2037 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2038 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2039 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2040 case GL_BLEND: context->setBlend(false); break;
2041 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002042 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002043 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002044 }
2045 }
2046 }
2047 catch(std::bad_alloc&)
2048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002049 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002050 }
2051}
2052
2053void __stdcall glDisableVertexAttribArray(GLuint index)
2054{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002055 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002056
2057 try
2058 {
2059 if (index >= gl::MAX_VERTEX_ATTRIBS)
2060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002061 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002062 }
2063
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002064 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002065
2066 if (context)
2067 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002068 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002069 }
2070 }
2071 catch(std::bad_alloc&)
2072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002073 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002074 }
2075}
2076
2077void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002079 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002080
2081 try
2082 {
2083 if (count < 0 || first < 0)
2084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086 }
2087
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002088 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002089
2090 if (context)
2091 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002092 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002093 }
2094 }
2095 catch(std::bad_alloc&)
2096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002097 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002098 }
2099}
2100
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002101void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2102{
2103 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2104
2105 try
2106 {
2107 if (count < 0 || first < 0 || primcount < 0)
2108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002109 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002110 }
2111
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002112 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002113 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002114 gl::Context *context = gl::getNonLostContext();
2115
2116 if (context)
2117 {
2118 context->drawArrays(mode, first, count, primcount);
2119 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002120 }
2121 }
2122 catch(std::bad_alloc&)
2123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002124 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002125 }
2126}
2127
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002128void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002130 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 +00002131 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002132
2133 try
2134 {
2135 if (count < 0)
2136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002137 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138 }
2139
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002140 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002141
2142 if (context)
2143 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002144 switch (type)
2145 {
2146 case GL_UNSIGNED_BYTE:
2147 case GL_UNSIGNED_SHORT:
2148 break;
2149 case GL_UNSIGNED_INT:
2150 if (!context->supports32bitIndices())
2151 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002152 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002153 }
2154 break;
2155 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002156 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002157 }
2158
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002159 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002160 }
2161 }
2162 catch(std::bad_alloc&)
2163 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002164 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002165 }
2166}
2167
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002168void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2169{
2170 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2171 mode, count, type, indices, primcount);
2172
2173 try
2174 {
2175 if (count < 0 || primcount < 0)
2176 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002177 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002178 }
2179
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002180 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002181 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002182 gl::Context *context = gl::getNonLostContext();
2183
2184 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002185 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002186 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002187 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002188 case GL_UNSIGNED_BYTE:
2189 case GL_UNSIGNED_SHORT:
2190 break;
2191 case GL_UNSIGNED_INT:
2192 if (!context->supports32bitIndices())
2193 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002195 }
2196 break;
2197 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002198 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002199 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002200
2201 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002202 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002203 }
2204 }
2205 catch(std::bad_alloc&)
2206 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002207 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002208 }
2209}
2210
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002211void __stdcall glEnable(GLenum cap)
2212{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002213 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002214
2215 try
2216 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002217 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218
2219 if (context)
2220 {
2221 switch (cap)
2222 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002223 case GL_CULL_FACE: context->setCullFace(true); break;
2224 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2225 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2226 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2227 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2228 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2229 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2230 case GL_BLEND: context->setBlend(true); break;
2231 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002233 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002234 }
2235 }
2236 }
2237 catch(std::bad_alloc&)
2238 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002239 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002240 }
2241}
2242
2243void __stdcall glEnableVertexAttribArray(GLuint index)
2244{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002245 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002246
2247 try
2248 {
2249 if (index >= gl::MAX_VERTEX_ATTRIBS)
2250 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002251 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252 }
2253
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002254 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002255
2256 if (context)
2257 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002258 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 }
2260 }
2261 catch(std::bad_alloc&)
2262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002263 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002264 }
2265}
2266
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002267void __stdcall glEndQueryEXT(GLenum target)
2268{
2269 EVENT("GLenum target = 0x%X)", target);
2270
2271 try
2272 {
2273 switch (target)
2274 {
2275 case GL_ANY_SAMPLES_PASSED_EXT:
2276 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2277 break;
2278 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002279 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002280 }
2281
2282 gl::Context *context = gl::getNonLostContext();
2283
2284 if (context)
2285 {
2286 context->endQuery(target);
2287 }
2288 }
2289 catch(std::bad_alloc&)
2290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002292 }
2293}
2294
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002295void __stdcall glFinishFenceNV(GLuint fence)
2296{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002297 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002298
2299 try
2300 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002301 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002302
2303 if (context)
2304 {
2305 gl::Fence* fenceObject = context->getFence(fence);
2306
2307 if (fenceObject == NULL)
2308 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002309 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002310 }
2311
2312 fenceObject->finishFence();
2313 }
2314 }
2315 catch(std::bad_alloc&)
2316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002317 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002318 }
2319}
2320
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321void __stdcall glFinish(void)
2322{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002323 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002324
2325 try
2326 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002327 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328
2329 if (context)
2330 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002331 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002332 }
2333 }
2334 catch(std::bad_alloc&)
2335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002337 }
2338}
2339
2340void __stdcall glFlush(void)
2341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002342 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002343
2344 try
2345 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002346 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002347
2348 if (context)
2349 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002350 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002351 }
2352 }
2353 catch(std::bad_alloc&)
2354 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002355 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002356 }
2357}
2358
2359void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2360{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002361 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002362 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002366 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002367 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002369 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370 }
2371
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002372 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373
2374 if (context)
2375 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002376 gl::Framebuffer *framebuffer = NULL;
2377 GLuint framebufferHandle = 0;
2378 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2379 {
2380 framebuffer = context->getReadFramebuffer();
2381 framebufferHandle = context->getReadFramebufferHandle();
2382 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002383 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002384 {
2385 framebuffer = context->getDrawFramebuffer();
2386 framebufferHandle = context->getDrawFramebufferHandle();
2387 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002389 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002391 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002392 }
2393
2394 switch (attachment)
2395 {
2396 case GL_COLOR_ATTACHMENT0:
2397 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2398 break;
2399 case GL_DEPTH_ATTACHMENT:
2400 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2401 break;
2402 case GL_STENCIL_ATTACHMENT:
2403 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2404 break;
2405 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002406 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002407 }
2408 }
2409 }
2410 catch(std::bad_alloc&)
2411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002412 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002413 }
2414}
2415
2416void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2417{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002418 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002419 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002420
2421 try
2422 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002423 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002424 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002425 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002426 }
2427
2428 switch (attachment)
2429 {
2430 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002431 case GL_DEPTH_ATTACHMENT:
2432 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433 break;
2434 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002435 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436 }
2437
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002438 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002439
2440 if (context)
2441 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002442 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002444 textarget = GL_NONE;
2445 }
2446 else
2447 {
2448 gl::Texture *tex = context->getTexture(texture);
2449
2450 if (tex == NULL)
2451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002452 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002453 }
2454
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002455 switch (textarget)
2456 {
2457 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002458 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002459 if (tex->getTarget() != GL_TEXTURE_2D)
2460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002461 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002462 }
2463 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002464 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002465 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002466 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002467 }
2468 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002470
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002473 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002474 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002476 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002477 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002478 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2479 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002480 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002481 }
2482 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002483 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002485 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002486 }
2487 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002488 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002489
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002490 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002491 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002492 }
2493
2494 if (level != 0)
2495 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002496 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497 }
2498 }
2499
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002500 gl::Framebuffer *framebuffer = NULL;
2501 GLuint framebufferHandle = 0;
2502 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2503 {
2504 framebuffer = context->getReadFramebuffer();
2505 framebufferHandle = context->getReadFramebufferHandle();
2506 }
2507 else
2508 {
2509 framebuffer = context->getDrawFramebuffer();
2510 framebufferHandle = context->getDrawFramebufferHandle();
2511 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002512
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002513 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002516 }
2517
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002518 switch (attachment)
2519 {
2520 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2521 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2522 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2523 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002524 }
2525 }
2526 catch(std::bad_alloc&)
2527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529 }
2530}
2531
2532void __stdcall glFrontFace(GLenum mode)
2533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002534 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002535
2536 try
2537 {
2538 switch (mode)
2539 {
2540 case GL_CW:
2541 case GL_CCW:
2542 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002543 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002544
2545 if (context)
2546 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002547 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002548 }
2549 }
2550 break;
2551 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553 }
2554 }
2555 catch(std::bad_alloc&)
2556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002557 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002558 }
2559}
2560
2561void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2562{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002563 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564
2565 try
2566 {
2567 if (n < 0)
2568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002569 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002570 }
2571
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002572 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002573
2574 if (context)
2575 {
2576 for (int i = 0; i < n; i++)
2577 {
2578 buffers[i] = context->createBuffer();
2579 }
2580 }
2581 }
2582 catch(std::bad_alloc&)
2583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002584 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002585 }
2586}
2587
2588void __stdcall glGenerateMipmap(GLenum target)
2589{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002590 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002591
2592 try
2593 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002595
2596 if (context)
2597 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002598 switch (target)
2599 {
2600 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002601 {
2602 gl::Texture2D *tex2d = context->getTexture2D();
2603
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002604 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002606 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002607 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002608 if (tex2d->isDepth(0))
2609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002610 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002611 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002612
2613 tex2d->generateMipmaps();
2614 break;
2615 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002616
2617 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002618 {
2619 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2620
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002621 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002624 }
2625
2626 texcube->generateMipmaps();
2627 break;
2628 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002629
2630 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002631 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002632 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002633 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002634 }
2635 catch(std::bad_alloc&)
2636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002637 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002638 }
2639}
2640
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002641void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2642{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002643 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002644
2645 try
2646 {
2647 if (n < 0)
2648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002649 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002650 }
2651
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002652 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002653
2654 if (context)
2655 {
2656 for (int i = 0; i < n; i++)
2657 {
2658 fences[i] = context->createFence();
2659 }
2660 }
2661 }
2662 catch(std::bad_alloc&)
2663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002664 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002665 }
2666}
2667
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002668void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2669{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002670 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002671
2672 try
2673 {
2674 if (n < 0)
2675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002676 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677 }
2678
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002679 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680
2681 if (context)
2682 {
2683 for (int i = 0; i < n; i++)
2684 {
2685 framebuffers[i] = context->createFramebuffer();
2686 }
2687 }
2688 }
2689 catch(std::bad_alloc&)
2690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002691 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002692 }
2693}
2694
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002695void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2696{
2697 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2698
2699 try
2700 {
2701 if (n < 0)
2702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002703 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002704 }
2705
2706 gl::Context *context = gl::getNonLostContext();
2707
2708 if (context)
2709 {
2710 for (int i = 0; i < n; i++)
2711 {
2712 ids[i] = context->createQuery();
2713 }
2714 }
2715 }
2716 catch(std::bad_alloc&)
2717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002718 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002719 }
2720}
2721
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002722void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2723{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002724 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725
2726 try
2727 {
2728 if (n < 0)
2729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731 }
2732
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002734
2735 if (context)
2736 {
2737 for (int i = 0; i < n; i++)
2738 {
2739 renderbuffers[i] = context->createRenderbuffer();
2740 }
2741 }
2742 }
2743 catch(std::bad_alloc&)
2744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002745 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002746 }
2747}
2748
2749void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2750{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002751 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002752
2753 try
2754 {
2755 if (n < 0)
2756 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002757 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002758 }
2759
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002760 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002761
2762 if (context)
2763 {
2764 for (int i = 0; i < n; i++)
2765 {
2766 textures[i] = context->createTexture();
2767 }
2768 }
2769 }
2770 catch(std::bad_alloc&)
2771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002772 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002773 }
2774}
2775
daniel@transgaming.com85423182010-04-22 13:35:27 +00002776void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002777{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002778 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002779 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002780 program, index, bufsize, length, size, type, name);
2781
2782 try
2783 {
2784 if (bufsize < 0)
2785 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002786 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002787 }
2788
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002789 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002790
2791 if (context)
2792 {
2793 gl::Program *programObject = context->getProgram(program);
2794
2795 if (!programObject)
2796 {
2797 if (context->getShader(program))
2798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002799 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002800 }
2801 else
2802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002804 }
2805 }
2806
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002807 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002808 {
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 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2813 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002814 }
2815 catch(std::bad_alloc&)
2816 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002817 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002818 }
2819}
2820
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002821void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002823 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002824 "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 +00002825 program, index, bufsize, length, size, type, name);
2826
2827 try
2828 {
2829 if (bufsize < 0)
2830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002831 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002832 }
2833
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002834 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002835
2836 if (context)
2837 {
2838 gl::Program *programObject = context->getProgram(program);
2839
2840 if (!programObject)
2841 {
2842 if (context->getShader(program))
2843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002844 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002845 }
2846 else
2847 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002848 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002849 }
2850 }
2851
2852 if (index >= (GLuint)programObject->getActiveUniformCount())
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 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2858 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002859 }
2860 catch(std::bad_alloc&)
2861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002862 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002863 }
2864}
2865
2866void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2867{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002868 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 +00002869 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870
2871 try
2872 {
2873 if (maxcount < 0)
2874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002875 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002876 }
2877
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002878 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002879
2880 if (context)
2881 {
2882 gl::Program *programObject = context->getProgram(program);
2883
2884 if (!programObject)
2885 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002886 if (context->getShader(program))
2887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002888 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002889 }
2890 else
2891 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002892 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002893 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002894 }
2895
2896 return programObject->getAttachedShaders(maxcount, count, shaders);
2897 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002898 }
2899 catch(std::bad_alloc&)
2900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002901 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002902 }
2903}
2904
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002905int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002906{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002907 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002908
2909 try
2910 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002911 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912
2913 if (context)
2914 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002915
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002916 gl::Program *programObject = context->getProgram(program);
2917
2918 if (!programObject)
2919 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002920 if (context->getShader(program))
2921 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002922 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002923 }
2924 else
2925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002926 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002927 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002928 }
2929
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002930 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002931 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002933 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002934 }
2935
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002936 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002937 }
2938 }
2939 catch(std::bad_alloc&)
2940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002941 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002942 }
2943
2944 return -1;
2945}
2946
2947void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002949 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002950
2951 try
2952 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002953 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002954
2955 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002956 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002957 if (!(context->getBooleanv(pname, params)))
2958 {
2959 GLenum nativeType;
2960 unsigned int numParams = 0;
2961 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002962 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002963
2964 if (numParams == 0)
2965 return; // it is known that the pname is valid, but there are no parameters to return
2966
2967 if (nativeType == GL_FLOAT)
2968 {
2969 GLfloat *floatParams = NULL;
2970 floatParams = new GLfloat[numParams];
2971
2972 context->getFloatv(pname, floatParams);
2973
2974 for (unsigned int i = 0; i < numParams; ++i)
2975 {
2976 if (floatParams[i] == 0.0f)
2977 params[i] = GL_FALSE;
2978 else
2979 params[i] = GL_TRUE;
2980 }
2981
2982 delete [] floatParams;
2983 }
2984 else if (nativeType == GL_INT)
2985 {
2986 GLint *intParams = NULL;
2987 intParams = new GLint[numParams];
2988
2989 context->getIntegerv(pname, intParams);
2990
2991 for (unsigned int i = 0; i < numParams; ++i)
2992 {
2993 if (intParams[i] == 0)
2994 params[i] = GL_FALSE;
2995 else
2996 params[i] = GL_TRUE;
2997 }
2998
2999 delete [] intParams;
3000 }
3001 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003002 }
3003 }
3004 catch(std::bad_alloc&)
3005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003006 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003007 }
3008}
3009
3010void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3011{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003012 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 +00003013
3014 try
3015 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003016 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003017
3018 if (context)
3019 {
3020 gl::Buffer *buffer;
3021
3022 switch (target)
3023 {
3024 case GL_ARRAY_BUFFER:
3025 buffer = context->getArrayBuffer();
3026 break;
3027 case GL_ELEMENT_ARRAY_BUFFER:
3028 buffer = context->getElementArrayBuffer();
3029 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003030 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003031 }
3032
3033 if (!buffer)
3034 {
3035 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003036 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003037 }
3038
3039 switch (pname)
3040 {
3041 case GL_BUFFER_USAGE:
3042 *params = buffer->usage();
3043 break;
3044 case GL_BUFFER_SIZE:
3045 *params = buffer->size();
3046 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003047 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003048 }
3049 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003050 }
3051 catch(std::bad_alloc&)
3052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003053 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003054 }
3055}
3056
3057GLenum __stdcall glGetError(void)
3058{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003059 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003060
3061 gl::Context *context = gl::getContext();
3062
3063 if (context)
3064 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003065 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066 }
3067
3068 return GL_NO_ERROR;
3069}
3070
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003071void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003073 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003074
3075 try
3076 {
3077
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003078 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003079
3080 if (context)
3081 {
3082 gl::Fence *fenceObject = context->getFence(fence);
3083
3084 if (fenceObject == NULL)
3085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003086 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003087 }
3088
3089 fenceObject->getFenceiv(pname, params);
3090 }
3091 }
3092 catch(std::bad_alloc&)
3093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003094 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003095 }
3096}
3097
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003098void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3099{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003100 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101
3102 try
3103 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003104 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003105
3106 if (context)
3107 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003108 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003109 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003110 GLenum nativeType;
3111 unsigned int numParams = 0;
3112 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003113 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003114
3115 if (numParams == 0)
3116 return; // it is known that the pname is valid, but that there are no parameters to return.
3117
3118 if (nativeType == GL_BOOL)
3119 {
3120 GLboolean *boolParams = NULL;
3121 boolParams = new GLboolean[numParams];
3122
3123 context->getBooleanv(pname, boolParams);
3124
3125 for (unsigned int i = 0; i < numParams; ++i)
3126 {
3127 if (boolParams[i] == GL_FALSE)
3128 params[i] = 0.0f;
3129 else
3130 params[i] = 1.0f;
3131 }
3132
3133 delete [] boolParams;
3134 }
3135 else if (nativeType == GL_INT)
3136 {
3137 GLint *intParams = NULL;
3138 intParams = new GLint[numParams];
3139
3140 context->getIntegerv(pname, intParams);
3141
3142 for (unsigned int i = 0; i < numParams; ++i)
3143 {
3144 params[i] = (GLfloat)intParams[i];
3145 }
3146
3147 delete [] intParams;
3148 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003149 }
3150 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003151 }
3152 catch(std::bad_alloc&)
3153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003155 }
3156}
3157
3158void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003160 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 +00003161 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162
3163 try
3164 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003166
3167 if (context)
3168 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003169 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003171 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003172 }
3173
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003174 gl::Framebuffer *framebuffer = NULL;
3175 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3176 {
3177 if(context->getReadFramebufferHandle() == 0)
3178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003179 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003180 }
3181
3182 framebuffer = context->getReadFramebuffer();
3183 }
3184 else
3185 {
3186 if (context->getDrawFramebufferHandle() == 0)
3187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003188 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003189 }
3190
3191 framebuffer = context->getDrawFramebuffer();
3192 }
3193
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003194 GLenum attachmentType;
3195 GLuint attachmentHandle;
3196 switch (attachment)
3197 {
3198 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003199 attachmentType = framebuffer->getColorbufferType();
3200 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003201 break;
3202 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003203 attachmentType = framebuffer->getDepthbufferType();
3204 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003205 break;
3206 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003207 attachmentType = framebuffer->getStencilbufferType();
3208 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003209 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003210 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003211 }
3212
3213 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003214 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003215 {
3216 attachmentObjectType = attachmentType;
3217 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003218 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003219 {
3220 attachmentObjectType = GL_TEXTURE;
3221 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003222 else
3223 {
3224 UNREACHABLE();
3225 return;
3226 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003227
3228 switch (pname)
3229 {
3230 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3231 *params = attachmentObjectType;
3232 break;
3233 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3234 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3235 {
3236 *params = attachmentHandle;
3237 }
3238 else
3239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003240 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003241 }
3242 break;
3243 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3244 if (attachmentObjectType == GL_TEXTURE)
3245 {
3246 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3247 }
3248 else
3249 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003250 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003251 }
3252 break;
3253 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3254 if (attachmentObjectType == GL_TEXTURE)
3255 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003256 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003257 {
3258 *params = attachmentType;
3259 }
3260 else
3261 {
3262 *params = 0;
3263 }
3264 }
3265 else
3266 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003267 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003268 }
3269 break;
3270 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003272 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003273 }
3274 }
3275 catch(std::bad_alloc&)
3276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003277 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003278 }
3279}
3280
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003281GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3282{
3283 EVENT("()");
3284
3285 try
3286 {
3287 gl::Context *context = gl::getContext();
3288
3289 if (context)
3290 {
3291 return context->getResetStatus();
3292 }
3293
3294 return GL_NO_ERROR;
3295 }
3296 catch(std::bad_alloc&)
3297 {
3298 return GL_OUT_OF_MEMORY;
3299 }
3300}
3301
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003304 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003305
3306 try
3307 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003308 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309
3310 if (context)
3311 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003312 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003314 GLenum nativeType;
3315 unsigned int numParams = 0;
3316 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003317 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003318
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003319 if (numParams == 0)
3320 return; // it is known that pname is valid, but there are no parameters to return
3321
3322 if (nativeType == GL_BOOL)
3323 {
3324 GLboolean *boolParams = NULL;
3325 boolParams = new GLboolean[numParams];
3326
3327 context->getBooleanv(pname, boolParams);
3328
3329 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003330 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003331 if (boolParams[i] == GL_FALSE)
3332 params[i] = 0;
3333 else
3334 params[i] = 1;
3335 }
3336
3337 delete [] boolParams;
3338 }
3339 else if (nativeType == GL_FLOAT)
3340 {
3341 GLfloat *floatParams = NULL;
3342 floatParams = new GLfloat[numParams];
3343
3344 context->getFloatv(pname, floatParams);
3345
3346 for (unsigned int i = 0; i < numParams; ++i)
3347 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003348 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 +00003349 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003350 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003351 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003352 else
3353 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 +00003354 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003356 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003357 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358 }
3359 }
3360 }
3361 catch(std::bad_alloc&)
3362 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003363 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
3365}
3366
3367void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3368{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003369 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003370
3371 try
3372 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003373 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003374
3375 if (context)
3376 {
3377 gl::Program *programObject = context->getProgram(program);
3378
3379 if (!programObject)
3380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003381 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003382 }
3383
3384 switch (pname)
3385 {
3386 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003387 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003388 return;
3389 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003390 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391 return;
3392 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003393 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003394 return;
3395 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003396 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397 return;
3398 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003399 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 return;
3401 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003402 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 return;
3404 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003405 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 return;
3407 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003408 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 return;
3410 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003411 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003413 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003414 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003415 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003417 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418 }
3419 }
3420 }
3421 catch(std::bad_alloc&)
3422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003423 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424 }
3425}
3426
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003427void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003429 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 +00003430 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003431
3432 try
3433 {
3434 if (bufsize < 0)
3435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003436 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003437 }
3438
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003439 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003440
3441 if (context)
3442 {
3443 gl::Program *programObject = context->getProgram(program);
3444
3445 if (!programObject)
3446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003447 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003448 }
3449
3450 programObject->getInfoLog(bufsize, length, infolog);
3451 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003452 }
3453 catch(std::bad_alloc&)
3454 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003455 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003456 }
3457}
3458
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003459void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3460{
3461 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3462
3463 try
3464 {
3465 switch (pname)
3466 {
3467 case GL_CURRENT_QUERY_EXT:
3468 break;
3469 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003470 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003471 }
3472
3473 gl::Context *context = gl::getNonLostContext();
3474
3475 if (context)
3476 {
3477 params[0] = context->getActiveQuery(target);
3478 }
3479 }
3480 catch(std::bad_alloc&)
3481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003482 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003483 }
3484}
3485
3486void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3487{
3488 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3489
3490 try
3491 {
3492 switch (pname)
3493 {
3494 case GL_QUERY_RESULT_EXT:
3495 case GL_QUERY_RESULT_AVAILABLE_EXT:
3496 break;
3497 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003498 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003499 }
3500 gl::Context *context = gl::getNonLostContext();
3501
3502 if (context)
3503 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003504 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3505
3506 if (!queryObject)
3507 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003508 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003509 }
3510
3511 if (context->getActiveQuery(queryObject->getType()) == id)
3512 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003513 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003514 }
3515
3516 switch(pname)
3517 {
3518 case GL_QUERY_RESULT_EXT:
3519 params[0] = queryObject->getResult();
3520 break;
3521 case GL_QUERY_RESULT_AVAILABLE_EXT:
3522 params[0] = queryObject->isResultAvailable();
3523 break;
3524 default:
3525 ASSERT(false);
3526 }
3527 }
3528 }
3529 catch(std::bad_alloc&)
3530 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003531 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003532 }
3533}
3534
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003535void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3536{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003537 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 +00003538
3539 try
3540 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003541 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003542
3543 if (context)
3544 {
3545 if (target != GL_RENDERBUFFER)
3546 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003547 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003548 }
3549
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003550 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003552 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003553 }
3554
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003555 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003556
3557 switch (pname)
3558 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003559 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3560 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3561 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3562 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3563 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3564 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3565 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3566 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3567 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003568 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003569 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003570 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003571 *params = renderbuffer->getSamples();
3572 }
3573 else
3574 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003575 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003576 }
3577 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003578 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003580 }
3581 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003582 }
3583 catch(std::bad_alloc&)
3584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003585 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003586 }
3587}
3588
3589void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003591 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003592
3593 try
3594 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003596
3597 if (context)
3598 {
3599 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003600
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003601 if (!shaderObject)
3602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003603 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003604 }
3605
3606 switch (pname)
3607 {
3608 case GL_SHADER_TYPE:
3609 *params = shaderObject->getType();
3610 return;
3611 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003612 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003613 return;
3614 case GL_COMPILE_STATUS:
3615 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3616 return;
3617 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003618 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003619 return;
3620 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003621 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003622 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003623 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3624 *params = shaderObject->getTranslatedSourceLength();
3625 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003627 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003628 }
3629 }
3630 }
3631 catch(std::bad_alloc&)
3632 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003633 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003634 }
3635}
3636
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003637void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003638{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003639 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 +00003640 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641
3642 try
3643 {
3644 if (bufsize < 0)
3645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003646 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003647 }
3648
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003649 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003650
3651 if (context)
3652 {
3653 gl::Shader *shaderObject = context->getShader(shader);
3654
3655 if (!shaderObject)
3656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003658 }
3659
3660 shaderObject->getInfoLog(bufsize, length, infolog);
3661 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003662 }
3663 catch(std::bad_alloc&)
3664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003665 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003666 }
3667}
3668
3669void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3670{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003671 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 +00003672 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673
3674 try
3675 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003676 switch (shadertype)
3677 {
3678 case GL_VERTEX_SHADER:
3679 case GL_FRAGMENT_SHADER:
3680 break;
3681 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003682 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003683 }
3684
3685 switch (precisiontype)
3686 {
3687 case GL_LOW_FLOAT:
3688 case GL_MEDIUM_FLOAT:
3689 case GL_HIGH_FLOAT:
3690 // Assume IEEE 754 precision
3691 range[0] = 127;
3692 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003693 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003694 break;
3695 case GL_LOW_INT:
3696 case GL_MEDIUM_INT:
3697 case GL_HIGH_INT:
3698 // Some (most) hardware only supports single-precision floating-point numbers,
3699 // which can accurately represent integers up to +/-16777216
3700 range[0] = 24;
3701 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003702 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003703 break;
3704 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003705 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003706 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003707 }
3708 catch(std::bad_alloc&)
3709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003710 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003711 }
3712}
3713
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003714void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003715{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003716 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 +00003717 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003718
3719 try
3720 {
3721 if (bufsize < 0)
3722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003723 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003724 }
3725
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003726 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003727
3728 if (context)
3729 {
3730 gl::Shader *shaderObject = context->getShader(shader);
3731
3732 if (!shaderObject)
3733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003734 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003735 }
3736
3737 shaderObject->getSource(bufsize, length, source);
3738 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003739 }
3740 catch(std::bad_alloc&)
3741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003743 }
3744}
3745
zmo@google.coma574f782011-10-03 21:45:23 +00003746void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3747{
3748 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3749 shader, bufsize, length, source);
3750
3751 try
3752 {
3753 if (bufsize < 0)
3754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003755 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003756 }
3757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003758 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003759
3760 if (context)
3761 {
3762 gl::Shader *shaderObject = context->getShader(shader);
3763
3764 if (!shaderObject)
3765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003766 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003767 }
3768
3769 shaderObject->getTranslatedSource(bufsize, length, source);
3770 }
3771 }
3772 catch(std::bad_alloc&)
3773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003774 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003775 }
3776}
3777
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778const GLubyte* __stdcall glGetString(GLenum name)
3779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003780 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003781
3782 try
3783 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003784 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003785
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003786 switch (name)
3787 {
3788 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003789 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003790 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003791 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003792 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003793 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003794 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003795 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003796 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003797 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003798 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003799 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003800 }
3801 }
3802 catch(std::bad_alloc&)
3803 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003804 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806}
3807
3808void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3809{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003810 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 +00003811
3812 try
3813 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003814 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003815
3816 if (context)
3817 {
3818 gl::Texture *texture;
3819
3820 switch (target)
3821 {
3822 case GL_TEXTURE_2D:
3823 texture = context->getTexture2D();
3824 break;
3825 case GL_TEXTURE_CUBE_MAP:
3826 texture = context->getTextureCubeMap();
3827 break;
3828 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003829 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003830 }
3831
3832 switch (pname)
3833 {
3834 case GL_TEXTURE_MAG_FILTER:
3835 *params = (GLfloat)texture->getMagFilter();
3836 break;
3837 case GL_TEXTURE_MIN_FILTER:
3838 *params = (GLfloat)texture->getMinFilter();
3839 break;
3840 case GL_TEXTURE_WRAP_S:
3841 *params = (GLfloat)texture->getWrapS();
3842 break;
3843 case GL_TEXTURE_WRAP_T:
3844 *params = (GLfloat)texture->getWrapT();
3845 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003846 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3847 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3848 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003849 case GL_TEXTURE_USAGE_ANGLE:
3850 *params = (GLfloat)texture->getUsage();
3851 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003852 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3853 if (!context->supportsTextureFilterAnisotropy())
3854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003855 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003856 }
3857 *params = (GLfloat)texture->getMaxAnisotropy();
3858 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003859 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003860 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003861 }
3862 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003863 }
3864 catch(std::bad_alloc&)
3865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003866 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003867 }
3868}
3869
3870void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3871{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003872 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 +00003873
3874 try
3875 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003877
3878 if (context)
3879 {
3880 gl::Texture *texture;
3881
3882 switch (target)
3883 {
3884 case GL_TEXTURE_2D:
3885 texture = context->getTexture2D();
3886 break;
3887 case GL_TEXTURE_CUBE_MAP:
3888 texture = context->getTextureCubeMap();
3889 break;
3890 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003891 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003892 }
3893
3894 switch (pname)
3895 {
3896 case GL_TEXTURE_MAG_FILTER:
3897 *params = texture->getMagFilter();
3898 break;
3899 case GL_TEXTURE_MIN_FILTER:
3900 *params = texture->getMinFilter();
3901 break;
3902 case GL_TEXTURE_WRAP_S:
3903 *params = texture->getWrapS();
3904 break;
3905 case GL_TEXTURE_WRAP_T:
3906 *params = texture->getWrapT();
3907 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003908 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3909 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3910 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003911 case GL_TEXTURE_USAGE_ANGLE:
3912 *params = texture->getUsage();
3913 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003914 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3915 if (!context->supportsTextureFilterAnisotropy())
3916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003917 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003918 }
3919 *params = (GLint)texture->getMaxAnisotropy();
3920 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003921 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003922 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003923 }
3924 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003925 }
3926 catch(std::bad_alloc&)
3927 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003928 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003929 }
3930}
3931
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003932void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3933{
3934 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3935 program, location, bufSize, params);
3936
3937 try
3938 {
3939 if (bufSize < 0)
3940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003941 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003942 }
3943
3944 gl::Context *context = gl::getNonLostContext();
3945
3946 if (context)
3947 {
3948 if (program == 0)
3949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003951 }
3952
3953 gl::Program *programObject = context->getProgram(program);
3954
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003955 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003957 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003958 }
3959
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003960 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3961 if (!programBinary)
3962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003963 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003964 }
3965
3966 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003968 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003969 }
3970 }
3971 }
3972 catch(std::bad_alloc&)
3973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003974 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003975 }
3976}
3977
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003980 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981
3982 try
3983 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003984 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003985
3986 if (context)
3987 {
3988 if (program == 0)
3989 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003990 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003991 }
3992
3993 gl::Program *programObject = context->getProgram(program);
3994
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003995 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003998 }
3999
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004000 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4001 if (!programBinary)
4002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004003 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004004 }
4005
4006 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004008 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004009 }
4010 }
4011 }
4012 catch(std::bad_alloc&)
4013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004015 }
4016}
4017
4018void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4019{
4020 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4021 program, location, bufSize, params);
4022
4023 try
4024 {
4025 if (bufSize < 0)
4026 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004027 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004028 }
4029
4030 gl::Context *context = gl::getNonLostContext();
4031
4032 if (context)
4033 {
4034 if (program == 0)
4035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004037 }
4038
4039 gl::Program *programObject = context->getProgram(program);
4040
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004041 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004044 }
4045
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004046 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4047 if (!programBinary)
4048 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004049 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004050 }
4051
4052 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004054 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004055 }
4056 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004057 }
4058 catch(std::bad_alloc&)
4059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004061 }
4062}
4063
4064void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004066 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004067
4068 try
4069 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004071
4072 if (context)
4073 {
4074 if (program == 0)
4075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004076 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004077 }
4078
4079 gl::Program *programObject = context->getProgram(program);
4080
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004081 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004083 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004084 }
4085
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004086 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4087 if (!programBinary)
4088 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004089 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004090 }
4091
4092 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004094 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004095 }
4096 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004097 }
4098 catch(std::bad_alloc&)
4099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004100 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004101 }
4102}
4103
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004104int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004105{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004106 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004107
4108 try
4109 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004110 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111
4112 if (strstr(name, "gl_") == name)
4113 {
4114 return -1;
4115 }
4116
4117 if (context)
4118 {
4119 gl::Program *programObject = context->getProgram(program);
4120
4121 if (!programObject)
4122 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004123 if (context->getShader(program))
4124 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004125 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004126 }
4127 else
4128 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004129 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004130 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004131 }
4132
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004133 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004134 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004136 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004137 }
4138
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004139 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004140 }
4141 }
4142 catch(std::bad_alloc&)
4143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004144 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004145 }
4146
4147 return -1;
4148}
4149
4150void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004152 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004153
4154 try
4155 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004156 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004157
daniel@transgaming.come0078962010-04-15 20:45:08 +00004158 if (context)
4159 {
4160 if (index >= gl::MAX_VERTEX_ATTRIBS)
4161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004162 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004163 }
4164
daniel@transgaming.com83921382011-01-08 05:46:00 +00004165 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004166
daniel@transgaming.come0078962010-04-15 20:45:08 +00004167 switch (pname)
4168 {
4169 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004170 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004171 break;
4172 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004173 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004174 break;
4175 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004176 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004177 break;
4178 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004179 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004180 break;
4181 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004182 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004183 break;
4184 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004185 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004186 break;
4187 case GL_CURRENT_VERTEX_ATTRIB:
4188 for (int i = 0; i < 4; ++i)
4189 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004190 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004191 }
4192 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004193 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4194 *params = (GLfloat)attribState.mDivisor;
4195 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004196 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004197 }
4198 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199 }
4200 catch(std::bad_alloc&)
4201 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004202 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004203 }
4204}
4205
4206void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4207{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004208 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004209
4210 try
4211 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004213
daniel@transgaming.come0078962010-04-15 20:45:08 +00004214 if (context)
4215 {
4216 if (index >= gl::MAX_VERTEX_ATTRIBS)
4217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004218 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004219 }
4220
daniel@transgaming.com83921382011-01-08 05:46:00 +00004221 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004222
daniel@transgaming.come0078962010-04-15 20:45:08 +00004223 switch (pname)
4224 {
4225 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004226 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004227 break;
4228 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004229 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004230 break;
4231 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004232 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004233 break;
4234 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004235 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004236 break;
4237 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004238 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004239 break;
4240 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004241 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004242 break;
4243 case GL_CURRENT_VERTEX_ATTRIB:
4244 for (int i = 0; i < 4; ++i)
4245 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004246 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004247 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4248 }
4249 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004250 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4251 *params = (GLint)attribState.mDivisor;
4252 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004253 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004254 }
4255 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004256 }
4257 catch(std::bad_alloc&)
4258 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004259 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004260 }
4261}
4262
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004263void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004264{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004265 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004266
4267 try
4268 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004269 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004270
daniel@transgaming.come0078962010-04-15 20:45:08 +00004271 if (context)
4272 {
4273 if (index >= gl::MAX_VERTEX_ATTRIBS)
4274 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004275 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004276 }
4277
4278 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004280 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004281 }
4282
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004283 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004284 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004285 }
4286 catch(std::bad_alloc&)
4287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004288 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004289 }
4290}
4291
4292void __stdcall glHint(GLenum target, GLenum mode)
4293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004294 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295
4296 try
4297 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004298 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004299 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004300 case GL_FASTEST:
4301 case GL_NICEST:
4302 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004303 break;
4304 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004305 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004306 }
4307
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004308 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004309 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004310 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004311 case GL_GENERATE_MIPMAP_HINT:
4312 if (context) context->setGenerateMipmapHint(mode);
4313 break;
4314 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4315 if (context) context->setFragmentShaderDerivativeHint(mode);
4316 break;
4317 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004318 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004319 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320 }
4321 catch(std::bad_alloc&)
4322 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004323 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324 }
4325}
4326
4327GLboolean __stdcall glIsBuffer(GLuint buffer)
4328{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004329 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004330
4331 try
4332 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004333 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004334
4335 if (context && buffer)
4336 {
4337 gl::Buffer *bufferObject = context->getBuffer(buffer);
4338
4339 if (bufferObject)
4340 {
4341 return GL_TRUE;
4342 }
4343 }
4344 }
4345 catch(std::bad_alloc&)
4346 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004347 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004348 }
4349
4350 return GL_FALSE;
4351}
4352
4353GLboolean __stdcall glIsEnabled(GLenum cap)
4354{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004355 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004356
4357 try
4358 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004359 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004360
4361 if (context)
4362 {
4363 switch (cap)
4364 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004365 case GL_CULL_FACE: return context->isCullFaceEnabled();
4366 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4367 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4368 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4369 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4370 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4371 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4372 case GL_BLEND: return context->isBlendEnabled();
4373 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004375 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004376 }
4377 }
4378 }
4379 catch(std::bad_alloc&)
4380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004381 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004382 }
4383
4384 return false;
4385}
4386
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004387GLboolean __stdcall glIsFenceNV(GLuint fence)
4388{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004389 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004390
4391 try
4392 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004393 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004394
4395 if (context)
4396 {
4397 gl::Fence *fenceObject = context->getFence(fence);
4398
4399 if (fenceObject == NULL)
4400 {
4401 return GL_FALSE;
4402 }
4403
4404 return fenceObject->isFence();
4405 }
4406 }
4407 catch(std::bad_alloc&)
4408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004409 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004410 }
4411
4412 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004413}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004414
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4416{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004417 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004418
4419 try
4420 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004421 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422
4423 if (context && framebuffer)
4424 {
4425 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4426
4427 if (framebufferObject)
4428 {
4429 return GL_TRUE;
4430 }
4431 }
4432 }
4433 catch(std::bad_alloc&)
4434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004435 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 }
4437
4438 return GL_FALSE;
4439}
4440
4441GLboolean __stdcall glIsProgram(GLuint program)
4442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004443 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004444
4445 try
4446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004448
4449 if (context && program)
4450 {
4451 gl::Program *programObject = context->getProgram(program);
4452
4453 if (programObject)
4454 {
4455 return GL_TRUE;
4456 }
4457 }
4458 }
4459 catch(std::bad_alloc&)
4460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004461 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004462 }
4463
4464 return GL_FALSE;
4465}
4466
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004467GLboolean __stdcall glIsQueryEXT(GLuint id)
4468{
4469 EVENT("(GLuint id = %d)", id);
4470
4471 try
4472 {
4473 if (id == 0)
4474 {
4475 return GL_FALSE;
4476 }
4477
4478 gl::Context *context = gl::getNonLostContext();
4479
4480 if (context)
4481 {
4482 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4483
4484 if (queryObject)
4485 {
4486 return GL_TRUE;
4487 }
4488 }
4489 }
4490 catch(std::bad_alloc&)
4491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004492 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004493 }
4494
4495 return GL_FALSE;
4496}
4497
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4499{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004500 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501
4502 try
4503 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004504 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505
4506 if (context && renderbuffer)
4507 {
4508 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4509
4510 if (renderbufferObject)
4511 {
4512 return GL_TRUE;
4513 }
4514 }
4515 }
4516 catch(std::bad_alloc&)
4517 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004518 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004519 }
4520
4521 return GL_FALSE;
4522}
4523
4524GLboolean __stdcall glIsShader(GLuint shader)
4525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004526 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004527
4528 try
4529 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004530 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004531
4532 if (context && shader)
4533 {
4534 gl::Shader *shaderObject = context->getShader(shader);
4535
4536 if (shaderObject)
4537 {
4538 return GL_TRUE;
4539 }
4540 }
4541 }
4542 catch(std::bad_alloc&)
4543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004544 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004545 }
4546
4547 return GL_FALSE;
4548}
4549
4550GLboolean __stdcall glIsTexture(GLuint texture)
4551{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004552 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553
4554 try
4555 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004556 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004557
4558 if (context && texture)
4559 {
4560 gl::Texture *textureObject = context->getTexture(texture);
4561
4562 if (textureObject)
4563 {
4564 return GL_TRUE;
4565 }
4566 }
4567 }
4568 catch(std::bad_alloc&)
4569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004570 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004571 }
4572
4573 return GL_FALSE;
4574}
4575
4576void __stdcall glLineWidth(GLfloat width)
4577{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004578 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579
4580 try
4581 {
4582 if (width <= 0.0f)
4583 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004584 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585 }
4586
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004587 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004588
4589 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004590 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004591 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592 }
4593 }
4594 catch(std::bad_alloc&)
4595 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004596 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 }
4598}
4599
4600void __stdcall glLinkProgram(GLuint program)
4601{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004602 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004603
4604 try
4605 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004606 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004607
4608 if (context)
4609 {
4610 gl::Program *programObject = context->getProgram(program);
4611
4612 if (!programObject)
4613 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004614 if (context->getShader(program))
4615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004616 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004617 }
4618 else
4619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004620 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004621 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004624 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 }
4626 }
4627 catch(std::bad_alloc&)
4628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004629 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004630 }
4631}
4632
4633void __stdcall glPixelStorei(GLenum pname, GLint param)
4634{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004635 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004636
4637 try
4638 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004639 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004640
4641 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004642 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004643 switch (pname)
4644 {
4645 case GL_UNPACK_ALIGNMENT:
4646 if (param != 1 && param != 2 && param != 4 && param != 8)
4647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004648 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004649 }
4650
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004651 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004652 break;
4653
4654 case GL_PACK_ALIGNMENT:
4655 if (param != 1 && param != 2 && param != 4 && param != 8)
4656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004658 }
4659
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004660 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004661 break;
4662
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004663 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4664 context->setPackReverseRowOrder(param != 0);
4665 break;
4666
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004667 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004668 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004669 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004670 }
4671 }
4672 catch(std::bad_alloc&)
4673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004674 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004675 }
4676}
4677
4678void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004680 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004681
4682 try
4683 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004684 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004685
4686 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004687 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004688 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004689 }
4690 }
4691 catch(std::bad_alloc&)
4692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004694 }
4695}
4696
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004697void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4698 GLenum format, GLenum type, GLsizei bufSize,
4699 GLvoid *data)
4700{
4701 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4702 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4703 x, y, width, height, format, type, bufSize, data);
4704
4705 try
4706 {
4707 if (width < 0 || height < 0 || bufSize < 0)
4708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004709 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004710 }
4711
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004712 gl::Context *context = gl::getNonLostContext();
4713
4714 if (context)
4715 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004716 GLenum currentFormat, currentType;
4717
4718 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4719 // and attempting to read back if that's the case is an error. The error will be registered
4720 // by getCurrentReadFormat.
4721 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4722 return;
4723
4724 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4725 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004726 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004727 }
4728
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004729 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4730 }
4731 }
4732 catch(std::bad_alloc&)
4733 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004734 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004735 }
4736}
4737
4738void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4739 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004740{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004741 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004742 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004743 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744
4745 try
4746 {
4747 if (width < 0 || height < 0)
4748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004749 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750 }
4751
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004752 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004753
4754 if (context)
4755 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004756 GLenum currentFormat, currentType;
4757
4758 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4759 // and attempting to read back if that's the case is an error. The error will be registered
4760 // by getCurrentReadFormat.
4761 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4762 return;
4763
4764 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004767 }
4768
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004769 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004770 }
4771 }
4772 catch(std::bad_alloc&)
4773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004774 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004775 }
4776}
4777
4778void __stdcall glReleaseShaderCompiler(void)
4779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004780 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004781
4782 try
4783 {
4784 gl::Shader::releaseCompiler();
4785 }
4786 catch(std::bad_alloc&)
4787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004788 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004789 }
4790}
4791
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004792void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004794 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 +00004795 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796
4797 try
4798 {
4799 switch (target)
4800 {
4801 case GL_RENDERBUFFER:
4802 break;
4803 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004804 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004805 }
4806
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004807 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810 }
4811
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004812 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004814 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815 }
4816
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004817 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004818
4819 if (context)
4820 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004821 if (width > context->getMaximumRenderbufferDimension() ||
4822 height > context->getMaximumRenderbufferDimension() ||
4823 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004824 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004825 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004826 }
4827
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004828 GLuint handle = context->getRenderbufferHandle();
4829 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004831 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004832 }
4833
4834 switch (internalformat)
4835 {
4836 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004837 case GL_RGBA4:
4838 case GL_RGB5_A1:
4839 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004840 case GL_RGB8_OES:
4841 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004842 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004843 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004844 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004845 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004846 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004847 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004848 }
4849 }
4850 }
4851 catch(std::bad_alloc&)
4852 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004853 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854 }
4855}
4856
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004857void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4858{
4859 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4860}
4861
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4863{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004864 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004865
4866 try
4867 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004868 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004869
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870 if (context)
4871 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004872 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004873 }
4874 }
4875 catch(std::bad_alloc&)
4876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004877 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004878 }
4879}
4880
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004881void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4882{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004883 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004884
4885 try
4886 {
4887 if (condition != GL_ALL_COMPLETED_NV)
4888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004889 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004890 }
4891
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004892 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004893
4894 if (context)
4895 {
4896 gl::Fence *fenceObject = context->getFence(fence);
4897
4898 if (fenceObject == NULL)
4899 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004900 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004901 }
4902
4903 fenceObject->setFence(condition);
4904 }
4905 }
4906 catch(std::bad_alloc&)
4907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004908 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004909 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004910}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004911
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004912void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004914 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 +00004915
4916 try
4917 {
4918 if (width < 0 || height < 0)
4919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004920 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004921 }
4922
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004923 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004924
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004925 if (context)
4926 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004927 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 }
4929 }
4930 catch(std::bad_alloc&)
4931 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004932 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004933 }
4934}
4935
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004936void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004937{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004938 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004939 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004940 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004941
4942 try
4943 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004944 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004945 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004946 }
4947 catch(std::bad_alloc&)
4948 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004949 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004950 }
4951}
4952
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004953void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004955 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 +00004956 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957
4958 try
4959 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004960 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004962 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004963 }
4964
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004965 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966
4967 if (context)
4968 {
4969 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004970
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004971 if (!shaderObject)
4972 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004973 if (context->getProgram(shader))
4974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004975 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004976 }
4977 else
4978 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004979 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004980 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004981 }
4982
4983 shaderObject->setSource(count, string, length);
4984 }
4985 }
4986 catch(std::bad_alloc&)
4987 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004988 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004989 }
4990}
4991
4992void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4993{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004994 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995}
4996
4997void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4998{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004999 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 +00005000
5001 try
5002 {
5003 switch (face)
5004 {
5005 case GL_FRONT:
5006 case GL_BACK:
5007 case GL_FRONT_AND_BACK:
5008 break;
5009 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005010 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011 }
5012
5013 switch (func)
5014 {
5015 case GL_NEVER:
5016 case GL_ALWAYS:
5017 case GL_LESS:
5018 case GL_LEQUAL:
5019 case GL_EQUAL:
5020 case GL_GEQUAL:
5021 case GL_GREATER:
5022 case GL_NOTEQUAL:
5023 break;
5024 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005025 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005026 }
5027
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005028 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005029
5030 if (context)
5031 {
5032 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5033 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005034 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035 }
5036
5037 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5038 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005039 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040 }
5041 }
5042 }
5043 catch(std::bad_alloc&)
5044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005045 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005046 }
5047}
5048
5049void __stdcall glStencilMask(GLuint mask)
5050{
5051 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5052}
5053
5054void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005056 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005057
5058 try
5059 {
5060 switch (face)
5061 {
5062 case GL_FRONT:
5063 case GL_BACK:
5064 case GL_FRONT_AND_BACK:
5065 break;
5066 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005067 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068 }
5069
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005070 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005071
5072 if (context)
5073 {
5074 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5075 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005076 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005077 }
5078
5079 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5080 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005081 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005082 }
5083 }
5084 }
5085 catch(std::bad_alloc&)
5086 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005087 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005088 }
5089}
5090
5091void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5092{
5093 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5094}
5095
5096void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5097{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005098 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 +00005099 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100
5101 try
5102 {
5103 switch (face)
5104 {
5105 case GL_FRONT:
5106 case GL_BACK:
5107 case GL_FRONT_AND_BACK:
5108 break;
5109 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005110 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005111 }
5112
5113 switch (fail)
5114 {
5115 case GL_ZERO:
5116 case GL_KEEP:
5117 case GL_REPLACE:
5118 case GL_INCR:
5119 case GL_DECR:
5120 case GL_INVERT:
5121 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005122 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005123 break;
5124 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005125 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005126 }
5127
5128 switch (zfail)
5129 {
5130 case GL_ZERO:
5131 case GL_KEEP:
5132 case GL_REPLACE:
5133 case GL_INCR:
5134 case GL_DECR:
5135 case GL_INVERT:
5136 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005137 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 break;
5139 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005140 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005141 }
5142
5143 switch (zpass)
5144 {
5145 case GL_ZERO:
5146 case GL_KEEP:
5147 case GL_REPLACE:
5148 case GL_INCR:
5149 case GL_DECR:
5150 case GL_INVERT:
5151 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005152 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005153 break;
5154 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005155 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156 }
5157
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005158 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005159
5160 if (context)
5161 {
5162 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5163 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005164 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 }
5166
5167 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5168 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005169 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005170 }
5171 }
5172 }
5173 catch(std::bad_alloc&)
5174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005175 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005176 }
5177}
5178
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005179GLboolean __stdcall glTestFenceNV(GLuint fence)
5180{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005181 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005182
5183 try
5184 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005185 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005186
5187 if (context)
5188 {
5189 gl::Fence *fenceObject = context->getFence(fence);
5190
5191 if (fenceObject == NULL)
5192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005193 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005194 }
5195
5196 return fenceObject->testFence();
5197 }
5198 }
5199 catch(std::bad_alloc&)
5200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005201 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005202 }
5203
5204 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005205}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005206
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005207void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5208 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005210 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 +00005211 "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 +00005212 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005213
5214 try
5215 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005216 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005218 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005220
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005221 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005223 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224 }
5225
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005226 // validate <type> by itself (used as secondary key below)
5227 switch (type)
5228 {
5229 case GL_UNSIGNED_BYTE:
5230 case GL_UNSIGNED_SHORT_5_6_5:
5231 case GL_UNSIGNED_SHORT_4_4_4_4:
5232 case GL_UNSIGNED_SHORT_5_5_5_1:
5233 case GL_UNSIGNED_SHORT:
5234 case GL_UNSIGNED_INT:
5235 case GL_UNSIGNED_INT_24_8_OES:
5236 case GL_HALF_FLOAT_OES:
5237 case GL_FLOAT:
5238 break;
5239 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005240 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005241 }
5242
5243 // validate <format> + <type> combinations
5244 // - invalid <format> -> sets INVALID_ENUM
5245 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005246 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005247 {
5248 case GL_ALPHA:
5249 case GL_LUMINANCE:
5250 case GL_LUMINANCE_ALPHA:
5251 switch (type)
5252 {
5253 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005254 case GL_FLOAT:
5255 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 break;
5257 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005258 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005259 }
5260 break;
5261 case GL_RGB:
5262 switch (type)
5263 {
5264 case GL_UNSIGNED_BYTE:
5265 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005266 case GL_FLOAT:
5267 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 break;
5269 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005270 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271 }
5272 break;
5273 case GL_RGBA:
5274 switch (type)
5275 {
5276 case GL_UNSIGNED_BYTE:
5277 case GL_UNSIGNED_SHORT_4_4_4_4:
5278 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005279 case GL_FLOAT:
5280 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281 break;
5282 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005283 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005284 }
5285 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005286 case GL_BGRA_EXT:
5287 switch (type)
5288 {
5289 case GL_UNSIGNED_BYTE:
5290 break;
5291 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005292 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005293 }
5294 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005295 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5296 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005297 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5298 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005299 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005300 case GL_DEPTH_COMPONENT:
5301 switch (type)
5302 {
5303 case GL_UNSIGNED_SHORT:
5304 case GL_UNSIGNED_INT:
5305 break;
5306 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005307 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005308 }
5309 break;
5310 case GL_DEPTH_STENCIL_OES:
5311 switch (type)
5312 {
5313 case GL_UNSIGNED_INT_24_8_OES:
5314 break;
5315 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005316 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005317 }
5318 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005319 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005320 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005321 }
5322
5323 if (border != 0)
5324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005325 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 }
5327
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005328 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005329
5330 if (context)
5331 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005332 if (level > context->getMaximumTextureLevel())
5333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005335 }
5336
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005337 switch (target)
5338 {
5339 case GL_TEXTURE_2D:
5340 if (width > (context->getMaximumTextureDimension() >> level) ||
5341 height > (context->getMaximumTextureDimension() >> level))
5342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005343 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005344 }
5345 break;
5346 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5347 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5348 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5349 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5350 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5351 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5352 if (width != height)
5353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005354 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005355 }
5356
5357 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5358 height > (context->getMaximumCubeTextureDimension() >> level))
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 break;
5363 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005364 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005365 }
5366
gman@chromium.org50c526d2011-08-10 05:19:44 +00005367 switch (format) {
5368 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5369 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5370 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005371 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005372 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005373 }
5374 else
5375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005376 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005377 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005378 break;
5379 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5380 if (context->supportsDXT3Textures())
5381 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005382 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005383 }
5384 else
5385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005386 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005387 }
5388 break;
5389 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5390 if (context->supportsDXT5Textures())
5391 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005392 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005393 }
5394 else
5395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005396 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005397 }
5398 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005399 case GL_DEPTH_COMPONENT:
5400 case GL_DEPTH_STENCIL_OES:
5401 if (!context->supportsDepthTextures())
5402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005403 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005404 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005405 if (target != GL_TEXTURE_2D)
5406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005407 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005408 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005409 // OES_depth_texture supports loading depth data and multiple levels,
5410 // but ANGLE_depth_texture does not
5411 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005412 {
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.com835a95a2012-05-31 01:14:07 +00005415 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005416 default:
5417 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005418 }
5419
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005420 if (type == GL_FLOAT)
5421 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005422 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005423 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005424 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005425 }
5426 }
5427 else if (type == GL_HALF_FLOAT_OES)
5428 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005429 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005432 }
5433 }
5434
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005435 if (target == GL_TEXTURE_2D)
5436 {
5437 gl::Texture2D *texture = context->getTexture2D();
5438
5439 if (!texture)
5440 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005441 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442 }
5443
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005444 if (texture->isImmutable())
5445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005447 }
5448
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005449 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005450 }
5451 else
5452 {
5453 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5454
5455 if (!texture)
5456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005457 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005458 }
5459
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005460 if (texture->isImmutable())
5461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005462 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005463 }
5464
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465 switch (target)
5466 {
5467 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005468 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005469 break;
5470 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005471 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005472 break;
5473 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005474 texture->setImagePosY(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_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005477 texture->setImageNegY(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_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005480 texture->setImagePosZ(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_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005483 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005484 break;
5485 default: UNREACHABLE();
5486 }
5487 }
5488 }
5489 }
5490 catch(std::bad_alloc&)
5491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005493 }
5494}
5495
5496void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5497{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005498 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5499
5500 try
5501 {
5502 gl::Context *context = gl::getNonLostContext();
5503
5504 if (context)
5505 {
5506 gl::Texture *texture;
5507
5508 switch (target)
5509 {
5510 case GL_TEXTURE_2D:
5511 texture = context->getTexture2D();
5512 break;
5513 case GL_TEXTURE_CUBE_MAP:
5514 texture = context->getTextureCubeMap();
5515 break;
5516 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005517 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005518 }
5519
5520 switch (pname)
5521 {
5522 case GL_TEXTURE_WRAP_S:
5523 if (!texture->setWrapS((GLenum)param))
5524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005525 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005526 }
5527 break;
5528 case GL_TEXTURE_WRAP_T:
5529 if (!texture->setWrapT((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_MIN_FILTER:
5535 if (!texture->setMinFilter((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_MAG_FILTER:
5541 if (!texture->setMagFilter((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_USAGE_ANGLE:
5547 if (!texture->setUsage((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_MAX_ANISOTROPY_EXT:
5553 if (!context->supportsTextureFilterAnisotropy())
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 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005559 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005560 }
5561 break;
5562 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005563 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005564 }
5565 }
5566 }
5567 catch(std::bad_alloc&)
5568 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005569 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005571}
5572
5573void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5574{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005575 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005576}
5577
5578void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5579{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005580 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005581
5582 try
5583 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005585
5586 if (context)
5587 {
5588 gl::Texture *texture;
5589
5590 switch (target)
5591 {
5592 case GL_TEXTURE_2D:
5593 texture = context->getTexture2D();
5594 break;
5595 case GL_TEXTURE_CUBE_MAP:
5596 texture = context->getTextureCubeMap();
5597 break;
5598 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005599 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005600 }
5601
5602 switch (pname)
5603 {
5604 case GL_TEXTURE_WRAP_S:
5605 if (!texture->setWrapS((GLenum)param))
5606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005607 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005608 }
5609 break;
5610 case GL_TEXTURE_WRAP_T:
5611 if (!texture->setWrapT((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_MIN_FILTER:
5617 if (!texture->setMinFilter((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_MAG_FILTER:
5623 if (!texture->setMagFilter((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;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005628 case GL_TEXTURE_USAGE_ANGLE:
5629 if (!texture->setUsage((GLenum)param))
5630 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005631 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005632 }
5633 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005634 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5635 if (!context->supportsTextureFilterAnisotropy())
5636 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005637 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005638 }
5639 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5640 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005641 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005642 }
5643 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005644 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005645 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005646 }
5647 }
5648 }
5649 catch(std::bad_alloc&)
5650 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005651 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005652 }
5653}
5654
5655void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5656{
5657 glTexParameteri(target, pname, *params);
5658}
5659
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005660void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5661{
5662 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5663 target, levels, internalformat, width, height);
5664
5665 try
5666 {
5667 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005669 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005670 }
5671
5672 if (width < 1 || height < 1 || levels < 1)
5673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005675 }
5676
5677 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005679 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005680 }
5681
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005682 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005683 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005684 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005685 }
5686
5687 GLenum format = gl::ExtractFormat(internalformat);
5688 GLenum type = gl::ExtractType(internalformat);
5689
5690 if (format == GL_NONE || type == GL_NONE)
5691 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005692 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005693 }
5694
5695 gl::Context *context = gl::getNonLostContext();
5696
5697 if (context)
5698 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005699 switch (target)
5700 {
5701 case GL_TEXTURE_2D:
5702 if (width > context->getMaximumTextureDimension() ||
5703 height > context->getMaximumTextureDimension())
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005706 }
5707 break;
5708 case GL_TEXTURE_CUBE_MAP:
5709 if (width > context->getMaximumCubeTextureDimension() ||
5710 height > context->getMaximumCubeTextureDimension())
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005713 }
5714 break;
5715 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005716 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005717 }
5718
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005719 if (levels != 1 && !context->supportsNonPower2Texture())
5720 {
5721 if (!gl::isPow2(width) || !gl::isPow2(height))
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005724 }
5725 }
5726
daniel@transgaming.come1077362011-11-11 04:16:50 +00005727 switch (internalformat)
5728 {
5729 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5730 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5731 if (!context->supportsDXT1Textures())
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005734 }
5735 break;
5736 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5737 if (!context->supportsDXT3Textures())
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_DXT5_ANGLE:
5743 if (!context->supportsDXT5Textures())
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;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005748 case GL_RGBA32F_EXT:
5749 case GL_RGB32F_EXT:
5750 case GL_ALPHA32F_EXT:
5751 case GL_LUMINANCE32F_EXT:
5752 case GL_LUMINANCE_ALPHA32F_EXT:
5753 if (!context->supportsFloat32Textures())
5754 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005755 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005756 }
5757 break;
5758 case GL_RGBA16F_EXT:
5759 case GL_RGB16F_EXT:
5760 case GL_ALPHA16F_EXT:
5761 case GL_LUMINANCE16F_EXT:
5762 case GL_LUMINANCE_ALPHA16F_EXT:
5763 if (!context->supportsFloat16Textures())
5764 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005765 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005766 }
5767 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005768 case GL_DEPTH_COMPONENT16:
5769 case GL_DEPTH_COMPONENT32_OES:
5770 case GL_DEPTH24_STENCIL8_OES:
5771 if (!context->supportsDepthTextures())
5772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005773 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005774 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005775 if (target != GL_TEXTURE_2D)
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005778 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005779 // ANGLE_depth_texture only supports 1-level textures
5780 if (levels != 1)
5781 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005782 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005783 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005784 break;
5785 default:
5786 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005787 }
5788
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005789 if (target == GL_TEXTURE_2D)
5790 {
5791 gl::Texture2D *texture = context->getTexture2D();
5792
5793 if (!texture || texture->id() == 0)
5794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005795 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005796 }
5797
5798 if (texture->isImmutable())
5799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005800 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005801 }
5802
5803 texture->storage(levels, internalformat, width, height);
5804 }
5805 else if (target == GL_TEXTURE_CUBE_MAP)
5806 {
5807 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5808
5809 if (!texture || texture->id() == 0)
5810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005811 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005812 }
5813
5814 if (texture->isImmutable())
5815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005816 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005817 }
5818
5819 texture->storage(levels, internalformat, width);
5820 }
5821 else UNREACHABLE();
5822 }
5823 }
5824 catch(std::bad_alloc&)
5825 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005826 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005827 }
5828}
5829
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005830void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5831 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005832{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005833 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005834 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005835 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005836 target, level, xoffset, yoffset, width, height, format, type, pixels);
5837
5838 try
5839 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005840 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005842 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005843 }
5844
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005845 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005846 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005847 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005848 }
5849
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005850 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005852 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005853 }
5854
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005855 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005856 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005857 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005858 }
5859
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005860 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005861
5862 if (context)
5863 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005864 if (level > context->getMaximumTextureLevel())
5865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005866 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005867 }
5868
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005869 if (format == GL_FLOAT)
5870 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005871 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005873 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005874 }
5875 }
5876 else if (format == GL_HALF_FLOAT_OES)
5877 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005878 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005881 }
5882 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005883 else if (gl::IsDepthTexture(format))
5884 {
5885 if (!context->supportsDepthTextures())
5886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005888 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005889 if (target != GL_TEXTURE_2D)
5890 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005891 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005892 }
5893 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005894 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005895 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005896
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005897 if (width == 0 || height == 0 || pixels == NULL)
5898 {
5899 return;
5900 }
5901
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005902 if (target == GL_TEXTURE_2D)
5903 {
5904 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005905 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005906 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005907 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005908 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005909 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005910 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005911 {
5912 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005913 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005914 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005915 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005916 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005917 }
5918 else
5919 {
5920 UNREACHABLE();
5921 }
5922 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005923 }
5924 catch(std::bad_alloc&)
5925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005926 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005927 }
5928}
5929
5930void __stdcall glUniform1f(GLint location, GLfloat x)
5931{
5932 glUniform1fv(location, 1, &x);
5933}
5934
5935void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005937 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938
5939 try
5940 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941 if (count < 0)
5942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005943 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005944 }
5945
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005946 if (location == -1)
5947 {
5948 return;
5949 }
5950
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005951 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005952
5953 if (context)
5954 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005955 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005956 if (!programBinary)
5957 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005958 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005959 }
5960
5961 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005962 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005963 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005964 }
5965 }
5966 }
5967 catch(std::bad_alloc&)
5968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005969 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005970 }
5971}
5972
5973void __stdcall glUniform1i(GLint location, GLint x)
5974{
5975 glUniform1iv(location, 1, &x);
5976}
5977
5978void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5979{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005980 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981
5982 try
5983 {
5984 if (count < 0)
5985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005986 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005987 }
5988
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005989 if (location == -1)
5990 {
5991 return;
5992 }
5993
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005994 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995
5996 if (context)
5997 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005998 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005999 if (!programBinary)
6000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006001 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006002 }
6003
6004 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006005 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006006 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006007 }
6008 }
6009 }
6010 catch(std::bad_alloc&)
6011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006012 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006013 }
6014}
6015
6016void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6017{
6018 GLfloat xy[2] = {x, y};
6019
6020 glUniform2fv(location, 1, (GLfloat*)&xy);
6021}
6022
6023void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6024{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006025 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026
6027 try
6028 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006029 if (count < 0)
6030 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006031 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006032 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006033
6034 if (location == -1)
6035 {
6036 return;
6037 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006038
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006039 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006040
6041 if (context)
6042 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006043 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006044 if (!programBinary)
6045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006046 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006047 }
6048
6049 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006051 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006052 }
6053 }
6054 }
6055 catch(std::bad_alloc&)
6056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006058 }
6059}
6060
6061void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6062{
6063 GLint xy[4] = {x, y};
6064
6065 glUniform2iv(location, 1, (GLint*)&xy);
6066}
6067
6068void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6069{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006070 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006071
6072 try
6073 {
6074 if (count < 0)
6075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006076 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006077 }
6078
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006079 if (location == -1)
6080 {
6081 return;
6082 }
6083
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006084 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006085
6086 if (context)
6087 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006088 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006089 if (!programBinary)
6090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006091 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006092 }
6093
6094 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006096 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006097 }
6098 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006099 }
6100 catch(std::bad_alloc&)
6101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006102 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006103 }
6104}
6105
6106void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6107{
6108 GLfloat xyz[3] = {x, y, z};
6109
6110 glUniform3fv(location, 1, (GLfloat*)&xyz);
6111}
6112
6113void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6114{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006115 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006116
6117 try
6118 {
6119 if (count < 0)
6120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006121 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006122 }
6123
6124 if (location == -1)
6125 {
6126 return;
6127 }
6128
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006129 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006130
6131 if (context)
6132 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006133 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006134 if (!programBinary)
6135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006136 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006137 }
6138
6139 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006141 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006142 }
6143 }
6144 }
6145 catch(std::bad_alloc&)
6146 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006147 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006148 }
6149}
6150
6151void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6152{
6153 GLint xyz[3] = {x, y, z};
6154
6155 glUniform3iv(location, 1, (GLint*)&xyz);
6156}
6157
6158void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006160 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006161
6162 try
6163 {
6164 if (count < 0)
6165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006166 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006167 }
6168
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006169 if (location == -1)
6170 {
6171 return;
6172 }
6173
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006174 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006175
6176 if (context)
6177 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006178 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006179 if (!programBinary)
6180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006181 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006182 }
6183
6184 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006186 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006187 }
6188 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006189 }
6190 catch(std::bad_alloc&)
6191 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006192 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006193 }
6194}
6195
6196void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6197{
6198 GLfloat xyzw[4] = {x, y, z, w};
6199
6200 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6201}
6202
6203void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6204{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006205 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006206
6207 try
6208 {
6209 if (count < 0)
6210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006211 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006212 }
6213
6214 if (location == -1)
6215 {
6216 return;
6217 }
6218
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006219 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006220
6221 if (context)
6222 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006223 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006224 if (!programBinary)
6225 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006226 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006227 }
6228
6229 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006230 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006231 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006232 }
6233 }
6234 }
6235 catch(std::bad_alloc&)
6236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006237 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006238 }
6239}
6240
6241void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6242{
6243 GLint xyzw[4] = {x, y, z, w};
6244
6245 glUniform4iv(location, 1, (GLint*)&xyzw);
6246}
6247
6248void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6249{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006250 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006251
6252 try
6253 {
6254 if (count < 0)
6255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006256 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006257 }
6258
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006259 if (location == -1)
6260 {
6261 return;
6262 }
6263
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006264 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006265
6266 if (context)
6267 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006268 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006269 if (!programBinary)
6270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006271 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006272 }
6273
6274 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006275 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006276 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006277 }
6278 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006279 }
6280 catch(std::bad_alloc&)
6281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006282 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006283 }
6284}
6285
6286void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6287{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006288 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006289 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006290
6291 try
6292 {
6293 if (count < 0 || transpose != GL_FALSE)
6294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006295 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006296 }
6297
6298 if (location == -1)
6299 {
6300 return;
6301 }
6302
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006303 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006304
6305 if (context)
6306 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006307 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006308 if (!programBinary)
6309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006310 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006311 }
6312
6313 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006314 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006315 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006316 }
6317 }
6318 }
6319 catch(std::bad_alloc&)
6320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006321 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006322 }
6323}
6324
6325void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6326{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006327 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006328 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006329
6330 try
6331 {
6332 if (count < 0 || transpose != GL_FALSE)
6333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006334 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006335 }
6336
6337 if (location == -1)
6338 {
6339 return;
6340 }
6341
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006342 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006343
6344 if (context)
6345 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006346 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006347 if (!programBinary)
6348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006349 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006350 }
6351
6352 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006354 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006355 }
6356 }
6357 }
6358 catch(std::bad_alloc&)
6359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006361 }
6362}
6363
6364void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6365{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006366 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006367 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006368
6369 try
6370 {
6371 if (count < 0 || transpose != GL_FALSE)
6372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006374 }
6375
6376 if (location == -1)
6377 {
6378 return;
6379 }
6380
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006381 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006382
6383 if (context)
6384 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006385 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006386 if (!programBinary)
6387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006388 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006389 }
6390
6391 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006393 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006394 }
6395 }
6396 }
6397 catch(std::bad_alloc&)
6398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006399 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006400 }
6401}
6402
6403void __stdcall glUseProgram(GLuint program)
6404{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006405 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006406
6407 try
6408 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006409 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006410
6411 if (context)
6412 {
6413 gl::Program *programObject = context->getProgram(program);
6414
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006415 if (!programObject && program != 0)
6416 {
6417 if (context->getShader(program))
6418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006419 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006420 }
6421 else
6422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006423 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006424 }
6425 }
6426
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006427 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006428 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006429 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006430 }
6431
6432 context->useProgram(program);
6433 }
6434 }
6435 catch(std::bad_alloc&)
6436 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006437 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006438 }
6439}
6440
6441void __stdcall glValidateProgram(GLuint program)
6442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006443 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006444
6445 try
6446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006447 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006448
6449 if (context)
6450 {
6451 gl::Program *programObject = context->getProgram(program);
6452
6453 if (!programObject)
6454 {
6455 if (context->getShader(program))
6456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006457 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006458 }
6459 else
6460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006461 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006462 }
6463 }
6464
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006465 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006467 }
6468 catch(std::bad_alloc&)
6469 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006470 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006471 }
6472}
6473
6474void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6475{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006476 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006477
6478 try
6479 {
6480 if (index >= gl::MAX_VERTEX_ATTRIBS)
6481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006482 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006483 }
6484
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006485 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006486
6487 if (context)
6488 {
6489 GLfloat vals[4] = { x, 0, 0, 1 };
6490 context->setVertexAttrib(index, vals);
6491 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006492 }
6493 catch(std::bad_alloc&)
6494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006495 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006496 }
6497}
6498
6499void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6500{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006501 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006502
6503 try
6504 {
6505 if (index >= gl::MAX_VERTEX_ATTRIBS)
6506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006507 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006508 }
6509
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006510 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006511
6512 if (context)
6513 {
6514 GLfloat vals[4] = { values[0], 0, 0, 1 };
6515 context->setVertexAttrib(index, vals);
6516 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006517 }
6518 catch(std::bad_alloc&)
6519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006520 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006521 }
6522}
6523
6524void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6525{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006526 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006527
6528 try
6529 {
6530 if (index >= gl::MAX_VERTEX_ATTRIBS)
6531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006532 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006533 }
6534
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006535 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006536
6537 if (context)
6538 {
6539 GLfloat vals[4] = { x, y, 0, 1 };
6540 context->setVertexAttrib(index, vals);
6541 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006542 }
6543 catch(std::bad_alloc&)
6544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006546 }
6547}
6548
6549void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6550{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006551 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006552
6553 try
6554 {
6555 if (index >= gl::MAX_VERTEX_ATTRIBS)
6556 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006557 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006558 }
6559
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006560 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006561
6562 if (context)
6563 {
6564 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6565 context->setVertexAttrib(index, vals);
6566 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006567 }
6568 catch(std::bad_alloc&)
6569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006571 }
6572}
6573
6574void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006576 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 +00006577
6578 try
6579 {
6580 if (index >= gl::MAX_VERTEX_ATTRIBS)
6581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006582 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006583 }
6584
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006586
6587 if (context)
6588 {
6589 GLfloat vals[4] = { x, y, z, 1 };
6590 context->setVertexAttrib(index, vals);
6591 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006592 }
6593 catch(std::bad_alloc&)
6594 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006595 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006596 }
6597}
6598
6599void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6600{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006601 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006602
6603 try
6604 {
6605 if (index >= gl::MAX_VERTEX_ATTRIBS)
6606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006607 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006608 }
6609
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006611
6612 if (context)
6613 {
6614 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6615 context->setVertexAttrib(index, vals);
6616 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006617 }
6618 catch(std::bad_alloc&)
6619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006620 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006621 }
6622}
6623
6624void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6625{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006626 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 +00006627
6628 try
6629 {
6630 if (index >= gl::MAX_VERTEX_ATTRIBS)
6631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006632 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006633 }
6634
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006635 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006636
6637 if (context)
6638 {
6639 GLfloat vals[4] = { x, y, z, w };
6640 context->setVertexAttrib(index, vals);
6641 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006642 }
6643 catch(std::bad_alloc&)
6644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006645 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006646 }
6647}
6648
6649void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6650{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006651 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006652
6653 try
6654 {
6655 if (index >= gl::MAX_VERTEX_ATTRIBS)
6656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006658 }
6659
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006661
6662 if (context)
6663 {
6664 context->setVertexAttrib(index, values);
6665 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006666 }
6667 catch(std::bad_alloc&)
6668 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006669 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006670 }
6671}
6672
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006673void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6674{
6675 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6676
6677 try
6678 {
6679 if (index >= gl::MAX_VERTEX_ATTRIBS)
6680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006682 }
6683
6684 gl::Context *context = gl::getNonLostContext();
6685
6686 if (context)
6687 {
6688 context->setVertexAttribDivisor(index, divisor);
6689 }
6690 }
6691 catch(std::bad_alloc&)
6692 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006693 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006694 }
6695}
6696
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006697void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006698{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006699 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006700 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006701 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006702
6703 try
6704 {
6705 if (index >= gl::MAX_VERTEX_ATTRIBS)
6706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006707 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006708 }
6709
6710 if (size < 1 || size > 4)
6711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006713 }
6714
6715 switch (type)
6716 {
6717 case GL_BYTE:
6718 case GL_UNSIGNED_BYTE:
6719 case GL_SHORT:
6720 case GL_UNSIGNED_SHORT:
6721 case GL_FIXED:
6722 case GL_FLOAT:
6723 break;
6724 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006725 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006726 }
6727
6728 if (stride < 0)
6729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006731 }
6732
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006734
6735 if (context)
6736 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006737 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006738 }
6739 }
6740 catch(std::bad_alloc&)
6741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006743 }
6744}
6745
6746void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006748 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 +00006749
6750 try
6751 {
6752 if (width < 0 || height < 0)
6753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006754 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006755 }
6756
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006757 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006758
6759 if (context)
6760 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006761 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006762 }
6763 }
6764 catch(std::bad_alloc&)
6765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006767 }
6768}
6769
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006770void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6771 GLbitfield mask, GLenum filter)
6772{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006773 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006774 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6775 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6776 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6777
6778 try
6779 {
6780 switch (filter)
6781 {
6782 case GL_NEAREST:
6783 break;
6784 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006785 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006786 }
6787
6788 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6789 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006790 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006791 }
6792
6793 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6794 {
6795 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006796 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006797 }
6798
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006799 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006800
6801 if (context)
6802 {
6803 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6804 {
6805 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006806 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006807 }
6808
6809 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6810 }
6811 }
6812 catch(std::bad_alloc&)
6813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006814 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006815 }
6816}
6817
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006818void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6819 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006820{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006821 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006822 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006823 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006824 target, level, internalformat, width, height, depth, border, format, type, pixels);
6825
6826 try
6827 {
6828 UNIMPLEMENTED(); // FIXME
6829 }
6830 catch(std::bad_alloc&)
6831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006832 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006833 }
6834}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006835
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006836void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6837 GLenum *binaryFormat, void *binary)
6838{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006839 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 +00006840 program, bufSize, length, binaryFormat, binary);
6841
6842 try
6843 {
6844 gl::Context *context = gl::getNonLostContext();
6845
6846 if (context)
6847 {
6848 gl::Program *programObject = context->getProgram(program);
6849
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006850 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006852 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006853 }
6854
6855 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6856
6857 if (!programBinary)
6858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006859 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006860 }
6861
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006862 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006863 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006864 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006865 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006866
6867 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006868 }
6869 }
6870 catch(std::bad_alloc&)
6871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006872 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006873 }
6874}
6875
6876void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6877 const void *binary, GLint length)
6878{
6879 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6880 program, binaryFormat, binary, length);
6881
6882 try
6883 {
6884 gl::Context *context = gl::getNonLostContext();
6885
6886 if (context)
6887 {
6888 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006890 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006891 }
6892
6893 gl::Program *programObject = context->getProgram(program);
6894
6895 if (!programObject)
6896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006897 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006898 }
6899
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006900 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006901 }
6902 }
6903 catch(std::bad_alloc&)
6904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006905 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006906 }
6907}
6908
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006909__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6910{
6911 struct Extension
6912 {
6913 const char *name;
6914 __eglMustCastToProperFunctionPointerType address;
6915 };
6916
6917 static const Extension glExtensions[] =
6918 {
6919 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006920 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006921 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006922 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6923 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6924 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6925 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6926 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6927 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6928 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006929 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006930 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006931 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6932 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6933 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6934 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006935 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6936 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6937 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6938 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6939 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6940 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6941 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006942 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6943 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6944 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006945 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
6946 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006947
6948 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6949 {
6950 if (strcmp(procname, glExtensions[ext].name) == 0)
6951 {
6952 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6953 }
6954 }
6955
6956 return NULL;
6957}
6958
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006959// Non-public functions used by EGL
6960
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006961bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006962{
6963 EVENT("(egl::Surface* surface = 0x%0.8p)",
6964 surface);
6965
6966 try
6967 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006968 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006969
6970 if (context)
6971 {
6972 gl::Texture2D *textureObject = context->getTexture2D();
6973
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006974 if (textureObject->isImmutable())
6975 {
6976 return false;
6977 }
6978
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006979 if (textureObject)
6980 {
6981 textureObject->bindTexImage(surface);
6982 }
6983 }
6984 }
6985 catch(std::bad_alloc&)
6986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006987 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006988 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006989
6990 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006991}
6992
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006993}