blob: 2025b1dad4346d8eb44493de4ede9debfa46359a [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
9
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +000010#include "common/version.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011
12#include "libGLESv2/main.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/utilities.h"
14#include "libGLESv2/Buffer.h"
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +000015#include "libGLESv2/Fence.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000016#include "libGLESv2/Framebuffer.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000017#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000018#include "libGLESv2/Program.h"
apatrick@chromium.orgea09f9b2012-06-08 00:45:32 +000019#include "libGLESv2/ProgramBinary.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000020#include "libGLESv2/Texture.h"
daniel@transgaming.com86bdb822012-01-20 18:24:39 +000021#include "libGLESv2/Query.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000022#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +000024bool validImageSize(GLint level, GLsizei width, GLsizei height)
25{
26 if (level < 0 || width < 0 || height < 0)
27 {
28 return false;
29 }
30
31 if (gl::getContext() && gl::getContext()->supportsNonPower2Texture())
32 {
33 return true;
34 }
35
36 if (level == 0)
37 {
38 return true;
39 }
40
41 if (gl::isPow2(width) && gl::isPow2(height))
42 {
43 return true;
44 }
45
46 return false;
47}
48
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000049// Verify that format/type are one of the combinations from table 3.4.
50bool checkTextureFormatType(GLenum format, GLenum type)
51{
52 // validate <format> by itself (used as secondary key below)
53 switch (format)
54 {
55 case GL_RGBA:
56 case GL_BGRA_EXT:
57 case GL_RGB:
58 case GL_ALPHA:
59 case GL_LUMINANCE:
60 case GL_LUMINANCE_ALPHA:
61 case GL_DEPTH_COMPONENT:
62 case GL_DEPTH_STENCIL_OES:
63 break;
64 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000065 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000066 }
67
68 // invalid <type> -> sets INVALID_ENUM
69 // invalid <format>+<type> combination -> sets INVALID_OPERATION
70 switch (type)
71 {
72 case GL_UNSIGNED_BYTE:
73 switch (format)
74 {
75 case GL_RGBA:
76 case GL_BGRA_EXT:
77 case GL_RGB:
78 case GL_ALPHA:
79 case GL_LUMINANCE:
80 case GL_LUMINANCE_ALPHA:
81 return true;
82 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000083 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000084 }
85
86 case GL_FLOAT:
87 case GL_HALF_FLOAT_OES:
88 switch (format)
89 {
90 case GL_RGBA:
91 case GL_RGB:
92 case GL_ALPHA:
93 case GL_LUMINANCE:
94 case GL_LUMINANCE_ALPHA:
95 return true;
96 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +000097 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +000098 }
99
100 case GL_UNSIGNED_SHORT_4_4_4_4:
101 case GL_UNSIGNED_SHORT_5_5_5_1:
102 switch (format)
103 {
104 case GL_RGBA:
105 return true;
106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000107 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000108 }
109
110 case GL_UNSIGNED_SHORT_5_6_5:
111 switch (format)
112 {
113 case GL_RGB:
114 return true;
115 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000116 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000117 }
118
119 case GL_UNSIGNED_SHORT:
120 case GL_UNSIGNED_INT:
121 switch (format)
122 {
123 case GL_DEPTH_COMPONENT:
124 return true;
125 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000127 }
128
129 case GL_UNSIGNED_INT_24_8_OES:
130 switch (format)
131 {
132 case GL_DEPTH_STENCIL_OES:
133 return true;
134 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000135 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000136 }
137
138 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000139 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com8833dd22012-06-05 19:49:58 +0000140 }
141}
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000142
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000143bool validateSubImageParams2D(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000144 GLint xoffset, GLint yoffset, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000145 gl::Texture2D *texture)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000146{
147 if (!texture)
148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000149 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000150 }
151
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000152 if (compressed != texture->isCompressed(level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000154 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000155 }
156
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000157 if (format != GL_NONE)
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000158 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000159 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
160 if (internalformat != texture->getInternalFormat(level))
161 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000162 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000163 }
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000164 }
165
166 if (compressed)
167 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000168 if ((width % 4 != 0 && width != texture->getWidth(0)) ||
169 (height % 4 != 0 && height != texture->getHeight(0)))
170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000171 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000172 }
173 }
174
175 if (xoffset + width > texture->getWidth(level) ||
176 yoffset + height > texture->getHeight(level))
177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000179 }
180
181 return true;
182}
183
184bool validateSubImageParamsCube(bool compressed, GLsizei width, GLsizei height,
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000185 GLint xoffset, GLint yoffset, GLenum target, GLint level, GLenum format, GLenum type,
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000186 gl::TextureCubeMap *texture)
187{
188 if (!texture)
189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000190 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000191 }
192
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000193 if (compressed != texture->isCompressed(target, level))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000195 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000196 }
197
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000198 if (format != GL_NONE)
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000199 {
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000200 GLenum internalformat = gl::ConvertSizedInternalFormat(format, type);
201 if (internalformat != texture->getInternalFormat(target, level))
202 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000203 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +0000204 }
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +0000205 }
206
207 if (compressed)
208 {
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000209 if ((width % 4 != 0 && width != texture->getWidth(target, 0)) ||
210 (height % 4 != 0 && height != texture->getHeight(target, 0)))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000211 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000212 return gl::error(GL_INVALID_OPERATION, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000213 }
214 }
215
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000216 if (xoffset + width > texture->getWidth(target, level) ||
217 yoffset + height > texture->getHeight(target, level))
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000219 return gl::error(GL_INVALID_VALUE, false);
daniel@transgaming.com343373a2011-11-29 19:42:32 +0000220 }
221
222 return true;
223}
224
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000225// check for combinations of format and type that are valid for ReadPixels
226bool validReadFormatType(GLenum format, GLenum type)
227{
228 switch (format)
229 {
230 case GL_RGBA:
231 switch (type)
232 {
233 case GL_UNSIGNED_BYTE:
234 break;
235 default:
236 return false;
237 }
238 break;
239 case GL_BGRA_EXT:
240 switch (type)
241 {
242 case GL_UNSIGNED_BYTE:
243 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
244 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
245 break;
246 default:
247 return false;
248 }
249 break;
daniel@transgaming.comb7915a52011-11-12 03:14:20 +0000250 default:
251 return false;
252 }
253 return true;
254}
255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256extern "C"
257{
258
259void __stdcall glActiveTexture(GLenum texture)
260{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000261 EVENT("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000262
263 try
264 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000265 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266
267 if (context)
268 {
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000269 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000271 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f74c7a2011-05-11 15:36:51 +0000272 }
273
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000274 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 }
276 }
277 catch(std::bad_alloc&)
278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000280 }
281}
282
283void __stdcall glAttachShader(GLuint program, GLuint shader)
284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000285 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000286
287 try
288 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000289 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000290
291 if (context)
292 {
293 gl::Program *programObject = context->getProgram(program);
294 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000295
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000296 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000298 if (context->getShader(program))
299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000300 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000301 }
302 else
303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000304 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000305 }
306 }
307
308 if (!shaderObject)
309 {
310 if (context->getProgram(shader))
311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000312 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000313 }
314 else
315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000316 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +0000317 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000318 }
319
320 if (!programObject->attachShader(shaderObject))
321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000322 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000323 }
324 }
325 }
326 catch(std::bad_alloc&)
327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000329 }
330}
331
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000332void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
333{
334 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
335
336 try
337 {
338 switch (target)
339 {
340 case GL_ANY_SAMPLES_PASSED_EXT:
341 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
342 break;
343 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000344 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000345 }
346
347 if (id == 0)
348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000349 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000350 }
351
352 gl::Context *context = gl::getNonLostContext();
353
354 if (context)
355 {
356 context->beginQuery(target, id);
357 }
358 }
359 catch(std::bad_alloc&)
360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000361 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +0000362 }
363}
364
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000365void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000367 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000368
369 try
370 {
371 if (index >= gl::MAX_VERTEX_ATTRIBS)
372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000373 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000374 }
375
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000376 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000377
378 if (context)
379 {
380 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000381
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000382 if (!programObject)
383 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000384 if (context->getShader(program))
385 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000386 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000387 }
388 else
389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000390 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com98079832010-04-13 03:26:29 +0000391 }
392 }
393
394 if (strncmp(name, "gl_", 3) == 0)
395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000396 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397 }
398
399 programObject->bindAttributeLocation(index, name);
400 }
401 }
402 catch(std::bad_alloc&)
403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000404 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000405 }
406}
407
408void __stdcall glBindBuffer(GLenum target, GLuint buffer)
409{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000410 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000411
412 try
413 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000414 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000415
416 if (context)
417 {
418 switch (target)
419 {
420 case GL_ARRAY_BUFFER:
421 context->bindArrayBuffer(buffer);
422 return;
423 case GL_ELEMENT_ARRAY_BUFFER:
424 context->bindElementArrayBuffer(buffer);
425 return;
426 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000427 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000428 }
429 }
430 }
431 catch(std::bad_alloc&)
432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000433 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000434 }
435}
436
437void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
438{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000439 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440
441 try
442 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000443 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000445 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000446 }
447
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000448 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449
450 if (context)
451 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000452 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
453 {
454 context->bindReadFramebuffer(framebuffer);
455 }
456
457 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
458 {
459 context->bindDrawFramebuffer(framebuffer);
460 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000461 }
462 }
463 catch(std::bad_alloc&)
464 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000465 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 }
467}
468
469void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
470{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000471 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000472
473 try
474 {
475 if (target != GL_RENDERBUFFER)
476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000477 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000478 }
479
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481
482 if (context)
483 {
484 context->bindRenderbuffer(renderbuffer);
485 }
486 }
487 catch(std::bad_alloc&)
488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 }
491}
492
493void __stdcall glBindTexture(GLenum target, GLuint texture)
494{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000495 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000496
497 try
498 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000499 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000500
501 if (context)
502 {
503 gl::Texture *textureObject = context->getTexture(texture);
504
505 if (textureObject && textureObject->getTarget() != target && texture != 0)
506 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000507 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000508 }
509
510 switch (target)
511 {
512 case GL_TEXTURE_2D:
513 context->bindTexture2D(texture);
514 return;
515 case GL_TEXTURE_CUBE_MAP:
516 context->bindTextureCubeMap(texture);
517 return;
518 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000519 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000520 }
521 }
522 }
523 catch(std::bad_alloc&)
524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000526 }
527}
528
529void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000531 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000532 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533
534 try
535 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000536 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000537
538 if (context)
539 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000540 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000541 }
542 }
543 catch(std::bad_alloc&)
544 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000545 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000546 }
547}
548
549void __stdcall glBlendEquation(GLenum mode)
550{
551 glBlendEquationSeparate(mode, mode);
552}
553
554void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
555{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000556 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000557
558 try
559 {
560 switch (modeRGB)
561 {
562 case GL_FUNC_ADD:
563 case GL_FUNC_SUBTRACT:
564 case GL_FUNC_REVERSE_SUBTRACT:
565 break;
566 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000567 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568 }
569
570 switch (modeAlpha)
571 {
572 case GL_FUNC_ADD:
573 case GL_FUNC_SUBTRACT:
574 case GL_FUNC_REVERSE_SUBTRACT:
575 break;
576 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000577 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000578 }
579
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000580 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000581
582 if (context)
583 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000584 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000585 }
586 }
587 catch(std::bad_alloc&)
588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000589 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000590 }
591}
592
593void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
594{
595 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
596}
597
598void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
599{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000600 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 +0000601 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000602
603 try
604 {
605 switch (srcRGB)
606 {
607 case GL_ZERO:
608 case GL_ONE:
609 case GL_SRC_COLOR:
610 case GL_ONE_MINUS_SRC_COLOR:
611 case GL_DST_COLOR:
612 case GL_ONE_MINUS_DST_COLOR:
613 case GL_SRC_ALPHA:
614 case GL_ONE_MINUS_SRC_ALPHA:
615 case GL_DST_ALPHA:
616 case GL_ONE_MINUS_DST_ALPHA:
617 case GL_CONSTANT_COLOR:
618 case GL_ONE_MINUS_CONSTANT_COLOR:
619 case GL_CONSTANT_ALPHA:
620 case GL_ONE_MINUS_CONSTANT_ALPHA:
621 case GL_SRC_ALPHA_SATURATE:
622 break;
623 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000624 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000625 }
626
627 switch (dstRGB)
628 {
629 case GL_ZERO:
630 case GL_ONE:
631 case GL_SRC_COLOR:
632 case GL_ONE_MINUS_SRC_COLOR:
633 case GL_DST_COLOR:
634 case GL_ONE_MINUS_DST_COLOR:
635 case GL_SRC_ALPHA:
636 case GL_ONE_MINUS_SRC_ALPHA:
637 case GL_DST_ALPHA:
638 case GL_ONE_MINUS_DST_ALPHA:
639 case GL_CONSTANT_COLOR:
640 case GL_ONE_MINUS_CONSTANT_COLOR:
641 case GL_CONSTANT_ALPHA:
642 case GL_ONE_MINUS_CONSTANT_ALPHA:
643 break;
644 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000645 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000646 }
647
648 switch (srcAlpha)
649 {
650 case GL_ZERO:
651 case GL_ONE:
652 case GL_SRC_COLOR:
653 case GL_ONE_MINUS_SRC_COLOR:
654 case GL_DST_COLOR:
655 case GL_ONE_MINUS_DST_COLOR:
656 case GL_SRC_ALPHA:
657 case GL_ONE_MINUS_SRC_ALPHA:
658 case GL_DST_ALPHA:
659 case GL_ONE_MINUS_DST_ALPHA:
660 case GL_CONSTANT_COLOR:
661 case GL_ONE_MINUS_CONSTANT_COLOR:
662 case GL_CONSTANT_ALPHA:
663 case GL_ONE_MINUS_CONSTANT_ALPHA:
664 case GL_SRC_ALPHA_SATURATE:
665 break;
666 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000667 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000668 }
669
670 switch (dstAlpha)
671 {
672 case GL_ZERO:
673 case GL_ONE:
674 case GL_SRC_COLOR:
675 case GL_ONE_MINUS_SRC_COLOR:
676 case GL_DST_COLOR:
677 case GL_ONE_MINUS_DST_COLOR:
678 case GL_SRC_ALPHA:
679 case GL_ONE_MINUS_SRC_ALPHA:
680 case GL_DST_ALPHA:
681 case GL_ONE_MINUS_DST_ALPHA:
682 case GL_CONSTANT_COLOR:
683 case GL_ONE_MINUS_CONSTANT_COLOR:
684 case GL_CONSTANT_ALPHA:
685 case GL_ONE_MINUS_CONSTANT_ALPHA:
686 break;
687 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000688 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000689 }
690
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000691 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
692 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
693
694 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
695 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
696
697 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000698 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000699 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 +0000700 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000701 }
702
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000703 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000704
705 if (context)
706 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000707 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000708 }
709 }
710 catch(std::bad_alloc&)
711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000712 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000713 }
714}
715
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000716void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000717{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000718 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 +0000719 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000720
721 try
722 {
723 if (size < 0)
724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000726 }
727
728 switch (usage)
729 {
730 case GL_STREAM_DRAW:
731 case GL_STATIC_DRAW:
732 case GL_DYNAMIC_DRAW:
733 break;
734 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000735 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000736 }
737
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000738 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739
740 if (context)
741 {
742 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000743
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000744 switch (target)
745 {
746 case GL_ARRAY_BUFFER:
747 buffer = context->getArrayBuffer();
748 break;
749 case GL_ELEMENT_ARRAY_BUFFER:
750 buffer = context->getElementArrayBuffer();
751 break;
752 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000753 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000754 }
755
756 if (!buffer)
757 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000758 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000759 }
760
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000761 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762 }
763 }
764 catch(std::bad_alloc&)
765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000766 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000767 }
768}
769
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000770void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000772 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 +0000773 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000774
775 try
776 {
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000777 if (size < 0 || offset < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000779 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000780 }
781
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000782 if (data == NULL)
783 {
784 return;
785 }
786
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000787 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000788
789 if (context)
790 {
791 gl::Buffer *buffer;
792
793 switch (target)
794 {
795 case GL_ARRAY_BUFFER:
796 buffer = context->getArrayBuffer();
797 break;
798 case GL_ELEMENT_ARRAY_BUFFER:
799 buffer = context->getElementArrayBuffer();
800 break;
801 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000802 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000803 }
804
805 if (!buffer)
806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000807 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000808 }
809
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000810 if ((size_t)size + offset > buffer->size())
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000811 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000812 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000813 }
daniel@transgaming.comdefa1c32010-05-18 18:51:45 +0000814
815 buffer->bufferSubData(data, size, offset);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000816 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000817 }
818 catch(std::bad_alloc&)
819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000821 }
822}
823
824GLenum __stdcall glCheckFramebufferStatus(GLenum target)
825{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000826 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000827
828 try
829 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000830 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000832 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000833 }
834
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000835 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000836
837 if (context)
838 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000839 gl::Framebuffer *framebuffer = NULL;
840 if (target == GL_READ_FRAMEBUFFER_ANGLE)
841 {
842 framebuffer = context->getReadFramebuffer();
843 }
844 else
845 {
846 framebuffer = context->getDrawFramebuffer();
847 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000848
849 return framebuffer->completeness();
850 }
851 }
852 catch(std::bad_alloc&)
853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000854 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000855 }
856
857 return 0;
858}
859
860void __stdcall glClear(GLbitfield mask)
861{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000862 EVENT("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000863
864 try
865 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000866 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000867
868 if (context)
869 {
870 context->clear(mask);
871 }
872 }
873 catch(std::bad_alloc&)
874 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000875 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000876 }
877}
878
879void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
880{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000881 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000882 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000883
884 try
885 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000886 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000887
888 if (context)
889 {
890 context->setClearColor(red, green, blue, alpha);
891 }
892 }
893 catch(std::bad_alloc&)
894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000895 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000896 }
897}
898
899void __stdcall glClearDepthf(GLclampf depth)
900{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000901 EVENT("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000902
903 try
904 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000905 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000906
907 if (context)
908 {
909 context->setClearDepth(depth);
910 }
911 }
912 catch(std::bad_alloc&)
913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000914 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000915 }
916}
917
918void __stdcall glClearStencil(GLint s)
919{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000920 EVENT("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000921
922 try
923 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000924 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000925
926 if (context)
927 {
928 context->setClearStencil(s);
929 }
930 }
931 catch(std::bad_alloc&)
932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000933 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934 }
935}
936
937void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
938{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000939 EVENT("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000940 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000941
942 try
943 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000944 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000945
946 if (context)
947 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +0000948 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000949 }
950 }
951 catch(std::bad_alloc&)
952 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000953 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000954 }
955}
956
957void __stdcall glCompileShader(GLuint shader)
958{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000959 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000960
961 try
962 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000963 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000964
965 if (context)
966 {
967 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000968
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000969 if (!shaderObject)
970 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000971 if (context->getProgram(shader))
972 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000973 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000974 }
975 else
976 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000977 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000978 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000979 }
980
981 shaderObject->compile();
982 }
983 }
984 catch(std::bad_alloc&)
985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000987 }
988}
989
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000990void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
991 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000992{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000993 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000994 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000995 target, level, internalformat, width, height, border, imageSize, data);
996
997 try
998 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +0000999 if (!validImageSize(level, width, height) || border != 0 || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001000 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001001 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001002 }
1003
daniel@transgaming.com01868132010-08-24 19:21:17 +00001004 switch (internalformat)
1005 {
1006 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1007 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001008 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1009 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001010 break;
1011 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001012 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001013 }
1014
1015 if (border != 0)
1016 {
shannon.woods@transgaming.com0efef902013-02-28 23:21:09 +00001017 return gl::error(GL_INVALID_OPERATION);
1018 }
1019
1020 if (width != 1 && width != 2 && width % 4 != 0)
1021 {
1022 return gl::error(GL_INVALID_OPERATION);
1023 }
1024
1025 if (height != 1 && height != 2 && height % 4 != 0)
1026 {
1027 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001028 }
1029
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001030 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001031
1032 if (context)
1033 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001034 if (level > context->getMaximumTextureLevel())
1035 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001036 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001037 }
1038
1039 switch (target)
1040 {
1041 case GL_TEXTURE_2D:
1042 if (width > (context->getMaximumTextureDimension() >> level) ||
1043 height > (context->getMaximumTextureDimension() >> level))
1044 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001045 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001046 }
1047 break;
1048 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1049 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1050 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1051 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1052 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1053 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1054 if (width != height)
1055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001056 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001057 }
1058
1059 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1060 height > (context->getMaximumCubeTextureDimension() >> level))
1061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001062 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001063 }
1064 break;
1065 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001066 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001067 }
1068
gman@chromium.org50c526d2011-08-10 05:19:44 +00001069 switch (internalformat) {
1070 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1071 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1072 if (!context->supportsDXT1Textures())
1073 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001074 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 +00001075 }
1076 break;
1077 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1078 if (!context->supportsDXT3Textures())
1079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001080 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 +00001081 }
1082 break;
1083 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1084 if (!context->supportsDXT5Textures())
1085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001086 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 +00001087 }
1088 break;
1089 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001090 }
1091
1092 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001094 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001095 }
1096
1097 if (target == GL_TEXTURE_2D)
1098 {
1099 gl::Texture2D *texture = context->getTexture2D();
1100
1101 if (!texture)
1102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001103 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001104 }
1105
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001106 if (texture->isImmutable())
1107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001108 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001109 }
1110
daniel@transgaming.com01868132010-08-24 19:21:17 +00001111 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1112 }
1113 else
1114 {
1115 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1116
1117 if (!texture)
1118 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001119 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001120 }
1121
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001122 if (texture->isImmutable())
1123 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001124 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001125 }
1126
daniel@transgaming.com01868132010-08-24 19:21:17 +00001127 switch (target)
1128 {
1129 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1130 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1131 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1132 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1133 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1134 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1135 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1136 break;
1137 default: UNREACHABLE();
1138 }
1139 }
1140 }
1141
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001142 }
1143 catch(std::bad_alloc&)
1144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001145 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001146 }
1147}
1148
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001149void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1150 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001152 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001153 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001154 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001155 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1156
1157 try
1158 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001159 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001161 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001162 }
1163
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001164 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001165 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001166 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001167 }
1168
daniel@transgaming.com01868132010-08-24 19:21:17 +00001169 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001170 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001171 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1172 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001173 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1174 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001175 break;
1176 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001177 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001178 }
1179
daniel@transgaming.com01868132010-08-24 19:21:17 +00001180 if (width == 0 || height == 0 || data == NULL)
1181 {
1182 return;
1183 }
1184
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001185 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001186
1187 if (context)
1188 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001189 if (level > context->getMaximumTextureLevel())
1190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001191 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001192 }
1193
gman@chromium.org50c526d2011-08-10 05:19:44 +00001194 switch (format) {
1195 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1196 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1197 if (!context->supportsDXT1Textures())
1198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001199 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 +00001200 }
1201 break;
1202 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1203 if (!context->supportsDXT3Textures())
1204 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001205 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 +00001206 }
1207 break;
1208 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1209 if (!context->supportsDXT5Textures())
1210 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001211 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 +00001212 }
1213 break;
1214 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001215 }
1216
1217 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1218 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001219 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001220 }
1221
1222 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1223 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001224 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 +00001225 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001226 }
1227
1228 if (target == GL_TEXTURE_2D)
1229 {
1230 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001231 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001232 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001233 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001234 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001235 }
1236 else if (gl::IsCubemapTextureTarget(target))
1237 {
1238 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001239 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001240 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001241 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001242 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001243 }
1244 else
1245 {
1246 UNREACHABLE();
1247 }
1248 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001249 }
1250 catch(std::bad_alloc&)
1251 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001252 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001253 }
1254}
1255
1256void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1257{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001258 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001259 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001260 target, level, internalformat, x, y, width, height, border);
1261
1262 try
1263 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001264 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001266 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001267 }
1268
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001269 if (border != 0)
1270 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001271 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001272 }
1273
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001274 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001275
1276 if (context)
1277 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001278 if (level > context->getMaximumTextureLevel())
1279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001280 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001281 }
1282
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001283 switch (target)
1284 {
1285 case GL_TEXTURE_2D:
1286 if (width > (context->getMaximumTextureDimension() >> level) ||
1287 height > (context->getMaximumTextureDimension() >> level))
1288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001289 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001290 }
1291 break;
1292 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1293 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1294 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1295 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1296 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1297 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1298 if (width != height)
1299 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001300 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001301 }
1302
1303 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1304 height > (context->getMaximumCubeTextureDimension() >> level))
1305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001306 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001307 }
1308 break;
1309 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001310 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001311 }
1312
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001313 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001314
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001315 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001317 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001318 }
1319
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001320 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001322 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001323 }
1324
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001325 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001326 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001327
1328 // [OpenGL ES 2.0.24] table 3.9
1329 switch (internalformat)
1330 {
1331 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001332 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001333 colorbufferFormat != GL_RGBA4 &&
1334 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001335 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001336 colorbufferFormat != GL_RGBA8_OES)
1337 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001338 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001339 }
1340 break;
1341 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001342 case GL_RGB:
1343 if (colorbufferFormat != GL_RGB565 &&
1344 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001345 colorbufferFormat != GL_RGBA4 &&
1346 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001347 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001348 colorbufferFormat != GL_RGBA8_OES)
1349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001350 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001351 }
1352 break;
1353 case GL_LUMINANCE_ALPHA:
1354 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001355 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001356 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001357 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001358 colorbufferFormat != GL_RGBA8_OES)
1359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001360 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001361 }
1362 break;
1363 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1364 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001365 if (context->supportsDXT1Textures())
1366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001367 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001368 }
1369 else
1370 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001371 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001372 }
1373 break;
1374 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1375 if (context->supportsDXT3Textures())
1376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001377 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001378 }
1379 else
1380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001381 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001382 }
1383 break;
1384 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1385 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001386 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001387 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001388 }
1389 else
1390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001391 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001392 }
1393 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001394 case GL_DEPTH_COMPONENT:
1395 case GL_DEPTH_COMPONENT16:
1396 case GL_DEPTH_COMPONENT32_OES:
1397 case GL_DEPTH_STENCIL_OES:
1398 case GL_DEPTH24_STENCIL8_OES:
1399 if (context->supportsDepthTextures())
1400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001401 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001402 }
1403 else
1404 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001405 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001406 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001407 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001408 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001409 }
1410
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001411 if (target == GL_TEXTURE_2D)
1412 {
1413 gl::Texture2D *texture = context->getTexture2D();
1414
1415 if (!texture)
1416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001417 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001418 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001419
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001420 if (texture->isImmutable())
1421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001422 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001423 }
1424
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001425 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001426 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001427 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001428 {
1429 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1430
1431 if (!texture)
1432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001433 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001434 }
1435
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001436 if (texture->isImmutable())
1437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001438 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001439 }
1440
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001441 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001442 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001443 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001444 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445 }
1446 catch(std::bad_alloc&)
1447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001448 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001449 }
1450}
1451
1452void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1453{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001454 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001455 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 target, level, xoffset, yoffset, x, y, width, height);
1457
1458 try
1459 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001460 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001462 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001463 }
1464
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001465 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001467 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468 }
1469
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001470 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1471 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001472 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001473 }
1474
1475 if (width == 0 || height == 0)
1476 {
1477 return;
1478 }
1479
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001480 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001481
1482 if (context)
1483 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001484 if (level > context->getMaximumTextureLevel())
1485 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001486 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001487 }
1488
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001489 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001490
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001491 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001493 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001494 }
1495
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001496 if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001497 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001498 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001499 }
1500
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00001501 gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001502 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001503 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001504 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001505
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001506 if (target == GL_TEXTURE_2D)
1507 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001508 gl::Texture2D *tex2d = context->getTexture2D();
1509
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001510 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001511 {
1512 return; // error already registered by validateSubImageParams
1513 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001514 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001515 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001516 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001517 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001518 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001519 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1520
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001521 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001522 {
1523 return; // error already registered by validateSubImageParams
1524 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001525 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001526 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001527 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001528 else UNREACHABLE();
1529
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001530 // [OpenGL ES 2.0.24] table 3.9
1531 switch (textureFormat)
1532 {
1533 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001534 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001535 colorbufferFormat != GL_RGBA4 &&
1536 colorbufferFormat != GL_RGB5_A1 &&
1537 colorbufferFormat != GL_RGBA8_OES)
1538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001539 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001540 }
1541 break;
1542 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001543 case GL_RGB:
1544 if (colorbufferFormat != GL_RGB565 &&
1545 colorbufferFormat != GL_RGB8_OES &&
1546 colorbufferFormat != GL_RGBA4 &&
1547 colorbufferFormat != GL_RGB5_A1 &&
1548 colorbufferFormat != GL_RGBA8_OES)
1549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001550 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001551 }
1552 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001553 case GL_LUMINANCE_ALPHA:
1554 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001555 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001556 colorbufferFormat != GL_RGB5_A1 &&
1557 colorbufferFormat != GL_RGBA8_OES)
1558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001560 }
1561 break;
1562 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1563 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001564 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1565 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001566 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001567 case GL_DEPTH_COMPONENT:
1568 case GL_DEPTH_STENCIL_OES:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001569 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001570 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001571 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001572 }
1573
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001574 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001575 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001576 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001577
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001578 catch(std::bad_alloc&)
1579 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001580 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581 }
1582}
1583
1584GLuint __stdcall glCreateProgram(void)
1585{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001586 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001587
1588 try
1589 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001590 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001591
1592 if (context)
1593 {
1594 return context->createProgram();
1595 }
1596 }
1597 catch(std::bad_alloc&)
1598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001599 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001600 }
1601
1602 return 0;
1603}
1604
1605GLuint __stdcall glCreateShader(GLenum type)
1606{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001607 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001608
1609 try
1610 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001611 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612
1613 if (context)
1614 {
1615 switch (type)
1616 {
1617 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001618 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001619 return context->createShader(type);
1620 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001621 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001622 }
1623 }
1624 }
1625 catch(std::bad_alloc&)
1626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001627 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001628 }
1629
1630 return 0;
1631}
1632
1633void __stdcall glCullFace(GLenum mode)
1634{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001635 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001636
1637 try
1638 {
1639 switch (mode)
1640 {
1641 case GL_FRONT:
1642 case GL_BACK:
1643 case GL_FRONT_AND_BACK:
1644 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001645 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001646
1647 if (context)
1648 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001649 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001650 }
1651 }
1652 break;
1653 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001654 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001655 }
1656 }
1657 catch(std::bad_alloc&)
1658 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001659 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001660 }
1661}
1662
1663void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1664{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001665 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001666
1667 try
1668 {
1669 if (n < 0)
1670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001671 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001672 }
1673
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001674 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001675
1676 if (context)
1677 {
1678 for (int i = 0; i < n; i++)
1679 {
1680 context->deleteBuffer(buffers[i]);
1681 }
1682 }
1683 }
1684 catch(std::bad_alloc&)
1685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001686 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001687 }
1688}
1689
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001690void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1691{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001692 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001693
1694 try
1695 {
1696 if (n < 0)
1697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001698 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001699 }
1700
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001701 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001702
1703 if (context)
1704 {
1705 for (int i = 0; i < n; i++)
1706 {
1707 context->deleteFence(fences[i]);
1708 }
1709 }
1710 }
1711 catch(std::bad_alloc&)
1712 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001713 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001714 }
1715}
1716
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001717void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1718{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001719 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001720
1721 try
1722 {
1723 if (n < 0)
1724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001725 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001726 }
1727
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001728 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001729
1730 if (context)
1731 {
1732 for (int i = 0; i < n; i++)
1733 {
1734 if (framebuffers[i] != 0)
1735 {
1736 context->deleteFramebuffer(framebuffers[i]);
1737 }
1738 }
1739 }
1740 }
1741 catch(std::bad_alloc&)
1742 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001743 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001744 }
1745}
1746
1747void __stdcall glDeleteProgram(GLuint program)
1748{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001749 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001750
1751 try
1752 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001753 if (program == 0)
1754 {
1755 return;
1756 }
1757
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001758 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001759
1760 if (context)
1761 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001762 if (!context->getProgram(program))
1763 {
1764 if(context->getShader(program))
1765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001766 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001767 }
1768 else
1769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001770 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001771 }
1772 }
1773
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774 context->deleteProgram(program);
1775 }
1776 }
1777 catch(std::bad_alloc&)
1778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001780 }
1781}
1782
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001783void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1784{
1785 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1786
1787 try
1788 {
1789 if (n < 0)
1790 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001791 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001792 }
1793
1794 gl::Context *context = gl::getNonLostContext();
1795
1796 if (context)
1797 {
1798 for (int i = 0; i < n; i++)
1799 {
1800 context->deleteQuery(ids[i]);
1801 }
1802 }
1803 }
1804 catch(std::bad_alloc&)
1805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001806 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001807 }
1808}
1809
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001810void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1811{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001812 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001813
1814 try
1815 {
1816 if (n < 0)
1817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001818 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819 }
1820
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001821 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001822
1823 if (context)
1824 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001825 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001826 {
1827 context->deleteRenderbuffer(renderbuffers[i]);
1828 }
1829 }
1830 }
1831 catch(std::bad_alloc&)
1832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001834 }
1835}
1836
1837void __stdcall glDeleteShader(GLuint shader)
1838{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001839 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001840
1841 try
1842 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001843 if (shader == 0)
1844 {
1845 return;
1846 }
1847
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001848 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849
1850 if (context)
1851 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001852 if (!context->getShader(shader))
1853 {
1854 if(context->getProgram(shader))
1855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001856 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001857 }
1858 else
1859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001860 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001861 }
1862 }
1863
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001864 context->deleteShader(shader);
1865 }
1866 }
1867 catch(std::bad_alloc&)
1868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001870 }
1871}
1872
1873void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001875 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001876
1877 try
1878 {
1879 if (n < 0)
1880 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001881 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001882 }
1883
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001884 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001885
1886 if (context)
1887 {
1888 for (int i = 0; i < n; i++)
1889 {
1890 if (textures[i] != 0)
1891 {
1892 context->deleteTexture(textures[i]);
1893 }
1894 }
1895 }
1896 }
1897 catch(std::bad_alloc&)
1898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001899 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 }
1901}
1902
1903void __stdcall glDepthFunc(GLenum func)
1904{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001905 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001906
1907 try
1908 {
1909 switch (func)
1910 {
1911 case GL_NEVER:
1912 case GL_ALWAYS:
1913 case GL_LESS:
1914 case GL_LEQUAL:
1915 case GL_EQUAL:
1916 case GL_GREATER:
1917 case GL_GEQUAL:
1918 case GL_NOTEQUAL:
1919 break;
1920 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001921 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922 }
1923
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001924 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925
1926 if (context)
1927 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001928 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001929 }
1930 }
1931 catch(std::bad_alloc&)
1932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001933 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934 }
1935}
1936
1937void __stdcall glDepthMask(GLboolean flag)
1938{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001939 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001940
1941 try
1942 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001943 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001944
1945 if (context)
1946 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001947 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001948 }
1949 }
1950 catch(std::bad_alloc&)
1951 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001952 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953 }
1954}
1955
1956void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1957{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001958 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001959
1960 try
1961 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001962 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001963
1964 if (context)
1965 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001966 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001967 }
1968 }
1969 catch(std::bad_alloc&)
1970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001971 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972 }
1973}
1974
1975void __stdcall glDetachShader(GLuint program, GLuint shader)
1976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001977 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001978
1979 try
1980 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001981 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001982
1983 if (context)
1984 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001985
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001986 gl::Program *programObject = context->getProgram(program);
1987 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001988
1989 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001991 gl::Shader *shaderByProgramHandle;
1992 shaderByProgramHandle = context->getShader(program);
1993 if (!shaderByProgramHandle)
1994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001995 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001996 }
1997 else
1998 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001999 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002000 }
2001 }
2002
2003 if (!shaderObject)
2004 {
2005 gl::Program *programByShaderHandle = context->getProgram(shader);
2006 if (!programByShaderHandle)
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002009 }
2010 else
2011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002012 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002014 }
2015
2016 if (!programObject->detachShader(shaderObject))
2017 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002018 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002019 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002020 }
2021 }
2022 catch(std::bad_alloc&)
2023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002024 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002025 }
2026}
2027
2028void __stdcall glDisable(GLenum cap)
2029{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002030 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031
2032 try
2033 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002034 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035
2036 if (context)
2037 {
2038 switch (cap)
2039 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002040 case GL_CULL_FACE: context->setCullFace(false); break;
2041 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2042 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2043 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2044 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2045 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2046 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2047 case GL_BLEND: context->setBlend(false); break;
2048 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002049 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002050 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002051 }
2052 }
2053 }
2054 catch(std::bad_alloc&)
2055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002056 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002057 }
2058}
2059
2060void __stdcall glDisableVertexAttribArray(GLuint index)
2061{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002062 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002063
2064 try
2065 {
2066 if (index >= gl::MAX_VERTEX_ATTRIBS)
2067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002068 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002069 }
2070
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002071 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002072
2073 if (context)
2074 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002075 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002076 }
2077 }
2078 catch(std::bad_alloc&)
2079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002080 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002081 }
2082}
2083
2084void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2085{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002086 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087
2088 try
2089 {
2090 if (count < 0 || first < 0)
2091 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002092 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002093 }
2094
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002095 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002096
2097 if (context)
2098 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002099 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100 }
2101 }
2102 catch(std::bad_alloc&)
2103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002104 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002105 }
2106}
2107
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002108void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2109{
2110 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2111
2112 try
2113 {
2114 if (count < 0 || first < 0 || primcount < 0)
2115 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002116 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002117 }
2118
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002119 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002120 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002121 gl::Context *context = gl::getNonLostContext();
2122
2123 if (context)
2124 {
2125 context->drawArrays(mode, first, count, primcount);
2126 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002127 }
2128 }
2129 catch(std::bad_alloc&)
2130 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002131 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002132 }
2133}
2134
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002135void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002136{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002137 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 +00002138 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002139
2140 try
2141 {
2142 if (count < 0)
2143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002144 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002145 }
2146
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002147 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002148
2149 if (context)
2150 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002151 switch (type)
2152 {
2153 case GL_UNSIGNED_BYTE:
2154 case GL_UNSIGNED_SHORT:
2155 break;
2156 case GL_UNSIGNED_INT:
2157 if (!context->supports32bitIndices())
2158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002159 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002160 }
2161 break;
2162 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002163 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002164 }
2165
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002166 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002167 }
2168 }
2169 catch(std::bad_alloc&)
2170 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002171 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002172 }
2173}
2174
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002175void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2176{
2177 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2178 mode, count, type, indices, primcount);
2179
2180 try
2181 {
2182 if (count < 0 || primcount < 0)
2183 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002184 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002185 }
2186
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002187 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002188 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002189 gl::Context *context = gl::getNonLostContext();
2190
2191 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002192 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002193 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002194 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002195 case GL_UNSIGNED_BYTE:
2196 case GL_UNSIGNED_SHORT:
2197 break;
2198 case GL_UNSIGNED_INT:
2199 if (!context->supports32bitIndices())
2200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002201 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002202 }
2203 break;
2204 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002205 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002206 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002207
2208 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002209 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002210 }
2211 }
2212 catch(std::bad_alloc&)
2213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002214 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002215 }
2216}
2217
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218void __stdcall glEnable(GLenum cap)
2219{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002220 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002221
2222 try
2223 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002224 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002225
2226 if (context)
2227 {
2228 switch (cap)
2229 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002230 case GL_CULL_FACE: context->setCullFace(true); break;
2231 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2232 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2233 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2234 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2235 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2236 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2237 case GL_BLEND: context->setBlend(true); break;
2238 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002239 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002240 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002241 }
2242 }
2243 }
2244 catch(std::bad_alloc&)
2245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002247 }
2248}
2249
2250void __stdcall glEnableVertexAttribArray(GLuint index)
2251{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002252 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002253
2254 try
2255 {
2256 if (index >= gl::MAX_VERTEX_ATTRIBS)
2257 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002258 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002259 }
2260
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002262
2263 if (context)
2264 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002265 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002266 }
2267 }
2268 catch(std::bad_alloc&)
2269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002270 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002271 }
2272}
2273
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002274void __stdcall glEndQueryEXT(GLenum target)
2275{
2276 EVENT("GLenum target = 0x%X)", target);
2277
2278 try
2279 {
2280 switch (target)
2281 {
2282 case GL_ANY_SAMPLES_PASSED_EXT:
2283 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2284 break;
2285 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002286 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002287 }
2288
2289 gl::Context *context = gl::getNonLostContext();
2290
2291 if (context)
2292 {
2293 context->endQuery(target);
2294 }
2295 }
2296 catch(std::bad_alloc&)
2297 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002298 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002299 }
2300}
2301
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002302void __stdcall glFinishFenceNV(GLuint fence)
2303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002304 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002305
2306 try
2307 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002308 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002309
2310 if (context)
2311 {
2312 gl::Fence* fenceObject = context->getFence(fence);
2313
2314 if (fenceObject == NULL)
2315 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002316 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002317 }
2318
2319 fenceObject->finishFence();
2320 }
2321 }
2322 catch(std::bad_alloc&)
2323 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002324 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002325 }
2326}
2327
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002328void __stdcall glFinish(void)
2329{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002330 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002331
2332 try
2333 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002334 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002335
2336 if (context)
2337 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002338 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002339 }
2340 }
2341 catch(std::bad_alloc&)
2342 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002343 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002344 }
2345}
2346
2347void __stdcall glFlush(void)
2348{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002349 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350
2351 try
2352 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002353 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002354
2355 if (context)
2356 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002357 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002358 }
2359 }
2360 catch(std::bad_alloc&)
2361 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002362 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363 }
2364}
2365
2366void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2367{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002368 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002369 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370
2371 try
2372 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002373 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002374 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002376 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 }
2378
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002379 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002380
2381 if (context)
2382 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002383 gl::Framebuffer *framebuffer = NULL;
2384 GLuint framebufferHandle = 0;
2385 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2386 {
2387 framebuffer = context->getReadFramebuffer();
2388 framebufferHandle = context->getReadFramebufferHandle();
2389 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002390 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002391 {
2392 framebuffer = context->getDrawFramebuffer();
2393 framebufferHandle = context->getDrawFramebufferHandle();
2394 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002395
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002396 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002397 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002398 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002399 }
2400
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002401 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002402 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002403 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2404
2405 if (colorAttachment >= context->getMaximumRenderTargets())
2406 {
2407 return gl::error(GL_INVALID_VALUE);
2408 }
2409
2410 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
2411 }
2412 else
2413 {
2414 switch (attachment)
2415 {
2416 case GL_DEPTH_ATTACHMENT:
2417 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2418 break;
2419 case GL_STENCIL_ATTACHMENT:
2420 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2421 break;
2422 default:
2423 return gl::error(GL_INVALID_ENUM);
2424 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002425 }
2426 }
2427 }
2428 catch(std::bad_alloc&)
2429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 }
2432}
2433
2434void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002436 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002437 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002438
2439 try
2440 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002441 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002443 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002444 }
2445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002447
2448 if (context)
2449 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002450 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2451 {
2452 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2453
2454 if (colorAttachment >= context->getMaximumRenderTargets())
2455 {
2456 return gl::error(GL_INVALID_VALUE);
2457 }
2458 }
2459 else
2460 {
2461 switch (attachment)
2462 {
2463 case GL_DEPTH_ATTACHMENT:
2464 case GL_STENCIL_ATTACHMENT:
2465 break;
2466 default:
2467 return gl::error(GL_INVALID_ENUM);
2468 }
2469 }
2470
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002471 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002473 textarget = GL_NONE;
2474 }
2475 else
2476 {
2477 gl::Texture *tex = context->getTexture(texture);
2478
2479 if (tex == NULL)
2480 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002481 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002482 }
2483
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002484 switch (textarget)
2485 {
2486 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002488 if (tex->getTarget() != GL_TEXTURE_2D)
2489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002490 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002491 }
2492 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002493 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002495 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002496 }
2497 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002498 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002499
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002500 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002501 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002502 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002503 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002505 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002506 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002507 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002509 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002510 }
2511 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002512 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002514 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002515 }
2516 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002517 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002518
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002520 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521 }
2522
2523 if (level != 0)
2524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002525 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527 }
2528
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002529 gl::Framebuffer *framebuffer = NULL;
2530 GLuint framebufferHandle = 0;
2531 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2532 {
2533 framebuffer = context->getReadFramebuffer();
2534 framebufferHandle = context->getReadFramebufferHandle();
2535 }
2536 else
2537 {
2538 framebuffer = context->getDrawFramebuffer();
2539 framebufferHandle = context->getDrawFramebufferHandle();
2540 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002542 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002544 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002545 }
2546
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002547 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002548 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00002549 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2550
2551 if (colorAttachment >= context->getMaximumRenderTargets())
2552 {
2553 return gl::error(GL_INVALID_VALUE);
2554 }
2555
2556 framebuffer->setColorbuffer(colorAttachment, textarget, texture);
2557 }
2558 else
2559 {
2560 switch (attachment)
2561 {
2562 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2563 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2564 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002565 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 }
2567 }
2568 catch(std::bad_alloc&)
2569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 }
2572}
2573
2574void __stdcall glFrontFace(GLenum mode)
2575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002576 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577
2578 try
2579 {
2580 switch (mode)
2581 {
2582 case GL_CW:
2583 case GL_CCW:
2584 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002585 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002586
2587 if (context)
2588 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002589 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590 }
2591 }
2592 break;
2593 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002594 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002595 }
2596 }
2597 catch(std::bad_alloc&)
2598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002599 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002600 }
2601}
2602
2603void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2604{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002605 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002606
2607 try
2608 {
2609 if (n < 0)
2610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002612 }
2613
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002615
2616 if (context)
2617 {
2618 for (int i = 0; i < n; i++)
2619 {
2620 buffers[i] = context->createBuffer();
2621 }
2622 }
2623 }
2624 catch(std::bad_alloc&)
2625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627 }
2628}
2629
2630void __stdcall glGenerateMipmap(GLenum target)
2631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002632 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633
2634 try
2635 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002637
2638 if (context)
2639 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002640 switch (target)
2641 {
2642 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002643 {
2644 gl::Texture2D *tex2d = context->getTexture2D();
2645
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002646 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002648 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002649 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002650 if (tex2d->isDepth(0))
2651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002652 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002653 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002654
2655 tex2d->generateMipmaps();
2656 break;
2657 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002658
2659 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002660 {
2661 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2662
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002663 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002664 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002665 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002666 }
2667
2668 texcube->generateMipmaps();
2669 break;
2670 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002671
2672 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002674 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002675 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002676 }
2677 catch(std::bad_alloc&)
2678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002679 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002680 }
2681}
2682
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002683void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2684{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002685 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002686
2687 try
2688 {
2689 if (n < 0)
2690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002691 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002692 }
2693
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002694 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002695
2696 if (context)
2697 {
2698 for (int i = 0; i < n; i++)
2699 {
2700 fences[i] = context->createFence();
2701 }
2702 }
2703 }
2704 catch(std::bad_alloc&)
2705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002706 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002707 }
2708}
2709
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002710void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2711{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002712 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002713
2714 try
2715 {
2716 if (n < 0)
2717 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002718 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002719 }
2720
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002721 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002722
2723 if (context)
2724 {
2725 for (int i = 0; i < n; i++)
2726 {
2727 framebuffers[i] = context->createFramebuffer();
2728 }
2729 }
2730 }
2731 catch(std::bad_alloc&)
2732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002733 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002734 }
2735}
2736
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002737void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2738{
2739 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2740
2741 try
2742 {
2743 if (n < 0)
2744 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002745 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002746 }
2747
2748 gl::Context *context = gl::getNonLostContext();
2749
2750 if (context)
2751 {
2752 for (int i = 0; i < n; i++)
2753 {
2754 ids[i] = context->createQuery();
2755 }
2756 }
2757 }
2758 catch(std::bad_alloc&)
2759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002760 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002761 }
2762}
2763
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002764void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2765{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002766 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002767
2768 try
2769 {
2770 if (n < 0)
2771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002772 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002773 }
2774
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002775 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002776
2777 if (context)
2778 {
2779 for (int i = 0; i < n; i++)
2780 {
2781 renderbuffers[i] = context->createRenderbuffer();
2782 }
2783 }
2784 }
2785 catch(std::bad_alloc&)
2786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002787 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002788 }
2789}
2790
2791void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2792{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002793 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002794
2795 try
2796 {
2797 if (n < 0)
2798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002799 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002800 }
2801
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002802 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002803
2804 if (context)
2805 {
2806 for (int i = 0; i < n; i++)
2807 {
2808 textures[i] = context->createTexture();
2809 }
2810 }
2811 }
2812 catch(std::bad_alloc&)
2813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002814 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816}
2817
daniel@transgaming.com85423182010-04-22 13:35:27 +00002818void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002819{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002820 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002821 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002822 program, index, bufsize, length, size, type, name);
2823
2824 try
2825 {
2826 if (bufsize < 0)
2827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002828 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002829 }
2830
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002831 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002832
2833 if (context)
2834 {
2835 gl::Program *programObject = context->getProgram(program);
2836
2837 if (!programObject)
2838 {
2839 if (context->getShader(program))
2840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002841 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002842 }
2843 else
2844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002845 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002846 }
2847 }
2848
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002849 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002852 }
2853
2854 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2855 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002856 }
2857 catch(std::bad_alloc&)
2858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002860 }
2861}
2862
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002863void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002865 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002866 "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 +00002867 program, index, bufsize, length, size, type, name);
2868
2869 try
2870 {
2871 if (bufsize < 0)
2872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002873 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002874 }
2875
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002876 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002877
2878 if (context)
2879 {
2880 gl::Program *programObject = context->getProgram(program);
2881
2882 if (!programObject)
2883 {
2884 if (context->getShader(program))
2885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002886 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002887 }
2888 else
2889 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002890 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002891 }
2892 }
2893
2894 if (index >= (GLuint)programObject->getActiveUniformCount())
2895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002896 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002897 }
2898
2899 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2900 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002901 }
2902 catch(std::bad_alloc&)
2903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002904 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002905 }
2906}
2907
2908void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2909{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002910 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 +00002911 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002912
2913 try
2914 {
2915 if (maxcount < 0)
2916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002918 }
2919
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002920 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002921
2922 if (context)
2923 {
2924 gl::Program *programObject = context->getProgram(program);
2925
2926 if (!programObject)
2927 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002928 if (context->getShader(program))
2929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002930 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002931 }
2932 else
2933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002934 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002935 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002936 }
2937
2938 return programObject->getAttachedShaders(maxcount, count, shaders);
2939 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940 }
2941 catch(std::bad_alloc&)
2942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002943 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 }
2945}
2946
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002947int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002948{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002949 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
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.com4f39fd92010-03-08 20:26:45 +00002954
2955 if (context)
2956 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002957
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002958 gl::Program *programObject = context->getProgram(program);
2959
2960 if (!programObject)
2961 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002962 if (context->getShader(program))
2963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002964 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002965 }
2966 else
2967 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002968 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002969 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002970 }
2971
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002972 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002973 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002975 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002976 }
2977
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002978 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002979 }
2980 }
2981 catch(std::bad_alloc&)
2982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002983 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002984 }
2985
2986 return -1;
2987}
2988
2989void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002991 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002992
2993 try
2994 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002995 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002996
2997 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002998 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002999 if (!(context->getBooleanv(pname, params)))
3000 {
3001 GLenum nativeType;
3002 unsigned int numParams = 0;
3003 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003004 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003005
3006 if (numParams == 0)
3007 return; // it is known that the pname is valid, but there are no parameters to return
3008
3009 if (nativeType == GL_FLOAT)
3010 {
3011 GLfloat *floatParams = NULL;
3012 floatParams = new GLfloat[numParams];
3013
3014 context->getFloatv(pname, floatParams);
3015
3016 for (unsigned int i = 0; i < numParams; ++i)
3017 {
3018 if (floatParams[i] == 0.0f)
3019 params[i] = GL_FALSE;
3020 else
3021 params[i] = GL_TRUE;
3022 }
3023
3024 delete [] floatParams;
3025 }
3026 else if (nativeType == GL_INT)
3027 {
3028 GLint *intParams = NULL;
3029 intParams = new GLint[numParams];
3030
3031 context->getIntegerv(pname, intParams);
3032
3033 for (unsigned int i = 0; i < numParams; ++i)
3034 {
3035 if (intParams[i] == 0)
3036 params[i] = GL_FALSE;
3037 else
3038 params[i] = GL_TRUE;
3039 }
3040
3041 delete [] intParams;
3042 }
3043 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003044 }
3045 }
3046 catch(std::bad_alloc&)
3047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003048 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003049 }
3050}
3051
3052void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3053{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003054 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 +00003055
3056 try
3057 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003058 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003059
3060 if (context)
3061 {
3062 gl::Buffer *buffer;
3063
3064 switch (target)
3065 {
3066 case GL_ARRAY_BUFFER:
3067 buffer = context->getArrayBuffer();
3068 break;
3069 case GL_ELEMENT_ARRAY_BUFFER:
3070 buffer = context->getElementArrayBuffer();
3071 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003072 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003073 }
3074
3075 if (!buffer)
3076 {
3077 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003078 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003079 }
3080
3081 switch (pname)
3082 {
3083 case GL_BUFFER_USAGE:
3084 *params = buffer->usage();
3085 break;
3086 case GL_BUFFER_SIZE:
3087 *params = buffer->size();
3088 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003089 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003090 }
3091 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003092 }
3093 catch(std::bad_alloc&)
3094 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003095 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003096 }
3097}
3098
3099GLenum __stdcall glGetError(void)
3100{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003101 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003102
3103 gl::Context *context = gl::getContext();
3104
3105 if (context)
3106 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003107 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108 }
3109
3110 return GL_NO_ERROR;
3111}
3112
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003113void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3114{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003115 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003116
3117 try
3118 {
3119
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003120 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003121
3122 if (context)
3123 {
3124 gl::Fence *fenceObject = context->getFence(fence);
3125
3126 if (fenceObject == NULL)
3127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003128 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003129 }
3130
3131 fenceObject->getFenceiv(pname, params);
3132 }
3133 }
3134 catch(std::bad_alloc&)
3135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003136 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003137 }
3138}
3139
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003140void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003142 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143
3144 try
3145 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003146 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003147
3148 if (context)
3149 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003150 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003151 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003152 GLenum nativeType;
3153 unsigned int numParams = 0;
3154 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003155 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003156
3157 if (numParams == 0)
3158 return; // it is known that the pname is valid, but that there are no parameters to return.
3159
3160 if (nativeType == GL_BOOL)
3161 {
3162 GLboolean *boolParams = NULL;
3163 boolParams = new GLboolean[numParams];
3164
3165 context->getBooleanv(pname, boolParams);
3166
3167 for (unsigned int i = 0; i < numParams; ++i)
3168 {
3169 if (boolParams[i] == GL_FALSE)
3170 params[i] = 0.0f;
3171 else
3172 params[i] = 1.0f;
3173 }
3174
3175 delete [] boolParams;
3176 }
3177 else if (nativeType == GL_INT)
3178 {
3179 GLint *intParams = NULL;
3180 intParams = new GLint[numParams];
3181
3182 context->getIntegerv(pname, intParams);
3183
3184 for (unsigned int i = 0; i < numParams; ++i)
3185 {
3186 params[i] = (GLfloat)intParams[i];
3187 }
3188
3189 delete [] intParams;
3190 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003191 }
3192 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003193 }
3194 catch(std::bad_alloc&)
3195 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003196 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197 }
3198}
3199
3200void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3201{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003202 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 +00003203 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003204
3205 try
3206 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003207 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003208
3209 if (context)
3210 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003211 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003212 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003213 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003214 }
3215
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003216 gl::Framebuffer *framebuffer = NULL;
3217 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3218 {
3219 if(context->getReadFramebufferHandle() == 0)
3220 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003221 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003222 }
3223
3224 framebuffer = context->getReadFramebuffer();
3225 }
3226 else
3227 {
3228 if (context->getDrawFramebufferHandle() == 0)
3229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003230 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003231 }
3232
3233 framebuffer = context->getDrawFramebuffer();
3234 }
3235
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003236 GLenum attachmentType;
3237 GLuint attachmentHandle;
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003238
3239 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003240 {
shannon.woods%transgaming.com@gtempaccount.com89ae1132013-04-13 03:28:43 +00003241 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
3242
3243 if (colorAttachment >= context->getMaximumRenderTargets())
3244 {
3245 return gl::error(GL_INVALID_ENUM);
3246 }
3247
3248 attachmentType = framebuffer->getColorbufferType(colorAttachment);
3249 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
3250 }
3251 else
3252 {
3253 switch (attachment)
3254 {
3255 case GL_DEPTH_ATTACHMENT:
3256 attachmentType = framebuffer->getDepthbufferType();
3257 attachmentHandle = framebuffer->getDepthbufferHandle();
3258 break;
3259 case GL_STENCIL_ATTACHMENT:
3260 attachmentType = framebuffer->getStencilbufferType();
3261 attachmentHandle = framebuffer->getStencilbufferHandle();
3262 break;
3263 default: return gl::error(GL_INVALID_ENUM);
3264 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003265 }
3266
3267 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003268 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003269 {
3270 attachmentObjectType = attachmentType;
3271 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003272 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003273 {
3274 attachmentObjectType = GL_TEXTURE;
3275 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003276 else
3277 {
3278 UNREACHABLE();
3279 return;
3280 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003281
3282 switch (pname)
3283 {
3284 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3285 *params = attachmentObjectType;
3286 break;
3287 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3288 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3289 {
3290 *params = attachmentHandle;
3291 }
3292 else
3293 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003294 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003295 }
3296 break;
3297 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3298 if (attachmentObjectType == GL_TEXTURE)
3299 {
3300 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3301 }
3302 else
3303 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003304 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003305 }
3306 break;
3307 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3308 if (attachmentObjectType == GL_TEXTURE)
3309 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003310 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003311 {
3312 *params = attachmentType;
3313 }
3314 else
3315 {
3316 *params = 0;
3317 }
3318 }
3319 else
3320 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003321 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003322 }
3323 break;
3324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003327 }
3328 }
3329 catch(std::bad_alloc&)
3330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003331 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003332 }
3333}
3334
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003335GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3336{
3337 EVENT("()");
3338
3339 try
3340 {
3341 gl::Context *context = gl::getContext();
3342
3343 if (context)
3344 {
3345 return context->getResetStatus();
3346 }
3347
3348 return GL_NO_ERROR;
3349 }
3350 catch(std::bad_alloc&)
3351 {
3352 return GL_OUT_OF_MEMORY;
3353 }
3354}
3355
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003358 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003359
3360 try
3361 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003362 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003363
3364 if (context)
3365 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003366 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003368 GLenum nativeType;
3369 unsigned int numParams = 0;
3370 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003371 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003372
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003373 if (numParams == 0)
3374 return; // it is known that pname is valid, but there are no parameters to return
3375
3376 if (nativeType == GL_BOOL)
3377 {
3378 GLboolean *boolParams = NULL;
3379 boolParams = new GLboolean[numParams];
3380
3381 context->getBooleanv(pname, boolParams);
3382
3383 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003384 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003385 if (boolParams[i] == GL_FALSE)
3386 params[i] = 0;
3387 else
3388 params[i] = 1;
3389 }
3390
3391 delete [] boolParams;
3392 }
3393 else if (nativeType == GL_FLOAT)
3394 {
3395 GLfloat *floatParams = NULL;
3396 floatParams = new GLfloat[numParams];
3397
3398 context->getFloatv(pname, floatParams);
3399
3400 for (unsigned int i = 0; i < numParams; ++i)
3401 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003402 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 +00003403 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003404 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003405 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003406 else
3407 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 +00003408 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003410 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003411 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003412 }
3413 }
3414 }
3415 catch(std::bad_alloc&)
3416 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003417 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003418 }
3419}
3420
3421void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3422{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003423 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003424
3425 try
3426 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003427 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428
3429 if (context)
3430 {
3431 gl::Program *programObject = context->getProgram(program);
3432
3433 if (!programObject)
3434 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003435 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003436 }
3437
3438 switch (pname)
3439 {
3440 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003441 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003442 return;
3443 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003444 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003445 return;
3446 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003447 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003448 return;
3449 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003450 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003451 return;
3452 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003453 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003454 return;
3455 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003456 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003457 return;
3458 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003459 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003460 return;
3461 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003462 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003463 return;
3464 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003465 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003466 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003467 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003468 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003469 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003470 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003471 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003472 }
3473 }
3474 }
3475 catch(std::bad_alloc&)
3476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003477 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003478 }
3479}
3480
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003481void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003483 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 +00003484 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003485
3486 try
3487 {
3488 if (bufsize < 0)
3489 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003490 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003491 }
3492
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003493 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003494
3495 if (context)
3496 {
3497 gl::Program *programObject = context->getProgram(program);
3498
3499 if (!programObject)
3500 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003501 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003502 }
3503
3504 programObject->getInfoLog(bufsize, length, infolog);
3505 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003506 }
3507 catch(std::bad_alloc&)
3508 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003509 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003510 }
3511}
3512
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003513void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3514{
3515 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3516
3517 try
3518 {
3519 switch (pname)
3520 {
3521 case GL_CURRENT_QUERY_EXT:
3522 break;
3523 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003524 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003525 }
3526
3527 gl::Context *context = gl::getNonLostContext();
3528
3529 if (context)
3530 {
3531 params[0] = context->getActiveQuery(target);
3532 }
3533 }
3534 catch(std::bad_alloc&)
3535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003536 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003537 }
3538}
3539
3540void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3541{
3542 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3543
3544 try
3545 {
3546 switch (pname)
3547 {
3548 case GL_QUERY_RESULT_EXT:
3549 case GL_QUERY_RESULT_AVAILABLE_EXT:
3550 break;
3551 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003553 }
3554 gl::Context *context = gl::getNonLostContext();
3555
3556 if (context)
3557 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003558 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3559
3560 if (!queryObject)
3561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003562 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003563 }
3564
3565 if (context->getActiveQuery(queryObject->getType()) == id)
3566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003567 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003568 }
3569
3570 switch(pname)
3571 {
3572 case GL_QUERY_RESULT_EXT:
3573 params[0] = queryObject->getResult();
3574 break;
3575 case GL_QUERY_RESULT_AVAILABLE_EXT:
3576 params[0] = queryObject->isResultAvailable();
3577 break;
3578 default:
3579 ASSERT(false);
3580 }
3581 }
3582 }
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.com86bdb822012-01-20 18:24:39 +00003586 }
3587}
3588
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003589void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3590{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003591 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 +00003592
3593 try
3594 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003595 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003596
3597 if (context)
3598 {
3599 if (target != GL_RENDERBUFFER)
3600 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003601 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003602 }
3603
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003604 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003605 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003606 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003607 }
3608
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003609 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003610
3611 switch (pname)
3612 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003613 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3614 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3615 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3616 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3617 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3618 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3619 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3620 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3621 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003622 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003623 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003624 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003625 *params = renderbuffer->getSamples();
3626 }
3627 else
3628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003629 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003630 }
3631 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003632 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003633 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003634 }
3635 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003636 }
3637 catch(std::bad_alloc&)
3638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003639 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003640 }
3641}
3642
3643void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3644{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003645 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003646
3647 try
3648 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003649 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003650
3651 if (context)
3652 {
3653 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003654
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003655 if (!shaderObject)
3656 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003657 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003658 }
3659
3660 switch (pname)
3661 {
3662 case GL_SHADER_TYPE:
3663 *params = shaderObject->getType();
3664 return;
3665 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003666 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003667 return;
3668 case GL_COMPILE_STATUS:
3669 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3670 return;
3671 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003672 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 return;
3674 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003675 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003676 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003677 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3678 *params = shaderObject->getTranslatedSourceLength();
3679 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003680 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003681 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003682 }
3683 }
3684 }
3685 catch(std::bad_alloc&)
3686 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003687 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003688 }
3689}
3690
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003691void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003692{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003693 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 +00003694 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003695
3696 try
3697 {
3698 if (bufsize < 0)
3699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003701 }
3702
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003703 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003704
3705 if (context)
3706 {
3707 gl::Shader *shaderObject = context->getShader(shader);
3708
3709 if (!shaderObject)
3710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003711 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003712 }
3713
3714 shaderObject->getInfoLog(bufsize, length, infolog);
3715 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003716 }
3717 catch(std::bad_alloc&)
3718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003719 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003720 }
3721}
3722
3723void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3724{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003725 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 +00003726 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003727
3728 try
3729 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003730 switch (shadertype)
3731 {
3732 case GL_VERTEX_SHADER:
3733 case GL_FRAGMENT_SHADER:
3734 break;
3735 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003737 }
3738
3739 switch (precisiontype)
3740 {
3741 case GL_LOW_FLOAT:
3742 case GL_MEDIUM_FLOAT:
3743 case GL_HIGH_FLOAT:
3744 // Assume IEEE 754 precision
3745 range[0] = 127;
3746 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003747 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003748 break;
3749 case GL_LOW_INT:
3750 case GL_MEDIUM_INT:
3751 case GL_HIGH_INT:
3752 // Some (most) hardware only supports single-precision floating-point numbers,
3753 // which can accurately represent integers up to +/-16777216
3754 range[0] = 24;
3755 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003756 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003757 break;
3758 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003759 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003760 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003761 }
3762 catch(std::bad_alloc&)
3763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003764 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003765 }
3766}
3767
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003768void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003770 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 +00003771 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003772
3773 try
3774 {
3775 if (bufsize < 0)
3776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003777 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778 }
3779
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003780 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003781
3782 if (context)
3783 {
3784 gl::Shader *shaderObject = context->getShader(shader);
3785
3786 if (!shaderObject)
3787 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003788 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003789 }
3790
3791 shaderObject->getSource(bufsize, length, source);
3792 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 }
3794 catch(std::bad_alloc&)
3795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
3798}
3799
zmo@google.coma574f782011-10-03 21:45:23 +00003800void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3801{
3802 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3803 shader, bufsize, length, source);
3804
3805 try
3806 {
3807 if (bufsize < 0)
3808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003809 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003810 }
3811
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003812 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003813
3814 if (context)
3815 {
3816 gl::Shader *shaderObject = context->getShader(shader);
3817
3818 if (!shaderObject)
3819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003820 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003821 }
3822
3823 shaderObject->getTranslatedSource(bufsize, length, source);
3824 }
3825 }
3826 catch(std::bad_alloc&)
3827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003828 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003829 }
3830}
3831
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003832const GLubyte* __stdcall glGetString(GLenum name)
3833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003834 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003835
3836 try
3837 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003839
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003840 switch (name)
3841 {
3842 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003843 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003844 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003845 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003846 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003847 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003848 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003849 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003850 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003851 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003852 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003853 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003854 }
3855 }
3856 catch(std::bad_alloc&)
3857 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003858 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003859 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003860}
3861
3862void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3863{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003864 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 +00003865
3866 try
3867 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003868 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003869
3870 if (context)
3871 {
3872 gl::Texture *texture;
3873
3874 switch (target)
3875 {
3876 case GL_TEXTURE_2D:
3877 texture = context->getTexture2D();
3878 break;
3879 case GL_TEXTURE_CUBE_MAP:
3880 texture = context->getTextureCubeMap();
3881 break;
3882 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003883 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003884 }
3885
3886 switch (pname)
3887 {
3888 case GL_TEXTURE_MAG_FILTER:
3889 *params = (GLfloat)texture->getMagFilter();
3890 break;
3891 case GL_TEXTURE_MIN_FILTER:
3892 *params = (GLfloat)texture->getMinFilter();
3893 break;
3894 case GL_TEXTURE_WRAP_S:
3895 *params = (GLfloat)texture->getWrapS();
3896 break;
3897 case GL_TEXTURE_WRAP_T:
3898 *params = (GLfloat)texture->getWrapT();
3899 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003900 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3901 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3902 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003903 case GL_TEXTURE_USAGE_ANGLE:
3904 *params = (GLfloat)texture->getUsage();
3905 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003906 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3907 if (!context->supportsTextureFilterAnisotropy())
3908 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003909 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003910 }
3911 *params = (GLfloat)texture->getMaxAnisotropy();
3912 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003913 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003914 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003915 }
3916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003917 }
3918 catch(std::bad_alloc&)
3919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003920 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003921 }
3922}
3923
3924void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3925{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003926 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 +00003927
3928 try
3929 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003930 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003931
3932 if (context)
3933 {
3934 gl::Texture *texture;
3935
3936 switch (target)
3937 {
3938 case GL_TEXTURE_2D:
3939 texture = context->getTexture2D();
3940 break;
3941 case GL_TEXTURE_CUBE_MAP:
3942 texture = context->getTextureCubeMap();
3943 break;
3944 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003945 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003946 }
3947
3948 switch (pname)
3949 {
3950 case GL_TEXTURE_MAG_FILTER:
3951 *params = texture->getMagFilter();
3952 break;
3953 case GL_TEXTURE_MIN_FILTER:
3954 *params = texture->getMinFilter();
3955 break;
3956 case GL_TEXTURE_WRAP_S:
3957 *params = texture->getWrapS();
3958 break;
3959 case GL_TEXTURE_WRAP_T:
3960 *params = texture->getWrapT();
3961 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003962 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3963 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3964 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003965 case GL_TEXTURE_USAGE_ANGLE:
3966 *params = texture->getUsage();
3967 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003968 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3969 if (!context->supportsTextureFilterAnisotropy())
3970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003972 }
3973 *params = (GLint)texture->getMaxAnisotropy();
3974 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003975 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003976 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003977 }
3978 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003979 }
3980 catch(std::bad_alloc&)
3981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003982 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003983 }
3984}
3985
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003986void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3987{
3988 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3989 program, location, bufSize, params);
3990
3991 try
3992 {
3993 if (bufSize < 0)
3994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003995 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003996 }
3997
3998 gl::Context *context = gl::getNonLostContext();
3999
4000 if (context)
4001 {
4002 if (program == 0)
4003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004005 }
4006
4007 gl::Program *programObject = context->getProgram(program);
4008
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004009 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004011 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004012 }
4013
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004014 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4015 if (!programBinary)
4016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004017 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004018 }
4019
4020 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004021 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004022 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004023 }
4024 }
4025 }
4026 catch(std::bad_alloc&)
4027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004028 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004029 }
4030}
4031
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004032void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
4033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004034 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035
4036 try
4037 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004038 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004039
4040 if (context)
4041 {
4042 if (program == 0)
4043 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004044 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004045 }
4046
4047 gl::Program *programObject = context->getProgram(program);
4048
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004049 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004051 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004052 }
4053
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004054 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4055 if (!programBinary)
4056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004057 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004058 }
4059
4060 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004061 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004062 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004063 }
4064 }
4065 }
4066 catch(std::bad_alloc&)
4067 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004068 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004069 }
4070}
4071
4072void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4073{
4074 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4075 program, location, bufSize, params);
4076
4077 try
4078 {
4079 if (bufSize < 0)
4080 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004081 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004082 }
4083
4084 gl::Context *context = gl::getNonLostContext();
4085
4086 if (context)
4087 {
4088 if (program == 0)
4089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004090 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004091 }
4092
4093 gl::Program *programObject = context->getProgram(program);
4094
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004095 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004097 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004098 }
4099
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004100 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4101 if (!programBinary)
4102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004103 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004104 }
4105
4106 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004107 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004108 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004109 }
4110 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004111 }
4112 catch(std::bad_alloc&)
4113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004114 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004115 }
4116}
4117
4118void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4119{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004120 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004121
4122 try
4123 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004124 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004125
4126 if (context)
4127 {
4128 if (program == 0)
4129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004130 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004131 }
4132
4133 gl::Program *programObject = context->getProgram(program);
4134
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004135 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004136 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004137 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004138 }
4139
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004140 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4141 if (!programBinary)
4142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004143 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004144 }
4145
4146 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004148 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004149 }
4150 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004151 }
4152 catch(std::bad_alloc&)
4153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004155 }
4156}
4157
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004158int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004159{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004160 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004161
4162 try
4163 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004164 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004165
4166 if (strstr(name, "gl_") == name)
4167 {
4168 return -1;
4169 }
4170
4171 if (context)
4172 {
4173 gl::Program *programObject = context->getProgram(program);
4174
4175 if (!programObject)
4176 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004177 if (context->getShader(program))
4178 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004179 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004180 }
4181 else
4182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004183 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004184 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004185 }
4186
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004187 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004188 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004190 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004191 }
4192
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004193 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004194 }
4195 }
4196 catch(std::bad_alloc&)
4197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004198 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004199 }
4200
4201 return -1;
4202}
4203
4204void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4205{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004206 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004207
4208 try
4209 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004210 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004211
daniel@transgaming.come0078962010-04-15 20:45:08 +00004212 if (context)
4213 {
4214 if (index >= gl::MAX_VERTEX_ATTRIBS)
4215 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004216 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004217 }
4218
daniel@transgaming.com83921382011-01-08 05:46:00 +00004219 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004220
daniel@transgaming.come0078962010-04-15 20:45:08 +00004221 switch (pname)
4222 {
4223 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004224 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004225 break;
4226 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004227 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004228 break;
4229 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004230 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004231 break;
4232 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004233 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004234 break;
4235 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004236 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004237 break;
4238 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004239 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004240 break;
4241 case GL_CURRENT_VERTEX_ATTRIB:
4242 for (int i = 0; i < 4; ++i)
4243 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004244 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004245 }
4246 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004247 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4248 *params = (GLfloat)attribState.mDivisor;
4249 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004251 }
4252 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004253 }
4254 catch(std::bad_alloc&)
4255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004256 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004257 }
4258}
4259
4260void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4261{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004262 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263
4264 try
4265 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267
daniel@transgaming.come0078962010-04-15 20:45:08 +00004268 if (context)
4269 {
4270 if (index >= gl::MAX_VERTEX_ATTRIBS)
4271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004273 }
4274
daniel@transgaming.com83921382011-01-08 05:46:00 +00004275 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004276
daniel@transgaming.come0078962010-04-15 20:45:08 +00004277 switch (pname)
4278 {
4279 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004280 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004281 break;
4282 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004283 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004284 break;
4285 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004286 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004287 break;
4288 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004289 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004290 break;
4291 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004292 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004293 break;
4294 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004295 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004296 break;
4297 case GL_CURRENT_VERTEX_ATTRIB:
4298 for (int i = 0; i < 4; ++i)
4299 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004300 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004301 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4302 }
4303 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004304 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4305 *params = (GLint)attribState.mDivisor;
4306 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004307 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004308 }
4309 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004310 }
4311 catch(std::bad_alloc&)
4312 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004313 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004314 }
4315}
4316
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004317void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004318{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004319 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004320
4321 try
4322 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004323 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004324
daniel@transgaming.come0078962010-04-15 20:45:08 +00004325 if (context)
4326 {
4327 if (index >= gl::MAX_VERTEX_ATTRIBS)
4328 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004329 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004330 }
4331
4332 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4333 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004334 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004335 }
4336
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004337 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004338 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004339 }
4340 catch(std::bad_alloc&)
4341 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004342 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004343 }
4344}
4345
4346void __stdcall glHint(GLenum target, GLenum mode)
4347{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004348 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004349
4350 try
4351 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004352 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004353 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004354 case GL_FASTEST:
4355 case GL_NICEST:
4356 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004357 break;
4358 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004359 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004360 }
4361
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004362 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004363 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004364 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004365 case GL_GENERATE_MIPMAP_HINT:
4366 if (context) context->setGenerateMipmapHint(mode);
4367 break;
4368 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4369 if (context) context->setFragmentShaderDerivativeHint(mode);
4370 break;
4371 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004372 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004373 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004374 }
4375 catch(std::bad_alloc&)
4376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004377 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004378 }
4379}
4380
4381GLboolean __stdcall glIsBuffer(GLuint buffer)
4382{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004383 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004384
4385 try
4386 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004387 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004388
4389 if (context && buffer)
4390 {
4391 gl::Buffer *bufferObject = context->getBuffer(buffer);
4392
4393 if (bufferObject)
4394 {
4395 return GL_TRUE;
4396 }
4397 }
4398 }
4399 catch(std::bad_alloc&)
4400 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004401 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004402 }
4403
4404 return GL_FALSE;
4405}
4406
4407GLboolean __stdcall glIsEnabled(GLenum cap)
4408{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004409 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004410
4411 try
4412 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004413 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004414
4415 if (context)
4416 {
4417 switch (cap)
4418 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004419 case GL_CULL_FACE: return context->isCullFaceEnabled();
4420 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4421 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4422 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4423 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4424 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4425 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4426 case GL_BLEND: return context->isBlendEnabled();
4427 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004428 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004429 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004430 }
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, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 }
4437
4438 return false;
4439}
4440
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004441GLboolean __stdcall glIsFenceNV(GLuint fence)
4442{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004443 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004444
4445 try
4446 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004447 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004448
4449 if (context)
4450 {
4451 gl::Fence *fenceObject = context->getFence(fence);
4452
4453 if (fenceObject == NULL)
4454 {
4455 return GL_FALSE;
4456 }
4457
4458 return fenceObject->isFence();
4459 }
4460 }
4461 catch(std::bad_alloc&)
4462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004463 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004464 }
4465
4466 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004467}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004468
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4470{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004471 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004472
4473 try
4474 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004475 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004476
4477 if (context && framebuffer)
4478 {
4479 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4480
4481 if (framebufferObject)
4482 {
4483 return GL_TRUE;
4484 }
4485 }
4486 }
4487 catch(std::bad_alloc&)
4488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004489 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004490 }
4491
4492 return GL_FALSE;
4493}
4494
4495GLboolean __stdcall glIsProgram(GLuint program)
4496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004497 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498
4499 try
4500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004502
4503 if (context && program)
4504 {
4505 gl::Program *programObject = context->getProgram(program);
4506
4507 if (programObject)
4508 {
4509 return GL_TRUE;
4510 }
4511 }
4512 }
4513 catch(std::bad_alloc&)
4514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004515 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
4517
4518 return GL_FALSE;
4519}
4520
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004521GLboolean __stdcall glIsQueryEXT(GLuint id)
4522{
4523 EVENT("(GLuint id = %d)", id);
4524
4525 try
4526 {
4527 if (id == 0)
4528 {
4529 return GL_FALSE;
4530 }
4531
4532 gl::Context *context = gl::getNonLostContext();
4533
4534 if (context)
4535 {
4536 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4537
4538 if (queryObject)
4539 {
4540 return GL_TRUE;
4541 }
4542 }
4543 }
4544 catch(std::bad_alloc&)
4545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004546 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004547 }
4548
4549 return GL_FALSE;
4550}
4551
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004552GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4553{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004554 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004555
4556 try
4557 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004558 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004559
4560 if (context && renderbuffer)
4561 {
4562 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4563
4564 if (renderbufferObject)
4565 {
4566 return GL_TRUE;
4567 }
4568 }
4569 }
4570 catch(std::bad_alloc&)
4571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004572 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004573 }
4574
4575 return GL_FALSE;
4576}
4577
4578GLboolean __stdcall glIsShader(GLuint shader)
4579{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004580 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004581
4582 try
4583 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004585
4586 if (context && shader)
4587 {
4588 gl::Shader *shaderObject = context->getShader(shader);
4589
4590 if (shaderObject)
4591 {
4592 return GL_TRUE;
4593 }
4594 }
4595 }
4596 catch(std::bad_alloc&)
4597 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004598 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004599 }
4600
4601 return GL_FALSE;
4602}
4603
4604GLboolean __stdcall glIsTexture(GLuint texture)
4605{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004606 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004607
4608 try
4609 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004610 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004611
4612 if (context && texture)
4613 {
4614 gl::Texture *textureObject = context->getTexture(texture);
4615
4616 if (textureObject)
4617 {
4618 return GL_TRUE;
4619 }
4620 }
4621 }
4622 catch(std::bad_alloc&)
4623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004624 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004625 }
4626
4627 return GL_FALSE;
4628}
4629
4630void __stdcall glLineWidth(GLfloat width)
4631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004632 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633
4634 try
4635 {
4636 if (width <= 0.0f)
4637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 }
4640
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004641 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004642
4643 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004644 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004645 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004646 }
4647 }
4648 catch(std::bad_alloc&)
4649 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004650 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004651 }
4652}
4653
4654void __stdcall glLinkProgram(GLuint program)
4655{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004656 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004657
4658 try
4659 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004660 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004661
4662 if (context)
4663 {
4664 gl::Program *programObject = context->getProgram(program);
4665
4666 if (!programObject)
4667 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004668 if (context->getShader(program))
4669 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004670 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004671 }
4672 else
4673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004674 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004675 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004676 }
4677
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004678 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004679 }
4680 }
4681 catch(std::bad_alloc&)
4682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004683 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 }
4685}
4686
4687void __stdcall glPixelStorei(GLenum pname, GLint param)
4688{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004689 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004690
4691 try
4692 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004693 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004694
4695 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004697 switch (pname)
4698 {
4699 case GL_UNPACK_ALIGNMENT:
4700 if (param != 1 && param != 2 && param != 4 && param != 8)
4701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004702 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004703 }
4704
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004705 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004706 break;
4707
4708 case GL_PACK_ALIGNMENT:
4709 if (param != 1 && param != 2 && param != 4 && param != 8)
4710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004711 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004712 }
4713
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004714 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004715 break;
4716
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004717 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4718 context->setPackReverseRowOrder(param != 0);
4719 break;
4720
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004721 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004722 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004723 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004724 }
4725 }
4726 catch(std::bad_alloc&)
4727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004728 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729 }
4730}
4731
4732void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4733{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004734 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004735
4736 try
4737 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004738 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004739
4740 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004741 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004742 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004743 }
4744 }
4745 catch(std::bad_alloc&)
4746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004748 }
4749}
4750
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004751void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4752 GLenum format, GLenum type, GLsizei bufSize,
4753 GLvoid *data)
4754{
4755 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4756 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4757 x, y, width, height, format, type, bufSize, data);
4758
4759 try
4760 {
4761 if (width < 0 || height < 0 || bufSize < 0)
4762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004763 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004764 }
4765
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004766 gl::Context *context = gl::getNonLostContext();
4767
4768 if (context)
4769 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004770 GLenum currentFormat, currentType;
4771
4772 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4773 // and attempting to read back if that's the case is an error. The error will be registered
4774 // by getCurrentReadFormat.
4775 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4776 return;
4777
4778 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004780 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004781 }
4782
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004783 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4784 }
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.comb7915a52011-11-12 03:14:20 +00004789 }
4790}
4791
4792void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4793 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004794{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004795 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004796 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004797 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004798
4799 try
4800 {
4801 if (width < 0 || height < 0)
4802 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004803 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804 }
4805
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004806 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004807
4808 if (context)
4809 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004810 GLenum currentFormat, currentType;
4811
4812 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4813 // and attempting to read back if that's the case is an error. The error will be registered
4814 // by getCurrentReadFormat.
4815 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4816 return;
4817
4818 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004820 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004821 }
4822
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004823 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004824 }
4825 }
4826 catch(std::bad_alloc&)
4827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004828 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829 }
4830}
4831
4832void __stdcall glReleaseShaderCompiler(void)
4833{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004834 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004835
4836 try
4837 {
4838 gl::Shader::releaseCompiler();
4839 }
4840 catch(std::bad_alloc&)
4841 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004842 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004843 }
4844}
4845
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004846void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004847{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004848 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 +00004849 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004850
4851 try
4852 {
4853 switch (target)
4854 {
4855 case GL_RENDERBUFFER:
4856 break;
4857 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004858 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004859 }
4860
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004861 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004863 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004864 }
4865
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004866 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004868 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004871 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004872
4873 if (context)
4874 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004875 if (width > context->getMaximumRenderbufferDimension() ||
4876 height > context->getMaximumRenderbufferDimension() ||
4877 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004879 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004880 }
4881
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004882 GLuint handle = context->getRenderbufferHandle();
4883 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004886 }
4887
4888 switch (internalformat)
4889 {
4890 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004891 case GL_RGBA4:
4892 case GL_RGB5_A1:
4893 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004894 case GL_RGB8_OES:
4895 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004896 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004897 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004898 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004899 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004900 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004901 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004902 }
4903 }
4904 }
4905 catch(std::bad_alloc&)
4906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004907 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004908 }
4909}
4910
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004911void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4912{
4913 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4914}
4915
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004916void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4917{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004918 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004919
4920 try
4921 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004922 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004923
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004924 if (context)
4925 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004926 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004927 }
4928 }
4929 catch(std::bad_alloc&)
4930 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004931 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004932 }
4933}
4934
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004935void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4936{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004937 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004938
4939 try
4940 {
4941 if (condition != GL_ALL_COMPLETED_NV)
4942 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004943 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004944 }
4945
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004946 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004947
4948 if (context)
4949 {
4950 gl::Fence *fenceObject = context->getFence(fence);
4951
4952 if (fenceObject == NULL)
4953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004954 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004955 }
4956
4957 fenceObject->setFence(condition);
4958 }
4959 }
4960 catch(std::bad_alloc&)
4961 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004962 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004963 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004964}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004965
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4967{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004968 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 +00004969
4970 try
4971 {
4972 if (width < 0 || height < 0)
4973 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004974 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004975 }
4976
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004977 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004978
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004979 if (context)
4980 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004981 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004982 }
4983 }
4984 catch(std::bad_alloc&)
4985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004986 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004987 }
4988}
4989
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004990void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004991{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004992 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004993 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004994 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004995
4996 try
4997 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004998 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004999 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005000 }
5001 catch(std::bad_alloc&)
5002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005004 }
5005}
5006
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005007void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005009 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 +00005010 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005011
5012 try
5013 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005014 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005015 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005016 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005017 }
5018
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005019 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005020
5021 if (context)
5022 {
5023 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005024
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005025 if (!shaderObject)
5026 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005027 if (context->getProgram(shader))
5028 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005029 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005030 }
5031 else
5032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00005034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005035 }
5036
5037 shaderObject->setSource(count, string, length);
5038 }
5039 }
5040 catch(std::bad_alloc&)
5041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 }
5044}
5045
5046void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5047{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005048 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005049}
5050
5051void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5052{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005053 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 +00005054
5055 try
5056 {
5057 switch (face)
5058 {
5059 case GL_FRONT:
5060 case GL_BACK:
5061 case GL_FRONT_AND_BACK:
5062 break;
5063 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005064 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065 }
5066
5067 switch (func)
5068 {
5069 case GL_NEVER:
5070 case GL_ALWAYS:
5071 case GL_LESS:
5072 case GL_LEQUAL:
5073 case GL_EQUAL:
5074 case GL_GEQUAL:
5075 case GL_GREATER:
5076 case GL_NOTEQUAL:
5077 break;
5078 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005079 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005080 }
5081
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005082 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005083
5084 if (context)
5085 {
5086 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5087 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005088 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005089 }
5090
5091 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5092 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005093 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005094 }
5095 }
5096 }
5097 catch(std::bad_alloc&)
5098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005099 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005100 }
5101}
5102
5103void __stdcall glStencilMask(GLuint mask)
5104{
5105 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5106}
5107
5108void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5109{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005110 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005111
5112 try
5113 {
5114 switch (face)
5115 {
5116 case GL_FRONT:
5117 case GL_BACK:
5118 case GL_FRONT_AND_BACK:
5119 break;
5120 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005121 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005122 }
5123
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005124 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005125
5126 if (context)
5127 {
5128 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5129 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005130 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005131 }
5132
5133 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5134 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005135 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005136 }
5137 }
5138 }
5139 catch(std::bad_alloc&)
5140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005141 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005142 }
5143}
5144
5145void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5146{
5147 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5148}
5149
5150void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5151{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005152 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 +00005153 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005154
5155 try
5156 {
5157 switch (face)
5158 {
5159 case GL_FRONT:
5160 case GL_BACK:
5161 case GL_FRONT_AND_BACK:
5162 break;
5163 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005164 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005165 }
5166
5167 switch (fail)
5168 {
5169 case GL_ZERO:
5170 case GL_KEEP:
5171 case GL_REPLACE:
5172 case GL_INCR:
5173 case GL_DECR:
5174 case GL_INVERT:
5175 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005176 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177 break;
5178 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005179 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005180 }
5181
5182 switch (zfail)
5183 {
5184 case GL_ZERO:
5185 case GL_KEEP:
5186 case GL_REPLACE:
5187 case GL_INCR:
5188 case GL_DECR:
5189 case GL_INVERT:
5190 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005191 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005192 break;
5193 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005194 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005195 }
5196
5197 switch (zpass)
5198 {
5199 case GL_ZERO:
5200 case GL_KEEP:
5201 case GL_REPLACE:
5202 case GL_INCR:
5203 case GL_DECR:
5204 case GL_INVERT:
5205 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005206 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005207 break;
5208 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005209 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210 }
5211
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005212 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005213
5214 if (context)
5215 {
5216 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5217 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005218 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219 }
5220
5221 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5222 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005223 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224 }
5225 }
5226 }
5227 catch(std::bad_alloc&)
5228 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005229 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005230 }
5231}
5232
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005233GLboolean __stdcall glTestFenceNV(GLuint fence)
5234{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005235 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005236
5237 try
5238 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005239 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005240
5241 if (context)
5242 {
5243 gl::Fence *fenceObject = context->getFence(fence);
5244
5245 if (fenceObject == NULL)
5246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005248 }
5249
5250 return fenceObject->testFence();
5251 }
5252 }
5253 catch(std::bad_alloc&)
5254 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005255 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005256 }
5257
5258 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005259}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005260
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005261void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5262 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005264 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 +00005265 "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 +00005266 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005267
5268 try
5269 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005270 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005273 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005274
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005275 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005277 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005278 }
5279
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005280 // validate <type> by itself (used as secondary key below)
5281 switch (type)
5282 {
5283 case GL_UNSIGNED_BYTE:
5284 case GL_UNSIGNED_SHORT_5_6_5:
5285 case GL_UNSIGNED_SHORT_4_4_4_4:
5286 case GL_UNSIGNED_SHORT_5_5_5_1:
5287 case GL_UNSIGNED_SHORT:
5288 case GL_UNSIGNED_INT:
5289 case GL_UNSIGNED_INT_24_8_OES:
5290 case GL_HALF_FLOAT_OES:
5291 case GL_FLOAT:
5292 break;
5293 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005294 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005295 }
5296
5297 // validate <format> + <type> combinations
5298 // - invalid <format> -> sets INVALID_ENUM
5299 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005300 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005301 {
5302 case GL_ALPHA:
5303 case GL_LUMINANCE:
5304 case GL_LUMINANCE_ALPHA:
5305 switch (type)
5306 {
5307 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005308 case GL_FLOAT:
5309 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005310 break;
5311 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005312 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005313 }
5314 break;
5315 case GL_RGB:
5316 switch (type)
5317 {
5318 case GL_UNSIGNED_BYTE:
5319 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005320 case GL_FLOAT:
5321 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005322 break;
5323 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005324 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005325 }
5326 break;
5327 case GL_RGBA:
5328 switch (type)
5329 {
5330 case GL_UNSIGNED_BYTE:
5331 case GL_UNSIGNED_SHORT_4_4_4_4:
5332 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005333 case GL_FLOAT:
5334 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005335 break;
5336 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005337 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005338 }
5339 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005340 case GL_BGRA_EXT:
5341 switch (type)
5342 {
5343 case GL_UNSIGNED_BYTE:
5344 break;
5345 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005346 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005347 }
5348 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005349 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5350 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005351 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5352 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005353 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005354 case GL_DEPTH_COMPONENT:
5355 switch (type)
5356 {
5357 case GL_UNSIGNED_SHORT:
5358 case GL_UNSIGNED_INT:
5359 break;
5360 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005362 }
5363 break;
5364 case GL_DEPTH_STENCIL_OES:
5365 switch (type)
5366 {
5367 case GL_UNSIGNED_INT_24_8_OES:
5368 break;
5369 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005370 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005371 }
5372 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005373 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005374 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005375 }
5376
5377 if (border != 0)
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005380 }
5381
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005382 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005383
5384 if (context)
5385 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005386 if (level > context->getMaximumTextureLevel())
5387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005388 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005389 }
5390
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005391 switch (target)
5392 {
5393 case GL_TEXTURE_2D:
5394 if (width > (context->getMaximumTextureDimension() >> level) ||
5395 height > (context->getMaximumTextureDimension() >> level))
5396 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005397 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005398 }
5399 break;
5400 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5401 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5402 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5403 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5404 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5405 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5406 if (width != height)
5407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005408 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005409 }
5410
5411 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5412 height > (context->getMaximumCubeTextureDimension() >> level))
5413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005414 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005415 }
5416 break;
5417 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005418 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005419 }
5420
gman@chromium.org50c526d2011-08-10 05:19:44 +00005421 switch (format) {
5422 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5423 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5424 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005426 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005427 }
5428 else
5429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005430 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005431 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005432 break;
5433 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5434 if (context->supportsDXT3Textures())
5435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005436 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005437 }
5438 else
5439 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005440 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005441 }
5442 break;
5443 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5444 if (context->supportsDXT5Textures())
5445 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005446 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005447 }
5448 else
5449 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005450 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005451 }
5452 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005453 case GL_DEPTH_COMPONENT:
5454 case GL_DEPTH_STENCIL_OES:
5455 if (!context->supportsDepthTextures())
5456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005457 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005458 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005459 if (target != GL_TEXTURE_2D)
5460 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005461 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005462 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005463 // OES_depth_texture supports loading depth data and multiple levels,
5464 // but ANGLE_depth_texture does not
5465 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005467 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005468 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005469 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005470 default:
5471 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005472 }
5473
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005474 if (type == GL_FLOAT)
5475 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005476 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005477 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005478 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005479 }
5480 }
5481 else if (type == GL_HALF_FLOAT_OES)
5482 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005483 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005484 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005485 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005486 }
5487 }
5488
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005489 if (target == GL_TEXTURE_2D)
5490 {
5491 gl::Texture2D *texture = context->getTexture2D();
5492
5493 if (!texture)
5494 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005495 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005496 }
5497
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005498 if (texture->isImmutable())
5499 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005500 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005501 }
5502
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005503 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005504 }
5505 else
5506 {
5507 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5508
5509 if (!texture)
5510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005512 }
5513
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005514 if (texture->isImmutable())
5515 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005516 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005517 }
5518
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005519 switch (target)
5520 {
5521 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005522 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005523 break;
5524 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005525 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005526 break;
5527 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005528 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005529 break;
5530 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005531 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005532 break;
5533 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005534 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005535 break;
5536 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005537 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005538 break;
5539 default: UNREACHABLE();
5540 }
5541 }
5542 }
5543 }
5544 catch(std::bad_alloc&)
5545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005547 }
5548}
5549
5550void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5551{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005552 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5553
5554 try
5555 {
5556 gl::Context *context = gl::getNonLostContext();
5557
5558 if (context)
5559 {
5560 gl::Texture *texture;
5561
5562 switch (target)
5563 {
5564 case GL_TEXTURE_2D:
5565 texture = context->getTexture2D();
5566 break;
5567 case GL_TEXTURE_CUBE_MAP:
5568 texture = context->getTextureCubeMap();
5569 break;
5570 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005571 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005572 }
5573
5574 switch (pname)
5575 {
5576 case GL_TEXTURE_WRAP_S:
5577 if (!texture->setWrapS((GLenum)param))
5578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005579 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005580 }
5581 break;
5582 case GL_TEXTURE_WRAP_T:
5583 if (!texture->setWrapT((GLenum)param))
5584 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005585 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005586 }
5587 break;
5588 case GL_TEXTURE_MIN_FILTER:
5589 if (!texture->setMinFilter((GLenum)param))
5590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005591 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005592 }
5593 break;
5594 case GL_TEXTURE_MAG_FILTER:
5595 if (!texture->setMagFilter((GLenum)param))
5596 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005597 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005598 }
5599 break;
5600 case GL_TEXTURE_USAGE_ANGLE:
5601 if (!texture->setUsage((GLenum)param))
5602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005603 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005604 }
5605 break;
5606 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5607 if (!context->supportsTextureFilterAnisotropy())
5608 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005609 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005610 }
5611 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005613 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005614 }
5615 break;
5616 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005617 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005618 }
5619 }
5620 }
5621 catch(std::bad_alloc&)
5622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005623 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005624 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005625}
5626
5627void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5628{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005629 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005630}
5631
5632void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5633{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005634 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005635
5636 try
5637 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005638 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005639
5640 if (context)
5641 {
5642 gl::Texture *texture;
5643
5644 switch (target)
5645 {
5646 case GL_TEXTURE_2D:
5647 texture = context->getTexture2D();
5648 break;
5649 case GL_TEXTURE_CUBE_MAP:
5650 texture = context->getTextureCubeMap();
5651 break;
5652 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005653 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005654 }
5655
5656 switch (pname)
5657 {
5658 case GL_TEXTURE_WRAP_S:
5659 if (!texture->setWrapS((GLenum)param))
5660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005661 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005662 }
5663 break;
5664 case GL_TEXTURE_WRAP_T:
5665 if (!texture->setWrapT((GLenum)param))
5666 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005667 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005668 }
5669 break;
5670 case GL_TEXTURE_MIN_FILTER:
5671 if (!texture->setMinFilter((GLenum)param))
5672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005673 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005674 }
5675 break;
5676 case GL_TEXTURE_MAG_FILTER:
5677 if (!texture->setMagFilter((GLenum)param))
5678 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005679 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005680 }
5681 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005682 case GL_TEXTURE_USAGE_ANGLE:
5683 if (!texture->setUsage((GLenum)param))
5684 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005685 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005686 }
5687 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005688 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5689 if (!context->supportsTextureFilterAnisotropy())
5690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005691 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005692 }
5693 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5694 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005695 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005696 }
5697 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005698 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005700 }
5701 }
5702 }
5703 catch(std::bad_alloc&)
5704 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005705 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005706 }
5707}
5708
5709void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5710{
5711 glTexParameteri(target, pname, *params);
5712}
5713
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005714void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5715{
5716 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5717 target, levels, internalformat, width, height);
5718
5719 try
5720 {
5721 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005724 }
5725
5726 if (width < 1 || height < 1 || levels < 1)
5727 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005728 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005729 }
5730
5731 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005733 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005734 }
5735
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005736 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005737 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005738 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005739 }
5740
5741 GLenum format = gl::ExtractFormat(internalformat);
5742 GLenum type = gl::ExtractType(internalformat);
5743
5744 if (format == GL_NONE || type == GL_NONE)
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005747 }
5748
5749 gl::Context *context = gl::getNonLostContext();
5750
5751 if (context)
5752 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005753 switch (target)
5754 {
5755 case GL_TEXTURE_2D:
5756 if (width > context->getMaximumTextureDimension() ||
5757 height > context->getMaximumTextureDimension())
5758 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005759 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005760 }
5761 break;
5762 case GL_TEXTURE_CUBE_MAP:
5763 if (width > context->getMaximumCubeTextureDimension() ||
5764 height > context->getMaximumCubeTextureDimension())
5765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005767 }
5768 break;
5769 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005771 }
5772
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005773 if (levels != 1 && !context->supportsNonPower2Texture())
5774 {
5775 if (!gl::isPow2(width) || !gl::isPow2(height))
5776 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005777 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005778 }
5779 }
5780
daniel@transgaming.come1077362011-11-11 04:16:50 +00005781 switch (internalformat)
5782 {
5783 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5784 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5785 if (!context->supportsDXT1Textures())
5786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005787 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005788 }
5789 break;
5790 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5791 if (!context->supportsDXT3Textures())
5792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005793 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005794 }
5795 break;
5796 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5797 if (!context->supportsDXT5Textures())
5798 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005799 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005800 }
5801 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005802 case GL_RGBA32F_EXT:
5803 case GL_RGB32F_EXT:
5804 case GL_ALPHA32F_EXT:
5805 case GL_LUMINANCE32F_EXT:
5806 case GL_LUMINANCE_ALPHA32F_EXT:
5807 if (!context->supportsFloat32Textures())
5808 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005809 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005810 }
5811 break;
5812 case GL_RGBA16F_EXT:
5813 case GL_RGB16F_EXT:
5814 case GL_ALPHA16F_EXT:
5815 case GL_LUMINANCE16F_EXT:
5816 case GL_LUMINANCE_ALPHA16F_EXT:
5817 if (!context->supportsFloat16Textures())
5818 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005819 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005820 }
5821 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005822 case GL_DEPTH_COMPONENT16:
5823 case GL_DEPTH_COMPONENT32_OES:
5824 case GL_DEPTH24_STENCIL8_OES:
5825 if (!context->supportsDepthTextures())
5826 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005827 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005828 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005829 if (target != GL_TEXTURE_2D)
5830 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005831 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005832 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005833 // ANGLE_depth_texture only supports 1-level textures
5834 if (levels != 1)
5835 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005836 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005837 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005838 break;
5839 default:
5840 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005841 }
5842
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005843 if (target == GL_TEXTURE_2D)
5844 {
5845 gl::Texture2D *texture = context->getTexture2D();
5846
5847 if (!texture || texture->id() == 0)
5848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005850 }
5851
5852 if (texture->isImmutable())
5853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005855 }
5856
5857 texture->storage(levels, internalformat, width, height);
5858 }
5859 else if (target == GL_TEXTURE_CUBE_MAP)
5860 {
5861 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5862
5863 if (!texture || texture->id() == 0)
5864 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005865 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005866 }
5867
5868 if (texture->isImmutable())
5869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005870 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005871 }
5872
5873 texture->storage(levels, internalformat, width);
5874 }
5875 else UNREACHABLE();
5876 }
5877 }
5878 catch(std::bad_alloc&)
5879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005881 }
5882}
5883
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005884void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5885 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005886{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005887 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005888 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005889 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005890 target, level, xoffset, yoffset, width, height, format, type, pixels);
5891
5892 try
5893 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005894 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005896 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005897 }
5898
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005899 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005900 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005901 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005902 }
5903
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005904 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005906 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005907 }
5908
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005909 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005910 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005911 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005912 }
5913
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005915
5916 if (context)
5917 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005918 if (level > context->getMaximumTextureLevel())
5919 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005920 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005921 }
5922
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005923 if (format == GL_FLOAT)
5924 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005925 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005927 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005928 }
5929 }
5930 else if (format == GL_HALF_FLOAT_OES)
5931 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005932 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005933 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005934 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005935 }
5936 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005937 else if (gl::IsDepthTexture(format))
5938 {
5939 if (!context->supportsDepthTextures())
5940 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005941 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005942 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005943 if (target != GL_TEXTURE_2D)
5944 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005945 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005946 }
5947 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005948 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005949 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005950
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005951 if (width == 0 || height == 0 || pixels == NULL)
5952 {
5953 return;
5954 }
5955
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005956 if (target == GL_TEXTURE_2D)
5957 {
5958 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005959 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005960 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005961 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005962 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005963 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005964 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005965 {
5966 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005967 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005968 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005969 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005970 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005971 }
5972 else
5973 {
5974 UNREACHABLE();
5975 }
5976 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005977 }
5978 catch(std::bad_alloc&)
5979 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005980 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005981 }
5982}
5983
5984void __stdcall glUniform1f(GLint location, GLfloat x)
5985{
5986 glUniform1fv(location, 1, &x);
5987}
5988
5989void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5990{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005991 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992
5993 try
5994 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005995 if (count < 0)
5996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005997 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005998 }
5999
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006000 if (location == -1)
6001 {
6002 return;
6003 }
6004
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006005 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006006
6007 if (context)
6008 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006009 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006010 if (!programBinary)
6011 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006012 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006013 }
6014
6015 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006016 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006017 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006018 }
6019 }
6020 }
6021 catch(std::bad_alloc&)
6022 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006023 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006024 }
6025}
6026
6027void __stdcall glUniform1i(GLint location, GLint x)
6028{
6029 glUniform1iv(location, 1, &x);
6030}
6031
6032void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
6033{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006034 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035
6036 try
6037 {
6038 if (count < 0)
6039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006040 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006041 }
6042
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006043 if (location == -1)
6044 {
6045 return;
6046 }
6047
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006048 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006049
6050 if (context)
6051 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006052 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006053 if (!programBinary)
6054 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006055 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006056 }
6057
6058 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006060 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006061 }
6062 }
6063 }
6064 catch(std::bad_alloc&)
6065 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006066 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006067 }
6068}
6069
6070void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6071{
6072 GLfloat xy[2] = {x, y};
6073
6074 glUniform2fv(location, 1, (GLfloat*)&xy);
6075}
6076
6077void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6078{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006079 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006080
6081 try
6082 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006083 if (count < 0)
6084 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006085 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006086 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006087
6088 if (location == -1)
6089 {
6090 return;
6091 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006092
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006093 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006094
6095 if (context)
6096 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006097 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006098 if (!programBinary)
6099 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006100 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006101 }
6102
6103 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006104 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006105 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 }
6107 }
6108 }
6109 catch(std::bad_alloc&)
6110 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006111 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006112 }
6113}
6114
6115void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6116{
6117 GLint xy[4] = {x, y};
6118
6119 glUniform2iv(location, 1, (GLint*)&xy);
6120}
6121
6122void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6123{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006124 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006125
6126 try
6127 {
6128 if (count < 0)
6129 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006130 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006131 }
6132
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006133 if (location == -1)
6134 {
6135 return;
6136 }
6137
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006138 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006139
6140 if (context)
6141 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006142 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006143 if (!programBinary)
6144 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006145 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006146 }
6147
6148 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006149 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006150 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006151 }
6152 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006153 }
6154 catch(std::bad_alloc&)
6155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006156 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006157 }
6158}
6159
6160void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6161{
6162 GLfloat xyz[3] = {x, y, z};
6163
6164 glUniform3fv(location, 1, (GLfloat*)&xyz);
6165}
6166
6167void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6168{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006169 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006170
6171 try
6172 {
6173 if (count < 0)
6174 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006175 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006176 }
6177
6178 if (location == -1)
6179 {
6180 return;
6181 }
6182
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006183 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006184
6185 if (context)
6186 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006187 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006188 if (!programBinary)
6189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006190 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006191 }
6192
6193 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006195 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006196 }
6197 }
6198 }
6199 catch(std::bad_alloc&)
6200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006201 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006202 }
6203}
6204
6205void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6206{
6207 GLint xyz[3] = {x, y, z};
6208
6209 glUniform3iv(location, 1, (GLint*)&xyz);
6210}
6211
6212void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6213{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006214 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006215
6216 try
6217 {
6218 if (count < 0)
6219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006220 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006221 }
6222
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006223 if (location == -1)
6224 {
6225 return;
6226 }
6227
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006228 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006229
6230 if (context)
6231 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006232 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006233 if (!programBinary)
6234 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006235 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006236 }
6237
6238 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006239 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006240 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006241 }
6242 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006243 }
6244 catch(std::bad_alloc&)
6245 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006246 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006247 }
6248}
6249
6250void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6251{
6252 GLfloat xyzw[4] = {x, y, z, w};
6253
6254 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6255}
6256
6257void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6258{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006259 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006260
6261 try
6262 {
6263 if (count < 0)
6264 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006265 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006266 }
6267
6268 if (location == -1)
6269 {
6270 return;
6271 }
6272
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006273 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006274
6275 if (context)
6276 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006277 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006278 if (!programBinary)
6279 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006280 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006281 }
6282
6283 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006285 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006286 }
6287 }
6288 }
6289 catch(std::bad_alloc&)
6290 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006291 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006292 }
6293}
6294
6295void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6296{
6297 GLint xyzw[4] = {x, y, z, w};
6298
6299 glUniform4iv(location, 1, (GLint*)&xyzw);
6300}
6301
6302void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6303{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006304 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006305
6306 try
6307 {
6308 if (count < 0)
6309 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006310 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006311 }
6312
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006313 if (location == -1)
6314 {
6315 return;
6316 }
6317
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006318 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006319
6320 if (context)
6321 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006322 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006323 if (!programBinary)
6324 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006325 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006326 }
6327
6328 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006330 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006331 }
6332 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006333 }
6334 catch(std::bad_alloc&)
6335 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006336 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006337 }
6338}
6339
6340void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6341{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006342 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006343 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006344
6345 try
6346 {
6347 if (count < 0 || transpose != GL_FALSE)
6348 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006349 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006350 }
6351
6352 if (location == -1)
6353 {
6354 return;
6355 }
6356
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006357 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006358
6359 if (context)
6360 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006361 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006362 if (!programBinary)
6363 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006364 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006365 }
6366
6367 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006369 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006370 }
6371 }
6372 }
6373 catch(std::bad_alloc&)
6374 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006375 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006376 }
6377}
6378
6379void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6380{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006381 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006382 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006383
6384 try
6385 {
6386 if (count < 0 || transpose != GL_FALSE)
6387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006388 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006389 }
6390
6391 if (location == -1)
6392 {
6393 return;
6394 }
6395
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006396 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006397
6398 if (context)
6399 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006400 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006401 if (!programBinary)
6402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006403 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006404 }
6405
6406 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006407 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006408 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006409 }
6410 }
6411 }
6412 catch(std::bad_alloc&)
6413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006414 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006415 }
6416}
6417
6418void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6419{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006420 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006421 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006422
6423 try
6424 {
6425 if (count < 0 || transpose != GL_FALSE)
6426 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006427 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006428 }
6429
6430 if (location == -1)
6431 {
6432 return;
6433 }
6434
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006436
6437 if (context)
6438 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006439 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006440 if (!programBinary)
6441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006442 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006443 }
6444
6445 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006446 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006447 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006448 }
6449 }
6450 }
6451 catch(std::bad_alloc&)
6452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006453 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006454 }
6455}
6456
6457void __stdcall glUseProgram(GLuint program)
6458{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006459 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006460
6461 try
6462 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006463 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006464
6465 if (context)
6466 {
6467 gl::Program *programObject = context->getProgram(program);
6468
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006469 if (!programObject && program != 0)
6470 {
6471 if (context->getShader(program))
6472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006473 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006474 }
6475 else
6476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006477 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006478 }
6479 }
6480
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006481 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006483 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484 }
6485
6486 context->useProgram(program);
6487 }
6488 }
6489 catch(std::bad_alloc&)
6490 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006491 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006492 }
6493}
6494
6495void __stdcall glValidateProgram(GLuint program)
6496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006497 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006498
6499 try
6500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006502
6503 if (context)
6504 {
6505 gl::Program *programObject = context->getProgram(program);
6506
6507 if (!programObject)
6508 {
6509 if (context->getShader(program))
6510 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006511 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006512 }
6513 else
6514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006515 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006516 }
6517 }
6518
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006519 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006520 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006521 }
6522 catch(std::bad_alloc&)
6523 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006524 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006525 }
6526}
6527
6528void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6529{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006530 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006531
6532 try
6533 {
6534 if (index >= gl::MAX_VERTEX_ATTRIBS)
6535 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006536 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006537 }
6538
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006539 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006540
6541 if (context)
6542 {
6543 GLfloat vals[4] = { x, 0, 0, 1 };
6544 context->setVertexAttrib(index, vals);
6545 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006546 }
6547 catch(std::bad_alloc&)
6548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006549 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006550 }
6551}
6552
6553void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6554{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006555 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006556
6557 try
6558 {
6559 if (index >= gl::MAX_VERTEX_ATTRIBS)
6560 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006561 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006562 }
6563
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006564 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006565
6566 if (context)
6567 {
6568 GLfloat vals[4] = { values[0], 0, 0, 1 };
6569 context->setVertexAttrib(index, vals);
6570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006571 }
6572 catch(std::bad_alloc&)
6573 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006574 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006575 }
6576}
6577
6578void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6579{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006580 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006581
6582 try
6583 {
6584 if (index >= gl::MAX_VERTEX_ATTRIBS)
6585 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006586 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006587 }
6588
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006589 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006590
6591 if (context)
6592 {
6593 GLfloat vals[4] = { x, y, 0, 1 };
6594 context->setVertexAttrib(index, vals);
6595 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006596 }
6597 catch(std::bad_alloc&)
6598 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006599 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006600 }
6601}
6602
6603void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6604{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006605 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006606
6607 try
6608 {
6609 if (index >= gl::MAX_VERTEX_ATTRIBS)
6610 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006611 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006612 }
6613
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006614 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006615
6616 if (context)
6617 {
6618 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6619 context->setVertexAttrib(index, vals);
6620 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006621 }
6622 catch(std::bad_alloc&)
6623 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006624 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006625 }
6626}
6627
6628void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6629{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006630 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 +00006631
6632 try
6633 {
6634 if (index >= gl::MAX_VERTEX_ATTRIBS)
6635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006636 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006637 }
6638
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006639 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006640
6641 if (context)
6642 {
6643 GLfloat vals[4] = { x, y, z, 1 };
6644 context->setVertexAttrib(index, vals);
6645 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006646 }
6647 catch(std::bad_alloc&)
6648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006649 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006650 }
6651}
6652
6653void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6654{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006655 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006656
6657 try
6658 {
6659 if (index >= gl::MAX_VERTEX_ATTRIBS)
6660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006662 }
6663
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006665
6666 if (context)
6667 {
6668 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6669 context->setVertexAttrib(index, vals);
6670 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006671 }
6672 catch(std::bad_alloc&)
6673 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006674 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006675 }
6676}
6677
6678void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6679{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006680 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 +00006681
6682 try
6683 {
6684 if (index >= gl::MAX_VERTEX_ATTRIBS)
6685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006687 }
6688
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006689 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006690
6691 if (context)
6692 {
6693 GLfloat vals[4] = { x, y, z, w };
6694 context->setVertexAttrib(index, vals);
6695 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006696 }
6697 catch(std::bad_alloc&)
6698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006699 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006700 }
6701}
6702
6703void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6704{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006705 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006706
6707 try
6708 {
6709 if (index >= gl::MAX_VERTEX_ATTRIBS)
6710 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006711 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006712 }
6713
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006714 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006715
6716 if (context)
6717 {
6718 context->setVertexAttrib(index, values);
6719 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006720 }
6721 catch(std::bad_alloc&)
6722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006723 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006724 }
6725}
6726
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006727void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6728{
6729 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6730
6731 try
6732 {
6733 if (index >= gl::MAX_VERTEX_ATTRIBS)
6734 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006735 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006736 }
6737
6738 gl::Context *context = gl::getNonLostContext();
6739
6740 if (context)
6741 {
6742 context->setVertexAttribDivisor(index, divisor);
6743 }
6744 }
6745 catch(std::bad_alloc&)
6746 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006747 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006748 }
6749}
6750
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006751void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006752{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006753 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006754 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006755 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006756
6757 try
6758 {
6759 if (index >= gl::MAX_VERTEX_ATTRIBS)
6760 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006761 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006762 }
6763
6764 if (size < 1 || size > 4)
6765 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006766 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006767 }
6768
6769 switch (type)
6770 {
6771 case GL_BYTE:
6772 case GL_UNSIGNED_BYTE:
6773 case GL_SHORT:
6774 case GL_UNSIGNED_SHORT:
6775 case GL_FIXED:
6776 case GL_FLOAT:
6777 break;
6778 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006779 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006780 }
6781
6782 if (stride < 0)
6783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006784 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006785 }
6786
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006787 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006788
6789 if (context)
6790 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006791 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006792 }
6793 }
6794 catch(std::bad_alloc&)
6795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006797 }
6798}
6799
6800void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006802 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 +00006803
6804 try
6805 {
6806 if (width < 0 || height < 0)
6807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006809 }
6810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006812
6813 if (context)
6814 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006815 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006816 }
6817 }
6818 catch(std::bad_alloc&)
6819 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006820 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006821 }
6822}
6823
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006824void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6825 GLbitfield mask, GLenum filter)
6826{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006827 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006828 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6829 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6830 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6831
6832 try
6833 {
6834 switch (filter)
6835 {
6836 case GL_NEAREST:
6837 break;
6838 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006840 }
6841
6842 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006844 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006845 }
6846
6847 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6848 {
6849 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006850 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006851 }
6852
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006853 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006854
6855 if (context)
6856 {
6857 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6858 {
6859 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006860 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006861 }
6862
6863 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6864 }
6865 }
6866 catch(std::bad_alloc&)
6867 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006868 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006869 }
6870}
6871
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006872void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6873 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006875 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006876 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006877 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006878 target, level, internalformat, width, height, depth, border, format, type, pixels);
6879
6880 try
6881 {
6882 UNIMPLEMENTED(); // FIXME
6883 }
6884 catch(std::bad_alloc&)
6885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006886 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006887 }
6888}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006889
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006890void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6891 GLenum *binaryFormat, void *binary)
6892{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006893 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 +00006894 program, bufSize, length, binaryFormat, binary);
6895
6896 try
6897 {
6898 gl::Context *context = gl::getNonLostContext();
6899
6900 if (context)
6901 {
6902 gl::Program *programObject = context->getProgram(program);
6903
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006904 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006905 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006906 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006907 }
6908
6909 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6910
6911 if (!programBinary)
6912 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006913 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006914 }
6915
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006916 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006917 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006918 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006919 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006920
6921 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006922 }
6923 }
6924 catch(std::bad_alloc&)
6925 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006926 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006927 }
6928}
6929
6930void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6931 const void *binary, GLint length)
6932{
6933 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6934 program, binaryFormat, binary, length);
6935
6936 try
6937 {
6938 gl::Context *context = gl::getNonLostContext();
6939
6940 if (context)
6941 {
6942 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6943 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006944 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006945 }
6946
6947 gl::Program *programObject = context->getProgram(program);
6948
6949 if (!programObject)
6950 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006951 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006952 }
6953
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006954 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006955 }
6956 }
6957 catch(std::bad_alloc&)
6958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006959 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006960 }
6961}
6962
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006963__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6964{
6965 struct Extension
6966 {
6967 const char *name;
6968 __eglMustCastToProperFunctionPointerType address;
6969 };
6970
6971 static const Extension glExtensions[] =
6972 {
6973 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006974 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006975 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006976 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6977 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6978 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6979 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6980 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6981 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6982 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006983 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006984 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006985 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6986 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6987 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6988 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006989 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6990 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6991 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6992 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6993 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6994 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6995 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006996 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6997 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6998 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006999 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
7000 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00007001
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00007002 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00007003 {
7004 if (strcmp(procname, glExtensions[ext].name) == 0)
7005 {
7006 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
7007 }
7008 }
7009
7010 return NULL;
7011}
7012
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00007013// Non-public functions used by EGL
7014
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00007015bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00007016{
7017 EVENT("(egl::Surface* surface = 0x%0.8p)",
7018 surface);
7019
7020 try
7021 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00007022 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00007023
7024 if (context)
7025 {
7026 gl::Texture2D *textureObject = context->getTexture2D();
7027
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00007028 if (textureObject->isImmutable())
7029 {
7030 return false;
7031 }
7032
jbauman@chromium.orgae345802011-03-30 22:04:25 +00007033 if (textureObject)
7034 {
7035 textureObject->bindTexImage(surface);
7036 }
7037 }
7038 }
7039 catch(std::bad_alloc&)
7040 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00007041 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00007042 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00007043
7044 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00007045}
7046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007047}