blob: cf9e7b4eee14da8d908e81c6571295c5468b313d [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
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001320 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1321 {
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
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001325 gl::Renderbuffer *source = framebuffer->getColorbuffer();
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
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001496 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1497 {
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
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001501 gl::Renderbuffer *source = framebuffer->getColorbuffer();
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
2401 switch (attachment)
2402 {
2403 case GL_COLOR_ATTACHMENT0:
2404 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2405 break;
2406 case GL_DEPTH_ATTACHMENT:
2407 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2408 break;
2409 case GL_STENCIL_ATTACHMENT:
2410 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2411 break;
2412 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002413 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002414 }
2415 }
2416 }
2417 catch(std::bad_alloc&)
2418 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002419 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002420 }
2421}
2422
2423void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2424{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002425 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002426 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427
2428 try
2429 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002430 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002432 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433 }
2434
2435 switch (attachment)
2436 {
2437 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002438 case GL_DEPTH_ATTACHMENT:
2439 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 break;
2441 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002442 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443 }
2444
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002445 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446
2447 if (context)
2448 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002449 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002450 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002451 textarget = GL_NONE;
2452 }
2453 else
2454 {
2455 gl::Texture *tex = context->getTexture(texture);
2456
2457 if (tex == NULL)
2458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002460 }
2461
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002462 switch (textarget)
2463 {
2464 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002465 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002466 if (tex->getTarget() != GL_TEXTURE_2D)
2467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002468 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002469 }
2470 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002471 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002472 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002473 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002474 }
2475 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002476 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002477
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002478 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002479 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002480 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002481 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002482 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002483 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002484 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002485 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2486 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002487 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002488 }
2489 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002490 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002492 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002493 }
2494 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002495 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002496
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002497 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002498 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002499 }
2500
2501 if (level != 0)
2502 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002503 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002504 }
2505 }
2506
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002507 gl::Framebuffer *framebuffer = NULL;
2508 GLuint framebufferHandle = 0;
2509 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2510 {
2511 framebuffer = context->getReadFramebuffer();
2512 framebufferHandle = context->getReadFramebufferHandle();
2513 }
2514 else
2515 {
2516 framebuffer = context->getDrawFramebuffer();
2517 framebufferHandle = context->getDrawFramebufferHandle();
2518 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002519
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002520 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002522 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002523 }
2524
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002525 switch (attachment)
2526 {
2527 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2528 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2529 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2530 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002531 }
2532 }
2533 catch(std::bad_alloc&)
2534 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002535 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536 }
2537}
2538
2539void __stdcall glFrontFace(GLenum mode)
2540{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002541 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002542
2543 try
2544 {
2545 switch (mode)
2546 {
2547 case GL_CW:
2548 case GL_CCW:
2549 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002550 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002551
2552 if (context)
2553 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002554 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555 }
2556 }
2557 break;
2558 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002559 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002560 }
2561 }
2562 catch(std::bad_alloc&)
2563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002564 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002565 }
2566}
2567
2568void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2569{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002570 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571
2572 try
2573 {
2574 if (n < 0)
2575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002576 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577 }
2578
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002579 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002580
2581 if (context)
2582 {
2583 for (int i = 0; i < n; i++)
2584 {
2585 buffers[i] = context->createBuffer();
2586 }
2587 }
2588 }
2589 catch(std::bad_alloc&)
2590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002591 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002592 }
2593}
2594
2595void __stdcall glGenerateMipmap(GLenum target)
2596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002597 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002598
2599 try
2600 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002601 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002602
2603 if (context)
2604 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002605 switch (target)
2606 {
2607 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002608 {
2609 gl::Texture2D *tex2d = context->getTexture2D();
2610
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002611 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002614 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002615 if (tex2d->isDepth(0))
2616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002617 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002618 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002619
2620 tex2d->generateMipmaps();
2621 break;
2622 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002623
2624 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002625 {
2626 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2627
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002628 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002630 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002631 }
2632
2633 texcube->generateMipmaps();
2634 break;
2635 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002636
2637 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002638 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002639 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002640 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002641 }
2642 catch(std::bad_alloc&)
2643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002644 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002645 }
2646}
2647
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002648void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2649{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002650 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002651
2652 try
2653 {
2654 if (n < 0)
2655 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002656 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002657 }
2658
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002659 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002660
2661 if (context)
2662 {
2663 for (int i = 0; i < n; i++)
2664 {
2665 fences[i] = context->createFence();
2666 }
2667 }
2668 }
2669 catch(std::bad_alloc&)
2670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002671 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002672 }
2673}
2674
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002675void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2676{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002677 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002678
2679 try
2680 {
2681 if (n < 0)
2682 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002683 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002684 }
2685
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002686 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002687
2688 if (context)
2689 {
2690 for (int i = 0; i < n; i++)
2691 {
2692 framebuffers[i] = context->createFramebuffer();
2693 }
2694 }
2695 }
2696 catch(std::bad_alloc&)
2697 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002698 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002699 }
2700}
2701
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002702void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2703{
2704 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2705
2706 try
2707 {
2708 if (n < 0)
2709 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002710 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002711 }
2712
2713 gl::Context *context = gl::getNonLostContext();
2714
2715 if (context)
2716 {
2717 for (int i = 0; i < n; i++)
2718 {
2719 ids[i] = context->createQuery();
2720 }
2721 }
2722 }
2723 catch(std::bad_alloc&)
2724 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002725 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002726 }
2727}
2728
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002729void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2730{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002731 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002732
2733 try
2734 {
2735 if (n < 0)
2736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002737 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002738 }
2739
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002740 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002741
2742 if (context)
2743 {
2744 for (int i = 0; i < n; i++)
2745 {
2746 renderbuffers[i] = context->createRenderbuffer();
2747 }
2748 }
2749 }
2750 catch(std::bad_alloc&)
2751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002752 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002753 }
2754}
2755
2756void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2757{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002758 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002759
2760 try
2761 {
2762 if (n < 0)
2763 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002764 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002765 }
2766
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002767 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002768
2769 if (context)
2770 {
2771 for (int i = 0; i < n; i++)
2772 {
2773 textures[i] = context->createTexture();
2774 }
2775 }
2776 }
2777 catch(std::bad_alloc&)
2778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002779 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002780 }
2781}
2782
daniel@transgaming.com85423182010-04-22 13:35:27 +00002783void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002784{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002785 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002786 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002787 program, index, bufsize, length, size, type, name);
2788
2789 try
2790 {
2791 if (bufsize < 0)
2792 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002793 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002794 }
2795
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002796 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002797
2798 if (context)
2799 {
2800 gl::Program *programObject = context->getProgram(program);
2801
2802 if (!programObject)
2803 {
2804 if (context->getShader(program))
2805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002806 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002807 }
2808 else
2809 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002810 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002811 }
2812 }
2813
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002814 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002816 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002817 }
2818
2819 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2820 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 }
2822 catch(std::bad_alloc&)
2823 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002824 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002825 }
2826}
2827
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002828void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002830 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002831 "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 +00002832 program, index, bufsize, length, size, type, name);
2833
2834 try
2835 {
2836 if (bufsize < 0)
2837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002838 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002839 }
2840
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002841 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002842
2843 if (context)
2844 {
2845 gl::Program *programObject = context->getProgram(program);
2846
2847 if (!programObject)
2848 {
2849 if (context->getShader(program))
2850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002851 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002852 }
2853 else
2854 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002855 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002856 }
2857 }
2858
2859 if (index >= (GLuint)programObject->getActiveUniformCount())
2860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002861 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002862 }
2863
2864 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2865 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002866 }
2867 catch(std::bad_alloc&)
2868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002869 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002870 }
2871}
2872
2873void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2874{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002875 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 +00002876 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002877
2878 try
2879 {
2880 if (maxcount < 0)
2881 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002882 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002883 }
2884
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002885 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002886
2887 if (context)
2888 {
2889 gl::Program *programObject = context->getProgram(program);
2890
2891 if (!programObject)
2892 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002893 if (context->getShader(program))
2894 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002895 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002896 }
2897 else
2898 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002899 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002900 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002901 }
2902
2903 return programObject->getAttachedShaders(maxcount, count, shaders);
2904 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002905 }
2906 catch(std::bad_alloc&)
2907 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002908 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002909 }
2910}
2911
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002912int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002913{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002914 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002915
2916 try
2917 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002918 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002919
2920 if (context)
2921 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002922
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002923 gl::Program *programObject = context->getProgram(program);
2924
2925 if (!programObject)
2926 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002927 if (context->getShader(program))
2928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002929 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002930 }
2931 else
2932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002933 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002934 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002935 }
2936
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002937 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002938 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002940 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002941 }
2942
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002943 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 }
2945 }
2946 catch(std::bad_alloc&)
2947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002948 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002949 }
2950
2951 return -1;
2952}
2953
2954void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2955{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002956 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957
2958 try
2959 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002960 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002961
2962 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002963 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002964 if (!(context->getBooleanv(pname, params)))
2965 {
2966 GLenum nativeType;
2967 unsigned int numParams = 0;
2968 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002969 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002970
2971 if (numParams == 0)
2972 return; // it is known that the pname is valid, but there are no parameters to return
2973
2974 if (nativeType == GL_FLOAT)
2975 {
2976 GLfloat *floatParams = NULL;
2977 floatParams = new GLfloat[numParams];
2978
2979 context->getFloatv(pname, floatParams);
2980
2981 for (unsigned int i = 0; i < numParams; ++i)
2982 {
2983 if (floatParams[i] == 0.0f)
2984 params[i] = GL_FALSE;
2985 else
2986 params[i] = GL_TRUE;
2987 }
2988
2989 delete [] floatParams;
2990 }
2991 else if (nativeType == GL_INT)
2992 {
2993 GLint *intParams = NULL;
2994 intParams = new GLint[numParams];
2995
2996 context->getIntegerv(pname, intParams);
2997
2998 for (unsigned int i = 0; i < numParams; ++i)
2999 {
3000 if (intParams[i] == 0)
3001 params[i] = GL_FALSE;
3002 else
3003 params[i] = GL_TRUE;
3004 }
3005
3006 delete [] intParams;
3007 }
3008 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003009 }
3010 }
3011 catch(std::bad_alloc&)
3012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003013 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003014 }
3015}
3016
3017void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3018{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003019 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 +00003020
3021 try
3022 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003023 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003024
3025 if (context)
3026 {
3027 gl::Buffer *buffer;
3028
3029 switch (target)
3030 {
3031 case GL_ARRAY_BUFFER:
3032 buffer = context->getArrayBuffer();
3033 break;
3034 case GL_ELEMENT_ARRAY_BUFFER:
3035 buffer = context->getElementArrayBuffer();
3036 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003037 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003038 }
3039
3040 if (!buffer)
3041 {
3042 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003043 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003044 }
3045
3046 switch (pname)
3047 {
3048 case GL_BUFFER_USAGE:
3049 *params = buffer->usage();
3050 break;
3051 case GL_BUFFER_SIZE:
3052 *params = buffer->size();
3053 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003054 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003055 }
3056 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057 }
3058 catch(std::bad_alloc&)
3059 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003060 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003061 }
3062}
3063
3064GLenum __stdcall glGetError(void)
3065{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003066 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003067
3068 gl::Context *context = gl::getContext();
3069
3070 if (context)
3071 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003072 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003073 }
3074
3075 return GL_NO_ERROR;
3076}
3077
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003078void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3079{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003080 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003081
3082 try
3083 {
3084
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003085 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003086
3087 if (context)
3088 {
3089 gl::Fence *fenceObject = context->getFence(fence);
3090
3091 if (fenceObject == NULL)
3092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003093 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003094 }
3095
3096 fenceObject->getFenceiv(pname, params);
3097 }
3098 }
3099 catch(std::bad_alloc&)
3100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003101 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003102 }
3103}
3104
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003105void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3106{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003107 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003108
3109 try
3110 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003111 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003112
3113 if (context)
3114 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003115 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003116 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003117 GLenum nativeType;
3118 unsigned int numParams = 0;
3119 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003120 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003121
3122 if (numParams == 0)
3123 return; // it is known that the pname is valid, but that there are no parameters to return.
3124
3125 if (nativeType == GL_BOOL)
3126 {
3127 GLboolean *boolParams = NULL;
3128 boolParams = new GLboolean[numParams];
3129
3130 context->getBooleanv(pname, boolParams);
3131
3132 for (unsigned int i = 0; i < numParams; ++i)
3133 {
3134 if (boolParams[i] == GL_FALSE)
3135 params[i] = 0.0f;
3136 else
3137 params[i] = 1.0f;
3138 }
3139
3140 delete [] boolParams;
3141 }
3142 else if (nativeType == GL_INT)
3143 {
3144 GLint *intParams = NULL;
3145 intParams = new GLint[numParams];
3146
3147 context->getIntegerv(pname, intParams);
3148
3149 for (unsigned int i = 0; i < numParams; ++i)
3150 {
3151 params[i] = (GLfloat)intParams[i];
3152 }
3153
3154 delete [] intParams;
3155 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003156 }
3157 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003158 }
3159 catch(std::bad_alloc&)
3160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003162 }
3163}
3164
3165void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003167 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 +00003168 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003169
3170 try
3171 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003172 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003173
3174 if (context)
3175 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003176 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003178 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003179 }
3180
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003181 gl::Framebuffer *framebuffer = NULL;
3182 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3183 {
3184 if(context->getReadFramebufferHandle() == 0)
3185 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003186 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003187 }
3188
3189 framebuffer = context->getReadFramebuffer();
3190 }
3191 else
3192 {
3193 if (context->getDrawFramebufferHandle() == 0)
3194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003195 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003196 }
3197
3198 framebuffer = context->getDrawFramebuffer();
3199 }
3200
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003201 GLenum attachmentType;
3202 GLuint attachmentHandle;
3203 switch (attachment)
3204 {
3205 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003206 attachmentType = framebuffer->getColorbufferType();
3207 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003208 break;
3209 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003210 attachmentType = framebuffer->getDepthbufferType();
3211 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003212 break;
3213 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003214 attachmentType = framebuffer->getStencilbufferType();
3215 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003216 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003217 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003218 }
3219
3220 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003221 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003222 {
3223 attachmentObjectType = attachmentType;
3224 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003225 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003226 {
3227 attachmentObjectType = GL_TEXTURE;
3228 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003229 else
3230 {
3231 UNREACHABLE();
3232 return;
3233 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003234
3235 switch (pname)
3236 {
3237 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3238 *params = attachmentObjectType;
3239 break;
3240 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3241 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3242 {
3243 *params = attachmentHandle;
3244 }
3245 else
3246 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003248 }
3249 break;
3250 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3251 if (attachmentObjectType == GL_TEXTURE)
3252 {
3253 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
3254 }
3255 else
3256 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003257 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003258 }
3259 break;
3260 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
3261 if (attachmentObjectType == GL_TEXTURE)
3262 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003263 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003264 {
3265 *params = attachmentType;
3266 }
3267 else
3268 {
3269 *params = 0;
3270 }
3271 }
3272 else
3273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003275 }
3276 break;
3277 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003278 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003279 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003280 }
3281 }
3282 catch(std::bad_alloc&)
3283 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003284 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003285 }
3286}
3287
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003288GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3289{
3290 EVENT("()");
3291
3292 try
3293 {
3294 gl::Context *context = gl::getContext();
3295
3296 if (context)
3297 {
3298 return context->getResetStatus();
3299 }
3300
3301 return GL_NO_ERROR;
3302 }
3303 catch(std::bad_alloc&)
3304 {
3305 return GL_OUT_OF_MEMORY;
3306 }
3307}
3308
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003309void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3310{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003311 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003312
3313 try
3314 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003315 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003316
3317 if (context)
3318 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003319 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003320 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003321 GLenum nativeType;
3322 unsigned int numParams = 0;
3323 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003324 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003326 if (numParams == 0)
3327 return; // it is known that pname is valid, but there are no parameters to return
3328
3329 if (nativeType == GL_BOOL)
3330 {
3331 GLboolean *boolParams = NULL;
3332 boolParams = new GLboolean[numParams];
3333
3334 context->getBooleanv(pname, boolParams);
3335
3336 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003337 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003338 if (boolParams[i] == GL_FALSE)
3339 params[i] = 0;
3340 else
3341 params[i] = 1;
3342 }
3343
3344 delete [] boolParams;
3345 }
3346 else if (nativeType == GL_FLOAT)
3347 {
3348 GLfloat *floatParams = NULL;
3349 floatParams = new GLfloat[numParams];
3350
3351 context->getFloatv(pname, floatParams);
3352
3353 for (unsigned int i = 0; i < numParams; ++i)
3354 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003355 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 +00003356 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003357 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003358 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003359 else
3360 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 +00003361 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003362
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003363 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003364 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003365 }
3366 }
3367 }
3368 catch(std::bad_alloc&)
3369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003370 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371 }
3372}
3373
3374void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3375{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003376 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003377
3378 try
3379 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003380 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003381
3382 if (context)
3383 {
3384 gl::Program *programObject = context->getProgram(program);
3385
3386 if (!programObject)
3387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003388 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003389 }
3390
3391 switch (pname)
3392 {
3393 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003394 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003395 return;
3396 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003397 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003398 return;
3399 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003400 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003401 return;
3402 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003403 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003404 return;
3405 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003406 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003407 return;
3408 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003409 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003410 return;
3411 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003412 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003413 return;
3414 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003415 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416 return;
3417 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003418 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003419 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003420 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003421 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003422 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003423 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003424 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003425 }
3426 }
3427 }
3428 catch(std::bad_alloc&)
3429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003430 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003431 }
3432}
3433
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003434void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003435{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003436 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 +00003437 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003438
3439 try
3440 {
3441 if (bufsize < 0)
3442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003443 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003444 }
3445
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003446 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003447
3448 if (context)
3449 {
3450 gl::Program *programObject = context->getProgram(program);
3451
3452 if (!programObject)
3453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003454 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003455 }
3456
3457 programObject->getInfoLog(bufsize, length, infolog);
3458 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003459 }
3460 catch(std::bad_alloc&)
3461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003462 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003463 }
3464}
3465
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003466void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3467{
3468 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3469
3470 try
3471 {
3472 switch (pname)
3473 {
3474 case GL_CURRENT_QUERY_EXT:
3475 break;
3476 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003477 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003478 }
3479
3480 gl::Context *context = gl::getNonLostContext();
3481
3482 if (context)
3483 {
3484 params[0] = context->getActiveQuery(target);
3485 }
3486 }
3487 catch(std::bad_alloc&)
3488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003490 }
3491}
3492
3493void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3494{
3495 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3496
3497 try
3498 {
3499 switch (pname)
3500 {
3501 case GL_QUERY_RESULT_EXT:
3502 case GL_QUERY_RESULT_AVAILABLE_EXT:
3503 break;
3504 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003505 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003506 }
3507 gl::Context *context = gl::getNonLostContext();
3508
3509 if (context)
3510 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003511 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3512
3513 if (!queryObject)
3514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003515 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003516 }
3517
3518 if (context->getActiveQuery(queryObject->getType()) == id)
3519 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003520 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003521 }
3522
3523 switch(pname)
3524 {
3525 case GL_QUERY_RESULT_EXT:
3526 params[0] = queryObject->getResult();
3527 break;
3528 case GL_QUERY_RESULT_AVAILABLE_EXT:
3529 params[0] = queryObject->isResultAvailable();
3530 break;
3531 default:
3532 ASSERT(false);
3533 }
3534 }
3535 }
3536 catch(std::bad_alloc&)
3537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003538 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003539 }
3540}
3541
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003542void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3543{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003544 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 +00003545
3546 try
3547 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003548 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003549
3550 if (context)
3551 {
3552 if (target != GL_RENDERBUFFER)
3553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003554 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003555 }
3556
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003557 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003558 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003559 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003560 }
3561
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003562 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003563
3564 switch (pname)
3565 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003566 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3567 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3568 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3569 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3570 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3571 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3572 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3573 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3574 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003575 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003576 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003577 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003578 *params = renderbuffer->getSamples();
3579 }
3580 else
3581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003582 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003583 }
3584 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003585 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003586 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003587 }
3588 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003589 }
3590 catch(std::bad_alloc&)
3591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593 }
3594}
3595
3596void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003598 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599
3600 try
3601 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003602 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003603
3604 if (context)
3605 {
3606 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003607
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003608 if (!shaderObject)
3609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003610 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003611 }
3612
3613 switch (pname)
3614 {
3615 case GL_SHADER_TYPE:
3616 *params = shaderObject->getType();
3617 return;
3618 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003619 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003620 return;
3621 case GL_COMPILE_STATUS:
3622 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3623 return;
3624 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003625 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003626 return;
3627 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003628 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003629 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003630 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3631 *params = shaderObject->getTranslatedSourceLength();
3632 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003633 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003635 }
3636 }
3637 }
3638 catch(std::bad_alloc&)
3639 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003640 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641 }
3642}
3643
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003644void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003645{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003646 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 +00003647 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003648
3649 try
3650 {
3651 if (bufsize < 0)
3652 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003653 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654 }
3655
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003656 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003657
3658 if (context)
3659 {
3660 gl::Shader *shaderObject = context->getShader(shader);
3661
3662 if (!shaderObject)
3663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003665 }
3666
3667 shaderObject->getInfoLog(bufsize, length, infolog);
3668 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003669 }
3670 catch(std::bad_alloc&)
3671 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003672 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003673 }
3674}
3675
3676void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3677{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003678 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 +00003679 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003680
3681 try
3682 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003683 switch (shadertype)
3684 {
3685 case GL_VERTEX_SHADER:
3686 case GL_FRAGMENT_SHADER:
3687 break;
3688 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003689 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003690 }
3691
3692 switch (precisiontype)
3693 {
3694 case GL_LOW_FLOAT:
3695 case GL_MEDIUM_FLOAT:
3696 case GL_HIGH_FLOAT:
3697 // Assume IEEE 754 precision
3698 range[0] = 127;
3699 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003700 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003701 break;
3702 case GL_LOW_INT:
3703 case GL_MEDIUM_INT:
3704 case GL_HIGH_INT:
3705 // Some (most) hardware only supports single-precision floating-point numbers,
3706 // which can accurately represent integers up to +/-16777216
3707 range[0] = 24;
3708 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003709 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003710 break;
3711 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003712 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003713 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003714 }
3715 catch(std::bad_alloc&)
3716 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003717 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003718 }
3719}
3720
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003721void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003722{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003723 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 +00003724 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003725
3726 try
3727 {
3728 if (bufsize < 0)
3729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003730 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003731 }
3732
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003733 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003734
3735 if (context)
3736 {
3737 gl::Shader *shaderObject = context->getShader(shader);
3738
3739 if (!shaderObject)
3740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003741 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003742 }
3743
3744 shaderObject->getSource(bufsize, length, source);
3745 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003746 }
3747 catch(std::bad_alloc&)
3748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003749 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003750 }
3751}
3752
zmo@google.coma574f782011-10-03 21:45:23 +00003753void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3754{
3755 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3756 shader, bufsize, length, source);
3757
3758 try
3759 {
3760 if (bufsize < 0)
3761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003762 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003763 }
3764
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003765 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003766
3767 if (context)
3768 {
3769 gl::Shader *shaderObject = context->getShader(shader);
3770
3771 if (!shaderObject)
3772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003773 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003774 }
3775
3776 shaderObject->getTranslatedSource(bufsize, length, source);
3777 }
3778 }
3779 catch(std::bad_alloc&)
3780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003781 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003782 }
3783}
3784
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003785const GLubyte* __stdcall glGetString(GLenum name)
3786{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003787 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003788
3789 try
3790 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003791 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003792
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 switch (name)
3794 {
3795 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003796 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003798 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003799 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003800 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003802 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003804 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003805 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003806 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003807 }
3808 }
3809 catch(std::bad_alloc&)
3810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003811 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003812 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003813}
3814
3815void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3816{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003817 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 +00003818
3819 try
3820 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003821 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003822
3823 if (context)
3824 {
3825 gl::Texture *texture;
3826
3827 switch (target)
3828 {
3829 case GL_TEXTURE_2D:
3830 texture = context->getTexture2D();
3831 break;
3832 case GL_TEXTURE_CUBE_MAP:
3833 texture = context->getTextureCubeMap();
3834 break;
3835 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003836 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003837 }
3838
3839 switch (pname)
3840 {
3841 case GL_TEXTURE_MAG_FILTER:
3842 *params = (GLfloat)texture->getMagFilter();
3843 break;
3844 case GL_TEXTURE_MIN_FILTER:
3845 *params = (GLfloat)texture->getMinFilter();
3846 break;
3847 case GL_TEXTURE_WRAP_S:
3848 *params = (GLfloat)texture->getWrapS();
3849 break;
3850 case GL_TEXTURE_WRAP_T:
3851 *params = (GLfloat)texture->getWrapT();
3852 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003853 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3854 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3855 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003856 case GL_TEXTURE_USAGE_ANGLE:
3857 *params = (GLfloat)texture->getUsage();
3858 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003859 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3860 if (!context->supportsTextureFilterAnisotropy())
3861 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003862 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003863 }
3864 *params = (GLfloat)texture->getMaxAnisotropy();
3865 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003866 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003867 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003868 }
3869 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003870 }
3871 catch(std::bad_alloc&)
3872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003873 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874 }
3875}
3876
3877void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3878{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003879 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 +00003880
3881 try
3882 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003883 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003884
3885 if (context)
3886 {
3887 gl::Texture *texture;
3888
3889 switch (target)
3890 {
3891 case GL_TEXTURE_2D:
3892 texture = context->getTexture2D();
3893 break;
3894 case GL_TEXTURE_CUBE_MAP:
3895 texture = context->getTextureCubeMap();
3896 break;
3897 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003898 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003899 }
3900
3901 switch (pname)
3902 {
3903 case GL_TEXTURE_MAG_FILTER:
3904 *params = texture->getMagFilter();
3905 break;
3906 case GL_TEXTURE_MIN_FILTER:
3907 *params = texture->getMinFilter();
3908 break;
3909 case GL_TEXTURE_WRAP_S:
3910 *params = texture->getWrapS();
3911 break;
3912 case GL_TEXTURE_WRAP_T:
3913 *params = texture->getWrapT();
3914 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003915 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3916 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3917 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003918 case GL_TEXTURE_USAGE_ANGLE:
3919 *params = texture->getUsage();
3920 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003921 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3922 if (!context->supportsTextureFilterAnisotropy())
3923 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003924 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003925 }
3926 *params = (GLint)texture->getMaxAnisotropy();
3927 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003928 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003929 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003930 }
3931 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003932 }
3933 catch(std::bad_alloc&)
3934 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003935 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003936 }
3937}
3938
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003939void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3940{
3941 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3942 program, location, bufSize, params);
3943
3944 try
3945 {
3946 if (bufSize < 0)
3947 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003948 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003949 }
3950
3951 gl::Context *context = gl::getNonLostContext();
3952
3953 if (context)
3954 {
3955 if (program == 0)
3956 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003957 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003958 }
3959
3960 gl::Program *programObject = context->getProgram(program);
3961
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003962 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003963 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003964 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003965 }
3966
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003967 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3968 if (!programBinary)
3969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003970 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003971 }
3972
3973 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003974 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003975 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003976 }
3977 }
3978 }
3979 catch(std::bad_alloc&)
3980 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003981 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003982 }
3983}
3984
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003985void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3986{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003987 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003988
3989 try
3990 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003991 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003992
3993 if (context)
3994 {
3995 if (program == 0)
3996 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003997 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003998 }
3999
4000 gl::Program *programObject = context->getProgram(program);
4001
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004002 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004003 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004004 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004005 }
4006
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004007 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4008 if (!programBinary)
4009 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004010 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004011 }
4012
4013 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004014 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004015 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004016 }
4017 }
4018 }
4019 catch(std::bad_alloc&)
4020 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004021 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004022 }
4023}
4024
4025void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4026{
4027 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4028 program, location, bufSize, params);
4029
4030 try
4031 {
4032 if (bufSize < 0)
4033 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004034 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004035 }
4036
4037 gl::Context *context = gl::getNonLostContext();
4038
4039 if (context)
4040 {
4041 if (program == 0)
4042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004043 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004044 }
4045
4046 gl::Program *programObject = context->getProgram(program);
4047
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004048 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004050 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004051 }
4052
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004053 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4054 if (!programBinary)
4055 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004056 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004057 }
4058
4059 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004060 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004061 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004062 }
4063 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004064 }
4065 catch(std::bad_alloc&)
4066 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004067 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004068 }
4069}
4070
4071void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4072{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004073 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004074
4075 try
4076 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004078
4079 if (context)
4080 {
4081 if (program == 0)
4082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004084 }
4085
4086 gl::Program *programObject = context->getProgram(program);
4087
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004088 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004089 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004090 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004091 }
4092
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004093 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4094 if (!programBinary)
4095 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004096 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004097 }
4098
4099 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004101 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004102 }
4103 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004104 }
4105 catch(std::bad_alloc&)
4106 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004107 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108 }
4109}
4110
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004111int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004112{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004113 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004114
4115 try
4116 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004117 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004118
4119 if (strstr(name, "gl_") == name)
4120 {
4121 return -1;
4122 }
4123
4124 if (context)
4125 {
4126 gl::Program *programObject = context->getProgram(program);
4127
4128 if (!programObject)
4129 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004130 if (context->getShader(program))
4131 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004132 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004133 }
4134 else
4135 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004136 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004137 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004138 }
4139
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004140 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004141 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004143 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004144 }
4145
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004146 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004147 }
4148 }
4149 catch(std::bad_alloc&)
4150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004151 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004152 }
4153
4154 return -1;
4155}
4156
4157void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4158{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004159 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004160
4161 try
4162 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004163 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164
daniel@transgaming.come0078962010-04-15 20:45:08 +00004165 if (context)
4166 {
4167 if (index >= gl::MAX_VERTEX_ATTRIBS)
4168 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004169 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004170 }
4171
daniel@transgaming.com83921382011-01-08 05:46:00 +00004172 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004173
daniel@transgaming.come0078962010-04-15 20:45:08 +00004174 switch (pname)
4175 {
4176 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004177 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004178 break;
4179 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004180 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004181 break;
4182 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004183 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004184 break;
4185 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004186 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004187 break;
4188 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004189 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004190 break;
4191 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004192 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004193 break;
4194 case GL_CURRENT_VERTEX_ATTRIB:
4195 for (int i = 0; i < 4; ++i)
4196 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004197 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004198 }
4199 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004200 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4201 *params = (GLfloat)attribState.mDivisor;
4202 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004203 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004204 }
4205 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206 }
4207 catch(std::bad_alloc&)
4208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004209 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210 }
4211}
4212
4213void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4214{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004215 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216
4217 try
4218 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004219 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004220
daniel@transgaming.come0078962010-04-15 20:45:08 +00004221 if (context)
4222 {
4223 if (index >= gl::MAX_VERTEX_ATTRIBS)
4224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004225 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004226 }
4227
daniel@transgaming.com83921382011-01-08 05:46:00 +00004228 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004229
daniel@transgaming.come0078962010-04-15 20:45:08 +00004230 switch (pname)
4231 {
4232 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004233 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004234 break;
4235 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004236 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004237 break;
4238 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004239 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004240 break;
4241 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004242 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004243 break;
4244 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004245 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004246 break;
4247 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004248 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004249 break;
4250 case GL_CURRENT_VERTEX_ATTRIB:
4251 for (int i = 0; i < 4; ++i)
4252 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004253 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004254 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4255 }
4256 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004257 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4258 *params = (GLint)attribState.mDivisor;
4259 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004260 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004261 }
4262 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263 }
4264 catch(std::bad_alloc&)
4265 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004266 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267 }
4268}
4269
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004270void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004271{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004272 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004273
4274 try
4275 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004276 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004277
daniel@transgaming.come0078962010-04-15 20:45:08 +00004278 if (context)
4279 {
4280 if (index >= gl::MAX_VERTEX_ATTRIBS)
4281 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004282 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004283 }
4284
4285 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4286 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004287 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004288 }
4289
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004290 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004291 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292 }
4293 catch(std::bad_alloc&)
4294 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004295 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004296 }
4297}
4298
4299void __stdcall glHint(GLenum target, GLenum mode)
4300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004301 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004302
4303 try
4304 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004305 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004306 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004307 case GL_FASTEST:
4308 case GL_NICEST:
4309 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004310 break;
4311 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004312 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004313 }
4314
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004315 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004316 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004317 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004318 case GL_GENERATE_MIPMAP_HINT:
4319 if (context) context->setGenerateMipmapHint(mode);
4320 break;
4321 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4322 if (context) context->setFragmentShaderDerivativeHint(mode);
4323 break;
4324 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004325 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004326 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327 }
4328 catch(std::bad_alloc&)
4329 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004330 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331 }
4332}
4333
4334GLboolean __stdcall glIsBuffer(GLuint buffer)
4335{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004336 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004337
4338 try
4339 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004340 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004341
4342 if (context && buffer)
4343 {
4344 gl::Buffer *bufferObject = context->getBuffer(buffer);
4345
4346 if (bufferObject)
4347 {
4348 return GL_TRUE;
4349 }
4350 }
4351 }
4352 catch(std::bad_alloc&)
4353 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004354 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004355 }
4356
4357 return GL_FALSE;
4358}
4359
4360GLboolean __stdcall glIsEnabled(GLenum cap)
4361{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004362 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004363
4364 try
4365 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004366 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004367
4368 if (context)
4369 {
4370 switch (cap)
4371 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004372 case GL_CULL_FACE: return context->isCullFaceEnabled();
4373 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4374 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4375 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4376 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4377 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4378 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4379 case GL_BLEND: return context->isBlendEnabled();
4380 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004381 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004382 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004383 }
4384 }
4385 }
4386 catch(std::bad_alloc&)
4387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004388 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004389 }
4390
4391 return false;
4392}
4393
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004394GLboolean __stdcall glIsFenceNV(GLuint fence)
4395{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004396 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004397
4398 try
4399 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004400 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004401
4402 if (context)
4403 {
4404 gl::Fence *fenceObject = context->getFence(fence);
4405
4406 if (fenceObject == NULL)
4407 {
4408 return GL_FALSE;
4409 }
4410
4411 return fenceObject->isFence();
4412 }
4413 }
4414 catch(std::bad_alloc&)
4415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004416 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004417 }
4418
4419 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004420}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004421
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004422GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4423{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004424 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004425
4426 try
4427 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004428 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004429
4430 if (context && framebuffer)
4431 {
4432 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4433
4434 if (framebufferObject)
4435 {
4436 return GL_TRUE;
4437 }
4438 }
4439 }
4440 catch(std::bad_alloc&)
4441 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004442 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004443 }
4444
4445 return GL_FALSE;
4446}
4447
4448GLboolean __stdcall glIsProgram(GLuint program)
4449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004450 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004451
4452 try
4453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004455
4456 if (context && program)
4457 {
4458 gl::Program *programObject = context->getProgram(program);
4459
4460 if (programObject)
4461 {
4462 return GL_TRUE;
4463 }
4464 }
4465 }
4466 catch(std::bad_alloc&)
4467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004468 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004469 }
4470
4471 return GL_FALSE;
4472}
4473
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004474GLboolean __stdcall glIsQueryEXT(GLuint id)
4475{
4476 EVENT("(GLuint id = %d)", id);
4477
4478 try
4479 {
4480 if (id == 0)
4481 {
4482 return GL_FALSE;
4483 }
4484
4485 gl::Context *context = gl::getNonLostContext();
4486
4487 if (context)
4488 {
4489 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4490
4491 if (queryObject)
4492 {
4493 return GL_TRUE;
4494 }
4495 }
4496 }
4497 catch(std::bad_alloc&)
4498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004499 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004500 }
4501
4502 return GL_FALSE;
4503}
4504
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004505GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4506{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004507 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004508
4509 try
4510 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004511 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004512
4513 if (context && renderbuffer)
4514 {
4515 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4516
4517 if (renderbufferObject)
4518 {
4519 return GL_TRUE;
4520 }
4521 }
4522 }
4523 catch(std::bad_alloc&)
4524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004525 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004526 }
4527
4528 return GL_FALSE;
4529}
4530
4531GLboolean __stdcall glIsShader(GLuint shader)
4532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004533 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004534
4535 try
4536 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004537 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004538
4539 if (context && shader)
4540 {
4541 gl::Shader *shaderObject = context->getShader(shader);
4542
4543 if (shaderObject)
4544 {
4545 return GL_TRUE;
4546 }
4547 }
4548 }
4549 catch(std::bad_alloc&)
4550 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004551 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004552 }
4553
4554 return GL_FALSE;
4555}
4556
4557GLboolean __stdcall glIsTexture(GLuint texture)
4558{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004559 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004560
4561 try
4562 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004563 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004564
4565 if (context && texture)
4566 {
4567 gl::Texture *textureObject = context->getTexture(texture);
4568
4569 if (textureObject)
4570 {
4571 return GL_TRUE;
4572 }
4573 }
4574 }
4575 catch(std::bad_alloc&)
4576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004577 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004578 }
4579
4580 return GL_FALSE;
4581}
4582
4583void __stdcall glLineWidth(GLfloat width)
4584{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004585 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004586
4587 try
4588 {
4589 if (width <= 0.0f)
4590 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004591 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004592 }
4593
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004594 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004595
4596 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004597 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004598 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004599 }
4600 }
4601 catch(std::bad_alloc&)
4602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004603 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604 }
4605}
4606
4607void __stdcall glLinkProgram(GLuint program)
4608{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004609 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004610
4611 try
4612 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004613 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004614
4615 if (context)
4616 {
4617 gl::Program *programObject = context->getProgram(program);
4618
4619 if (!programObject)
4620 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004621 if (context->getShader(program))
4622 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004623 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004624 }
4625 else
4626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004627 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004628 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004629 }
4630
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004631 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004632 }
4633 }
4634 catch(std::bad_alloc&)
4635 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004636 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004637 }
4638}
4639
4640void __stdcall glPixelStorei(GLenum pname, GLint param)
4641{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004642 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004643
4644 try
4645 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004646 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004647
4648 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004649 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004650 switch (pname)
4651 {
4652 case GL_UNPACK_ALIGNMENT:
4653 if (param != 1 && param != 2 && param != 4 && param != 8)
4654 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004655 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004656 }
4657
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004658 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004659 break;
4660
4661 case GL_PACK_ALIGNMENT:
4662 if (param != 1 && param != 2 && param != 4 && param != 8)
4663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004665 }
4666
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004667 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004668 break;
4669
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004670 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4671 context->setPackReverseRowOrder(param != 0);
4672 break;
4673
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004674 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004675 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004676 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004677 }
4678 }
4679 catch(std::bad_alloc&)
4680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004681 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004682 }
4683}
4684
4685void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4686{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004687 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004688
4689 try
4690 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004691 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004692
4693 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004694 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004695 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696 }
4697 }
4698 catch(std::bad_alloc&)
4699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004700 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004701 }
4702}
4703
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004704void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4705 GLenum format, GLenum type, GLsizei bufSize,
4706 GLvoid *data)
4707{
4708 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4709 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4710 x, y, width, height, format, type, bufSize, data);
4711
4712 try
4713 {
4714 if (width < 0 || height < 0 || bufSize < 0)
4715 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004716 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004717 }
4718
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004719 gl::Context *context = gl::getNonLostContext();
4720
4721 if (context)
4722 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004723 GLenum currentFormat, currentType;
4724
4725 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4726 // and attempting to read back if that's the case is an error. The error will be registered
4727 // by getCurrentReadFormat.
4728 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4729 return;
4730
4731 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004733 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004734 }
4735
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004736 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4737 }
4738 }
4739 catch(std::bad_alloc&)
4740 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004741 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004742 }
4743}
4744
4745void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4746 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004748 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004749 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004750 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004751
4752 try
4753 {
4754 if (width < 0 || height < 0)
4755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004756 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004757 }
4758
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004759 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004760
4761 if (context)
4762 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004763 GLenum currentFormat, currentType;
4764
4765 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4766 // and attempting to read back if that's the case is an error. The error will be registered
4767 // by getCurrentReadFormat.
4768 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4769 return;
4770
4771 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004773 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004774 }
4775
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004776 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004777 }
4778 }
4779 catch(std::bad_alloc&)
4780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004781 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004782 }
4783}
4784
4785void __stdcall glReleaseShaderCompiler(void)
4786{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004787 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004788
4789 try
4790 {
4791 gl::Shader::releaseCompiler();
4792 }
4793 catch(std::bad_alloc&)
4794 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004795 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004796 }
4797}
4798
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004799void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004800{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004801 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 +00004802 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004803
4804 try
4805 {
4806 switch (target)
4807 {
4808 case GL_RENDERBUFFER:
4809 break;
4810 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004811 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812 }
4813
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004814 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004816 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004817 }
4818
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004819 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004821 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004822 }
4823
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004824 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004825
4826 if (context)
4827 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004828 if (width > context->getMaximumRenderbufferDimension() ||
4829 height > context->getMaximumRenderbufferDimension() ||
4830 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004831 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004832 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004833 }
4834
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004835 GLuint handle = context->getRenderbufferHandle();
4836 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004837 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004838 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839 }
4840
4841 switch (internalformat)
4842 {
4843 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004844 case GL_RGBA4:
4845 case GL_RGB5_A1:
4846 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004847 case GL_RGB8_OES:
4848 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004849 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004850 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004851 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004852 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004853 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004854 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004855 }
4856 }
4857 }
4858 catch(std::bad_alloc&)
4859 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004860 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004861 }
4862}
4863
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004864void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4865{
4866 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4867}
4868
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4870{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004871 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004872
4873 try
4874 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004875 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004876
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004877 if (context)
4878 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004879 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004880 }
4881 }
4882 catch(std::bad_alloc&)
4883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004884 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004885 }
4886}
4887
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004888void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4889{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004890 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004891
4892 try
4893 {
4894 if (condition != GL_ALL_COMPLETED_NV)
4895 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004896 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004897 }
4898
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004899 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004900
4901 if (context)
4902 {
4903 gl::Fence *fenceObject = context->getFence(fence);
4904
4905 if (fenceObject == NULL)
4906 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004907 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004908 }
4909
4910 fenceObject->setFence(condition);
4911 }
4912 }
4913 catch(std::bad_alloc&)
4914 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004915 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004916 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004917}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004918
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004919void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4920{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004921 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 +00004922
4923 try
4924 {
4925 if (width < 0 || height < 0)
4926 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004927 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004928 }
4929
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004930 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004931
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004932 if (context)
4933 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004934 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004935 }
4936 }
4937 catch(std::bad_alloc&)
4938 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004939 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004940 }
4941}
4942
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004943void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004944{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004945 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004946 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004947 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004948
4949 try
4950 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004951 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004952 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004953 }
4954 catch(std::bad_alloc&)
4955 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004956 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004957 }
4958}
4959
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004960void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004961{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004962 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 +00004963 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004964
4965 try
4966 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004967 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004968 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004969 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004970 }
4971
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004972 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004973
4974 if (context)
4975 {
4976 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004977
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004978 if (!shaderObject)
4979 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004980 if (context->getProgram(shader))
4981 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004982 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004983 }
4984 else
4985 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004986 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004987 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004988 }
4989
4990 shaderObject->setSource(count, string, length);
4991 }
4992 }
4993 catch(std::bad_alloc&)
4994 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004995 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004996 }
4997}
4998
4999void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
5000{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005001 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005002}
5003
5004void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
5005{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005006 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 +00005007
5008 try
5009 {
5010 switch (face)
5011 {
5012 case GL_FRONT:
5013 case GL_BACK:
5014 case GL_FRONT_AND_BACK:
5015 break;
5016 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005017 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005018 }
5019
5020 switch (func)
5021 {
5022 case GL_NEVER:
5023 case GL_ALWAYS:
5024 case GL_LESS:
5025 case GL_LEQUAL:
5026 case GL_EQUAL:
5027 case GL_GEQUAL:
5028 case GL_GREATER:
5029 case GL_NOTEQUAL:
5030 break;
5031 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005032 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005033 }
5034
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005035 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005036
5037 if (context)
5038 {
5039 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5040 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005041 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005042 }
5043
5044 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5045 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005046 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005047 }
5048 }
5049 }
5050 catch(std::bad_alloc&)
5051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005052 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005053 }
5054}
5055
5056void __stdcall glStencilMask(GLuint mask)
5057{
5058 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5059}
5060
5061void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005063 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005064
5065 try
5066 {
5067 switch (face)
5068 {
5069 case GL_FRONT:
5070 case GL_BACK:
5071 case GL_FRONT_AND_BACK:
5072 break;
5073 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005074 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005075 }
5076
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005077 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005078
5079 if (context)
5080 {
5081 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5082 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005083 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005084 }
5085
5086 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5087 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005088 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005089 }
5090 }
5091 }
5092 catch(std::bad_alloc&)
5093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005094 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005095 }
5096}
5097
5098void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5099{
5100 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5101}
5102
5103void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5104{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005105 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 +00005106 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005107
5108 try
5109 {
5110 switch (face)
5111 {
5112 case GL_FRONT:
5113 case GL_BACK:
5114 case GL_FRONT_AND_BACK:
5115 break;
5116 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005117 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005118 }
5119
5120 switch (fail)
5121 {
5122 case GL_ZERO:
5123 case GL_KEEP:
5124 case GL_REPLACE:
5125 case GL_INCR:
5126 case GL_DECR:
5127 case GL_INVERT:
5128 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005129 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005130 break;
5131 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005132 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005133 }
5134
5135 switch (zfail)
5136 {
5137 case GL_ZERO:
5138 case GL_KEEP:
5139 case GL_REPLACE:
5140 case GL_INCR:
5141 case GL_DECR:
5142 case GL_INVERT:
5143 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005144 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005145 break;
5146 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005147 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005148 }
5149
5150 switch (zpass)
5151 {
5152 case GL_ZERO:
5153 case GL_KEEP:
5154 case GL_REPLACE:
5155 case GL_INCR:
5156 case GL_DECR:
5157 case GL_INVERT:
5158 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005159 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005160 break;
5161 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005162 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005163 }
5164
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005165 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005166
5167 if (context)
5168 {
5169 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5170 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005171 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005172 }
5173
5174 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5175 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005176 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005177 }
5178 }
5179 }
5180 catch(std::bad_alloc&)
5181 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005182 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005183 }
5184}
5185
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005186GLboolean __stdcall glTestFenceNV(GLuint fence)
5187{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005188 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005189
5190 try
5191 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005192 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005193
5194 if (context)
5195 {
5196 gl::Fence *fenceObject = context->getFence(fence);
5197
5198 if (fenceObject == NULL)
5199 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005200 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005201 }
5202
5203 return fenceObject->testFence();
5204 }
5205 }
5206 catch(std::bad_alloc&)
5207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005208 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005209 }
5210
5211 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005212}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005213
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005214void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5215 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005217 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 +00005218 "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 +00005219 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005220
5221 try
5222 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005223 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005224 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005225 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005226 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005227
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005228 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005229 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005230 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005231 }
5232
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005233 // validate <type> by itself (used as secondary key below)
5234 switch (type)
5235 {
5236 case GL_UNSIGNED_BYTE:
5237 case GL_UNSIGNED_SHORT_5_6_5:
5238 case GL_UNSIGNED_SHORT_4_4_4_4:
5239 case GL_UNSIGNED_SHORT_5_5_5_1:
5240 case GL_UNSIGNED_SHORT:
5241 case GL_UNSIGNED_INT:
5242 case GL_UNSIGNED_INT_24_8_OES:
5243 case GL_HALF_FLOAT_OES:
5244 case GL_FLOAT:
5245 break;
5246 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005247 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005248 }
5249
5250 // validate <format> + <type> combinations
5251 // - invalid <format> -> sets INVALID_ENUM
5252 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005253 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005254 {
5255 case GL_ALPHA:
5256 case GL_LUMINANCE:
5257 case GL_LUMINANCE_ALPHA:
5258 switch (type)
5259 {
5260 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005261 case GL_FLOAT:
5262 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005263 break;
5264 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005265 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005266 }
5267 break;
5268 case GL_RGB:
5269 switch (type)
5270 {
5271 case GL_UNSIGNED_BYTE:
5272 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005273 case GL_FLOAT:
5274 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005275 break;
5276 default:
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 break;
5280 case GL_RGBA:
5281 switch (type)
5282 {
5283 case GL_UNSIGNED_BYTE:
5284 case GL_UNSIGNED_SHORT_4_4_4_4:
5285 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005286 case GL_FLOAT:
5287 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005288 break;
5289 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005290 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005291 }
5292 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005293 case GL_BGRA_EXT:
5294 switch (type)
5295 {
5296 case GL_UNSIGNED_BYTE:
5297 break;
5298 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005299 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005300 }
5301 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005302 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5303 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005304 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5305 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005306 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005307 case GL_DEPTH_COMPONENT:
5308 switch (type)
5309 {
5310 case GL_UNSIGNED_SHORT:
5311 case GL_UNSIGNED_INT:
5312 break;
5313 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005314 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005315 }
5316 break;
5317 case GL_DEPTH_STENCIL_OES:
5318 switch (type)
5319 {
5320 case GL_UNSIGNED_INT_24_8_OES:
5321 break;
5322 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005323 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005324 }
5325 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005327 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005328 }
5329
5330 if (border != 0)
5331 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005332 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005333 }
5334
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005335 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005336
5337 if (context)
5338 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005339 if (level > context->getMaximumTextureLevel())
5340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005342 }
5343
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005344 switch (target)
5345 {
5346 case GL_TEXTURE_2D:
5347 if (width > (context->getMaximumTextureDimension() >> level) ||
5348 height > (context->getMaximumTextureDimension() >> level))
5349 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005350 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005351 }
5352 break;
5353 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5354 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5355 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5356 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5357 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5358 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5359 if (width != height)
5360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005362 }
5363
5364 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5365 height > (context->getMaximumCubeTextureDimension() >> level))
5366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005367 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005368 }
5369 break;
5370 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005371 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005372 }
5373
gman@chromium.org50c526d2011-08-10 05:19:44 +00005374 switch (format) {
5375 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5376 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5377 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005380 }
5381 else
5382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005383 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005384 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005385 break;
5386 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5387 if (context->supportsDXT3Textures())
5388 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005389 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005390 }
5391 else
5392 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005393 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005394 }
5395 break;
5396 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5397 if (context->supportsDXT5Textures())
5398 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005399 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005400 }
5401 else
5402 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005403 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005404 }
5405 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005406 case GL_DEPTH_COMPONENT:
5407 case GL_DEPTH_STENCIL_OES:
5408 if (!context->supportsDepthTextures())
5409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005410 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005411 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005412 if (target != GL_TEXTURE_2D)
5413 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005414 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005415 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005416 // OES_depth_texture supports loading depth data and multiple levels,
5417 // but ANGLE_depth_texture does not
5418 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005420 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005421 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005422 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005423 default:
5424 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005425 }
5426
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005427 if (type == GL_FLOAT)
5428 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005429 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005430 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005431 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005432 }
5433 }
5434 else if (type == GL_HALF_FLOAT_OES)
5435 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005436 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005439 }
5440 }
5441
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005442 if (target == GL_TEXTURE_2D)
5443 {
5444 gl::Texture2D *texture = context->getTexture2D();
5445
5446 if (!texture)
5447 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005448 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005449 }
5450
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005451 if (texture->isImmutable())
5452 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005453 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005454 }
5455
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005456 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005457 }
5458 else
5459 {
5460 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5461
5462 if (!texture)
5463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005464 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005465 }
5466
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005467 if (texture->isImmutable())
5468 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005469 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005470 }
5471
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005472 switch (target)
5473 {
5474 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005475 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005476 break;
5477 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005478 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005479 break;
5480 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005481 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005482 break;
5483 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005484 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005485 break;
5486 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005487 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005488 break;
5489 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005490 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005491 break;
5492 default: UNREACHABLE();
5493 }
5494 }
5495 }
5496 }
5497 catch(std::bad_alloc&)
5498 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005499 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005500 }
5501}
5502
5503void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5504{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005505 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5506
5507 try
5508 {
5509 gl::Context *context = gl::getNonLostContext();
5510
5511 if (context)
5512 {
5513 gl::Texture *texture;
5514
5515 switch (target)
5516 {
5517 case GL_TEXTURE_2D:
5518 texture = context->getTexture2D();
5519 break;
5520 case GL_TEXTURE_CUBE_MAP:
5521 texture = context->getTextureCubeMap();
5522 break;
5523 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005524 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005525 }
5526
5527 switch (pname)
5528 {
5529 case GL_TEXTURE_WRAP_S:
5530 if (!texture->setWrapS((GLenum)param))
5531 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005532 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005533 }
5534 break;
5535 case GL_TEXTURE_WRAP_T:
5536 if (!texture->setWrapT((GLenum)param))
5537 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005538 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005539 }
5540 break;
5541 case GL_TEXTURE_MIN_FILTER:
5542 if (!texture->setMinFilter((GLenum)param))
5543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005545 }
5546 break;
5547 case GL_TEXTURE_MAG_FILTER:
5548 if (!texture->setMagFilter((GLenum)param))
5549 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005550 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005551 }
5552 break;
5553 case GL_TEXTURE_USAGE_ANGLE:
5554 if (!texture->setUsage((GLenum)param))
5555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005557 }
5558 break;
5559 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5560 if (!context->supportsTextureFilterAnisotropy())
5561 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005562 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005563 }
5564 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005567 }
5568 break;
5569 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005570 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005571 }
5572 }
5573 }
5574 catch(std::bad_alloc&)
5575 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005576 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005577 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578}
5579
5580void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5581{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005582 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005583}
5584
5585void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005587 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005588
5589 try
5590 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005592
5593 if (context)
5594 {
5595 gl::Texture *texture;
5596
5597 switch (target)
5598 {
5599 case GL_TEXTURE_2D:
5600 texture = context->getTexture2D();
5601 break;
5602 case GL_TEXTURE_CUBE_MAP:
5603 texture = context->getTextureCubeMap();
5604 break;
5605 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005606 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005607 }
5608
5609 switch (pname)
5610 {
5611 case GL_TEXTURE_WRAP_S:
5612 if (!texture->setWrapS((GLenum)param))
5613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005614 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005615 }
5616 break;
5617 case GL_TEXTURE_WRAP_T:
5618 if (!texture->setWrapT((GLenum)param))
5619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005620 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005621 }
5622 break;
5623 case GL_TEXTURE_MIN_FILTER:
5624 if (!texture->setMinFilter((GLenum)param))
5625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005626 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005627 }
5628 break;
5629 case GL_TEXTURE_MAG_FILTER:
5630 if (!texture->setMagFilter((GLenum)param))
5631 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005632 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005633 }
5634 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005635 case GL_TEXTURE_USAGE_ANGLE:
5636 if (!texture->setUsage((GLenum)param))
5637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005638 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005639 }
5640 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005641 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5642 if (!context->supportsTextureFilterAnisotropy())
5643 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005645 }
5646 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005649 }
5650 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005651 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005652 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005653 }
5654 }
5655 }
5656 catch(std::bad_alloc&)
5657 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005658 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005659 }
5660}
5661
5662void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5663{
5664 glTexParameteri(target, pname, *params);
5665}
5666
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005667void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5668{
5669 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5670 target, levels, internalformat, width, height);
5671
5672 try
5673 {
5674 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005676 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005677 }
5678
5679 if (width < 1 || height < 1 || levels < 1)
5680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005681 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005682 }
5683
5684 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5685 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005686 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005687 }
5688
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005689 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005690 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005691 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005692 }
5693
5694 GLenum format = gl::ExtractFormat(internalformat);
5695 GLenum type = gl::ExtractType(internalformat);
5696
5697 if (format == GL_NONE || type == GL_NONE)
5698 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005699 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005700 }
5701
5702 gl::Context *context = gl::getNonLostContext();
5703
5704 if (context)
5705 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005706 switch (target)
5707 {
5708 case GL_TEXTURE_2D:
5709 if (width > context->getMaximumTextureDimension() ||
5710 height > context->getMaximumTextureDimension())
5711 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005712 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005713 }
5714 break;
5715 case GL_TEXTURE_CUBE_MAP:
5716 if (width > context->getMaximumCubeTextureDimension() ||
5717 height > context->getMaximumCubeTextureDimension())
5718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005720 }
5721 break;
5722 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005723 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005724 }
5725
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005726 if (levels != 1 && !context->supportsNonPower2Texture())
5727 {
5728 if (!gl::isPow2(width) || !gl::isPow2(height))
5729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005730 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005731 }
5732 }
5733
daniel@transgaming.come1077362011-11-11 04:16:50 +00005734 switch (internalformat)
5735 {
5736 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5737 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5738 if (!context->supportsDXT1Textures())
5739 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005740 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005741 }
5742 break;
5743 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5744 if (!context->supportsDXT3Textures())
5745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005746 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005747 }
5748 break;
5749 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5750 if (!context->supportsDXT5Textures())
5751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005752 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005753 }
5754 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005755 case GL_RGBA32F_EXT:
5756 case GL_RGB32F_EXT:
5757 case GL_ALPHA32F_EXT:
5758 case GL_LUMINANCE32F_EXT:
5759 case GL_LUMINANCE_ALPHA32F_EXT:
5760 if (!context->supportsFloat32Textures())
5761 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005762 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005763 }
5764 break;
5765 case GL_RGBA16F_EXT:
5766 case GL_RGB16F_EXT:
5767 case GL_ALPHA16F_EXT:
5768 case GL_LUMINANCE16F_EXT:
5769 case GL_LUMINANCE_ALPHA16F_EXT:
5770 if (!context->supportsFloat16Textures())
5771 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005772 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005773 }
5774 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005775 case GL_DEPTH_COMPONENT16:
5776 case GL_DEPTH_COMPONENT32_OES:
5777 case GL_DEPTH24_STENCIL8_OES:
5778 if (!context->supportsDepthTextures())
5779 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005780 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005781 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005782 if (target != GL_TEXTURE_2D)
5783 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005784 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005785 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005786 // ANGLE_depth_texture only supports 1-level textures
5787 if (levels != 1)
5788 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005789 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005790 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005791 break;
5792 default:
5793 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005794 }
5795
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005796 if (target == GL_TEXTURE_2D)
5797 {
5798 gl::Texture2D *texture = context->getTexture2D();
5799
5800 if (!texture || texture->id() == 0)
5801 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005802 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005803 }
5804
5805 if (texture->isImmutable())
5806 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005807 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005808 }
5809
5810 texture->storage(levels, internalformat, width, height);
5811 }
5812 else if (target == GL_TEXTURE_CUBE_MAP)
5813 {
5814 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5815
5816 if (!texture || texture->id() == 0)
5817 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005818 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005819 }
5820
5821 if (texture->isImmutable())
5822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005824 }
5825
5826 texture->storage(levels, internalformat, width);
5827 }
5828 else UNREACHABLE();
5829 }
5830 }
5831 catch(std::bad_alloc&)
5832 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005833 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005834 }
5835}
5836
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005837void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5838 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005839{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005840 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005841 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005842 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 target, level, xoffset, yoffset, width, height, format, type, pixels);
5844
5845 try
5846 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005847 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005850 }
5851
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005852 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005853 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005854 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005855 }
5856
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005857 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005859 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005860 }
5861
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005862 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005863 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005864 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005865 }
5866
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005867 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005868
5869 if (context)
5870 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005871 if (level > context->getMaximumTextureLevel())
5872 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005873 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005874 }
5875
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005876 if (format == GL_FLOAT)
5877 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005878 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005879 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005880 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005881 }
5882 }
5883 else if (format == GL_HALF_FLOAT_OES)
5884 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005885 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005887 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005888 }
5889 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005890 else if (gl::IsDepthTexture(format))
5891 {
5892 if (!context->supportsDepthTextures())
5893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005894 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005895 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005896 if (target != GL_TEXTURE_2D)
5897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005898 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005899 }
5900 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005901 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005902 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005903
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005904 if (width == 0 || height == 0 || pixels == NULL)
5905 {
5906 return;
5907 }
5908
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005909 if (target == GL_TEXTURE_2D)
5910 {
5911 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005912 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005913 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005914 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005915 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005916 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005917 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005918 {
5919 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005920 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005921 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005922 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005923 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005924 }
5925 else
5926 {
5927 UNREACHABLE();
5928 }
5929 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005930 }
5931 catch(std::bad_alloc&)
5932 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005933 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005934 }
5935}
5936
5937void __stdcall glUniform1f(GLint location, GLfloat x)
5938{
5939 glUniform1fv(location, 1, &x);
5940}
5941
5942void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5943{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005944 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005945
5946 try
5947 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005948 if (count < 0)
5949 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005950 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005951 }
5952
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005953 if (location == -1)
5954 {
5955 return;
5956 }
5957
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005958 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959
5960 if (context)
5961 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005962 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005963 if (!programBinary)
5964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005965 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005966 }
5967
5968 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005969 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005970 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005971 }
5972 }
5973 }
5974 catch(std::bad_alloc&)
5975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005976 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005977 }
5978}
5979
5980void __stdcall glUniform1i(GLint location, GLint x)
5981{
5982 glUniform1iv(location, 1, &x);
5983}
5984
5985void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5986{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005987 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005988
5989 try
5990 {
5991 if (count < 0)
5992 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005993 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005994 }
5995
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005996 if (location == -1)
5997 {
5998 return;
5999 }
6000
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006001 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006002
6003 if (context)
6004 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006005 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006006 if (!programBinary)
6007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006008 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006009 }
6010
6011 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006012 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006013 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006014 }
6015 }
6016 }
6017 catch(std::bad_alloc&)
6018 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006019 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006020 }
6021}
6022
6023void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6024{
6025 GLfloat xy[2] = {x, y};
6026
6027 glUniform2fv(location, 1, (GLfloat*)&xy);
6028}
6029
6030void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6031{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006032 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006033
6034 try
6035 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006036 if (count < 0)
6037 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006038 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006039 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006040
6041 if (location == -1)
6042 {
6043 return;
6044 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006045
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006046 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006047
6048 if (context)
6049 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006050 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006051 if (!programBinary)
6052 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006053 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006054 }
6055
6056 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006058 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006059 }
6060 }
6061 }
6062 catch(std::bad_alloc&)
6063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006064 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006065 }
6066}
6067
6068void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6069{
6070 GLint xy[4] = {x, y};
6071
6072 glUniform2iv(location, 1, (GLint*)&xy);
6073}
6074
6075void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6076{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006077 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006078
6079 try
6080 {
6081 if (count < 0)
6082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006083 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006084 }
6085
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006086 if (location == -1)
6087 {
6088 return;
6089 }
6090
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006091 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006092
6093 if (context)
6094 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006095 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006096 if (!programBinary)
6097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006098 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006099 }
6100
6101 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006102 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006103 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006104 }
6105 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006106 }
6107 catch(std::bad_alloc&)
6108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006109 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006110 }
6111}
6112
6113void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6114{
6115 GLfloat xyz[3] = {x, y, z};
6116
6117 glUniform3fv(location, 1, (GLfloat*)&xyz);
6118}
6119
6120void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6121{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006122 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006123
6124 try
6125 {
6126 if (count < 0)
6127 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006128 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006129 }
6130
6131 if (location == -1)
6132 {
6133 return;
6134 }
6135
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006136 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006137
6138 if (context)
6139 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006140 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006141 if (!programBinary)
6142 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006143 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006144 }
6145
6146 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006147 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006148 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006149 }
6150 }
6151 }
6152 catch(std::bad_alloc&)
6153 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006154 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006155 }
6156}
6157
6158void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6159{
6160 GLint xyz[3] = {x, y, z};
6161
6162 glUniform3iv(location, 1, (GLint*)&xyz);
6163}
6164
6165void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6166{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006167 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006168
6169 try
6170 {
6171 if (count < 0)
6172 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006173 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006174 }
6175
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006176 if (location == -1)
6177 {
6178 return;
6179 }
6180
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006181 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006182
6183 if (context)
6184 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006185 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006186 if (!programBinary)
6187 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006188 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006189 }
6190
6191 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006192 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006193 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006194 }
6195 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006196 }
6197 catch(std::bad_alloc&)
6198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006199 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006200 }
6201}
6202
6203void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6204{
6205 GLfloat xyzw[4] = {x, y, z, w};
6206
6207 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6208}
6209
6210void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6211{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006212 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006213
6214 try
6215 {
6216 if (count < 0)
6217 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006218 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006219 }
6220
6221 if (location == -1)
6222 {
6223 return;
6224 }
6225
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006226 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006227
6228 if (context)
6229 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006230 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006231 if (!programBinary)
6232 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006233 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006234 }
6235
6236 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006237 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006238 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006239 }
6240 }
6241 }
6242 catch(std::bad_alloc&)
6243 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006244 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006245 }
6246}
6247
6248void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6249{
6250 GLint xyzw[4] = {x, y, z, w};
6251
6252 glUniform4iv(location, 1, (GLint*)&xyzw);
6253}
6254
6255void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6256{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006257 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006258
6259 try
6260 {
6261 if (count < 0)
6262 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006263 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006264 }
6265
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006266 if (location == -1)
6267 {
6268 return;
6269 }
6270
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006271 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006272
6273 if (context)
6274 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006275 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006276 if (!programBinary)
6277 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006278 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006279 }
6280
6281 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006282 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006283 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006284 }
6285 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006286 }
6287 catch(std::bad_alloc&)
6288 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006289 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006290 }
6291}
6292
6293void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6294{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006295 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006296 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006297
6298 try
6299 {
6300 if (count < 0 || transpose != GL_FALSE)
6301 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006302 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006303 }
6304
6305 if (location == -1)
6306 {
6307 return;
6308 }
6309
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006310 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006311
6312 if (context)
6313 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006314 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006315 if (!programBinary)
6316 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006317 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006318 }
6319
6320 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006322 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006323 }
6324 }
6325 }
6326 catch(std::bad_alloc&)
6327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006328 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006329 }
6330}
6331
6332void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6333{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006334 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006335 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006336
6337 try
6338 {
6339 if (count < 0 || transpose != GL_FALSE)
6340 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006341 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006342 }
6343
6344 if (location == -1)
6345 {
6346 return;
6347 }
6348
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006349 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006350
6351 if (context)
6352 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006353 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006354 if (!programBinary)
6355 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006356 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006357 }
6358
6359 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006361 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006362 }
6363 }
6364 }
6365 catch(std::bad_alloc&)
6366 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006367 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006368 }
6369}
6370
6371void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6372{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006373 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006374 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006375
6376 try
6377 {
6378 if (count < 0 || transpose != GL_FALSE)
6379 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006380 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006381 }
6382
6383 if (location == -1)
6384 {
6385 return;
6386 }
6387
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006388 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006389
6390 if (context)
6391 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006392 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006393 if (!programBinary)
6394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006395 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006396 }
6397
6398 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006400 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006401 }
6402 }
6403 }
6404 catch(std::bad_alloc&)
6405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006406 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006407 }
6408}
6409
6410void __stdcall glUseProgram(GLuint program)
6411{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006412 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006413
6414 try
6415 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006416 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006417
6418 if (context)
6419 {
6420 gl::Program *programObject = context->getProgram(program);
6421
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006422 if (!programObject && program != 0)
6423 {
6424 if (context->getShader(program))
6425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006426 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006427 }
6428 else
6429 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006430 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006431 }
6432 }
6433
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006434 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006436 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006437 }
6438
6439 context->useProgram(program);
6440 }
6441 }
6442 catch(std::bad_alloc&)
6443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006444 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006445 }
6446}
6447
6448void __stdcall glValidateProgram(GLuint program)
6449{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006450 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006451
6452 try
6453 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006454 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006455
6456 if (context)
6457 {
6458 gl::Program *programObject = context->getProgram(program);
6459
6460 if (!programObject)
6461 {
6462 if (context->getShader(program))
6463 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006464 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006465 }
6466 else
6467 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006468 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006469 }
6470 }
6471
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006472 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006473 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474 }
6475 catch(std::bad_alloc&)
6476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006477 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006478 }
6479}
6480
6481void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6482{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006483 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006484
6485 try
6486 {
6487 if (index >= gl::MAX_VERTEX_ATTRIBS)
6488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006489 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006490 }
6491
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006492 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006493
6494 if (context)
6495 {
6496 GLfloat vals[4] = { x, 0, 0, 1 };
6497 context->setVertexAttrib(index, vals);
6498 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006499 }
6500 catch(std::bad_alloc&)
6501 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006502 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006503 }
6504}
6505
6506void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6507{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006508 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006509
6510 try
6511 {
6512 if (index >= gl::MAX_VERTEX_ATTRIBS)
6513 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006514 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006515 }
6516
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006517 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006518
6519 if (context)
6520 {
6521 GLfloat vals[4] = { values[0], 0, 0, 1 };
6522 context->setVertexAttrib(index, vals);
6523 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006524 }
6525 catch(std::bad_alloc&)
6526 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006527 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006528 }
6529}
6530
6531void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6532{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006533 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006534
6535 try
6536 {
6537 if (index >= gl::MAX_VERTEX_ATTRIBS)
6538 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006539 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006540 }
6541
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006542 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006543
6544 if (context)
6545 {
6546 GLfloat vals[4] = { x, y, 0, 1 };
6547 context->setVertexAttrib(index, vals);
6548 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006549 }
6550 catch(std::bad_alloc&)
6551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006552 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006553 }
6554}
6555
6556void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6557{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006558 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006559
6560 try
6561 {
6562 if (index >= gl::MAX_VERTEX_ATTRIBS)
6563 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006564 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006565 }
6566
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006567 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006568
6569 if (context)
6570 {
6571 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6572 context->setVertexAttrib(index, vals);
6573 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006574 }
6575 catch(std::bad_alloc&)
6576 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006577 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006578 }
6579}
6580
6581void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6582{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006583 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 +00006584
6585 try
6586 {
6587 if (index >= gl::MAX_VERTEX_ATTRIBS)
6588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006589 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006590 }
6591
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006592 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006593
6594 if (context)
6595 {
6596 GLfloat vals[4] = { x, y, z, 1 };
6597 context->setVertexAttrib(index, vals);
6598 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006599 }
6600 catch(std::bad_alloc&)
6601 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006602 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006603 }
6604}
6605
6606void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6607{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006608 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006609
6610 try
6611 {
6612 if (index >= gl::MAX_VERTEX_ATTRIBS)
6613 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006614 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006615 }
6616
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006617 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006618
6619 if (context)
6620 {
6621 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6622 context->setVertexAttrib(index, vals);
6623 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006624 }
6625 catch(std::bad_alloc&)
6626 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006627 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006628 }
6629}
6630
6631void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6632{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006633 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 +00006634
6635 try
6636 {
6637 if (index >= gl::MAX_VERTEX_ATTRIBS)
6638 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006639 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006640 }
6641
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006642 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006643
6644 if (context)
6645 {
6646 GLfloat vals[4] = { x, y, z, w };
6647 context->setVertexAttrib(index, vals);
6648 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006649 }
6650 catch(std::bad_alloc&)
6651 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006652 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006653 }
6654}
6655
6656void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6657{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006658 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006659
6660 try
6661 {
6662 if (index >= gl::MAX_VERTEX_ATTRIBS)
6663 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006664 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006665 }
6666
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006667 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006668
6669 if (context)
6670 {
6671 context->setVertexAttrib(index, values);
6672 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006673 }
6674 catch(std::bad_alloc&)
6675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006676 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006677 }
6678}
6679
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006680void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6681{
6682 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6683
6684 try
6685 {
6686 if (index >= gl::MAX_VERTEX_ATTRIBS)
6687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006688 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006689 }
6690
6691 gl::Context *context = gl::getNonLostContext();
6692
6693 if (context)
6694 {
6695 context->setVertexAttribDivisor(index, divisor);
6696 }
6697 }
6698 catch(std::bad_alloc&)
6699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006700 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006701 }
6702}
6703
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006704void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006705{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006706 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006707 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006708 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006709
6710 try
6711 {
6712 if (index >= gl::MAX_VERTEX_ATTRIBS)
6713 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006714 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006715 }
6716
6717 if (size < 1 || size > 4)
6718 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006719 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006720 }
6721
6722 switch (type)
6723 {
6724 case GL_BYTE:
6725 case GL_UNSIGNED_BYTE:
6726 case GL_SHORT:
6727 case GL_UNSIGNED_SHORT:
6728 case GL_FIXED:
6729 case GL_FLOAT:
6730 break;
6731 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006732 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006733 }
6734
6735 if (stride < 0)
6736 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006737 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006738 }
6739
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006740 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006741
6742 if (context)
6743 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006744 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006745 }
6746 }
6747 catch(std::bad_alloc&)
6748 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006749 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006750 }
6751}
6752
6753void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6754{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006755 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 +00006756
6757 try
6758 {
6759 if (width < 0 || height < 0)
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
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006764 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006765
6766 if (context)
6767 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006768 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006769 }
6770 }
6771 catch(std::bad_alloc&)
6772 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006773 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006774 }
6775}
6776
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006777void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6778 GLbitfield mask, GLenum filter)
6779{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006780 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006781 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6782 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6783 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6784
6785 try
6786 {
6787 switch (filter)
6788 {
6789 case GL_NEAREST:
6790 break;
6791 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006792 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006793 }
6794
6795 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006797 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006798 }
6799
6800 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6801 {
6802 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006803 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006804 }
6805
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006806 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006807
6808 if (context)
6809 {
6810 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6811 {
6812 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006813 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006814 }
6815
6816 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6817 }
6818 }
6819 catch(std::bad_alloc&)
6820 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006821 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006822 }
6823}
6824
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006825void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6826 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006827{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006828 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006829 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006830 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006831 target, level, internalformat, width, height, depth, border, format, type, pixels);
6832
6833 try
6834 {
6835 UNIMPLEMENTED(); // FIXME
6836 }
6837 catch(std::bad_alloc&)
6838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006839 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006840 }
6841}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006842
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006843void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6844 GLenum *binaryFormat, void *binary)
6845{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006846 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 +00006847 program, bufSize, length, binaryFormat, binary);
6848
6849 try
6850 {
6851 gl::Context *context = gl::getNonLostContext();
6852
6853 if (context)
6854 {
6855 gl::Program *programObject = context->getProgram(program);
6856
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006857 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006859 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006860 }
6861
6862 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6863
6864 if (!programBinary)
6865 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006866 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006867 }
6868
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006869 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006871 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006872 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006873
6874 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006875 }
6876 }
6877 catch(std::bad_alloc&)
6878 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006879 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006880 }
6881}
6882
6883void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6884 const void *binary, GLint length)
6885{
6886 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6887 program, binaryFormat, binary, length);
6888
6889 try
6890 {
6891 gl::Context *context = gl::getNonLostContext();
6892
6893 if (context)
6894 {
6895 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006897 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006898 }
6899
6900 gl::Program *programObject = context->getProgram(program);
6901
6902 if (!programObject)
6903 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006904 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006905 }
6906
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006907 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006908 }
6909 }
6910 catch(std::bad_alloc&)
6911 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006912 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006913 }
6914}
6915
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006916__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6917{
6918 struct Extension
6919 {
6920 const char *name;
6921 __eglMustCastToProperFunctionPointerType address;
6922 };
6923
6924 static const Extension glExtensions[] =
6925 {
6926 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006927 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006928 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006929 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6930 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6931 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6932 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6933 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6934 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6935 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006936 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006937 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006938 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6939 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6940 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6941 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006942 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6943 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6944 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6945 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6946 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6947 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6948 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006949 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6950 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6951 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006952 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
6953 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006954
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00006955 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006956 {
6957 if (strcmp(procname, glExtensions[ext].name) == 0)
6958 {
6959 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6960 }
6961 }
6962
6963 return NULL;
6964}
6965
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006966// Non-public functions used by EGL
6967
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006968bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006969{
6970 EVENT("(egl::Surface* surface = 0x%0.8p)",
6971 surface);
6972
6973 try
6974 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006975 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006976
6977 if (context)
6978 {
6979 gl::Texture2D *textureObject = context->getTexture2D();
6980
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006981 if (textureObject->isImmutable())
6982 {
6983 return false;
6984 }
6985
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006986 if (textureObject)
6987 {
6988 textureObject->bindTexImage(surface);
6989 }
6990 }
6991 }
6992 catch(std::bad_alloc&)
6993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006994 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006995 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006996
6997 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006998}
6999
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00007000}