blob: 73406779fab6ea4d89aa302f350acc29a339ae5d [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.com779aa262013-02-28 23:04:58 +00001017 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001018 }
1019
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001020 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001021
1022 if (context)
1023 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001024 if (level > context->getMaximumTextureLevel())
1025 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001026 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001027 }
1028
1029 switch (target)
1030 {
1031 case GL_TEXTURE_2D:
1032 if (width > (context->getMaximumTextureDimension() >> level) ||
1033 height > (context->getMaximumTextureDimension() >> level))
1034 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001035 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001036 }
1037 break;
1038 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1039 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1040 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1041 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1042 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1043 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1044 if (width != height)
1045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001046 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001047 }
1048
1049 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1050 height > (context->getMaximumCubeTextureDimension() >> level))
1051 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001052 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001053 }
1054 break;
1055 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001056 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001057 }
1058
gman@chromium.org50c526d2011-08-10 05:19:44 +00001059 switch (internalformat) {
1060 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1061 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1062 if (!context->supportsDXT1Textures())
1063 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001064 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 +00001065 }
1066 break;
1067 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1068 if (!context->supportsDXT3Textures())
1069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001070 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 +00001071 }
1072 break;
1073 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1074 if (!context->supportsDXT5Textures())
1075 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001076 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 +00001077 }
1078 break;
1079 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001080 }
1081
1082 if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
1083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001084 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001085 }
1086
1087 if (target == GL_TEXTURE_2D)
1088 {
1089 gl::Texture2D *texture = context->getTexture2D();
1090
1091 if (!texture)
1092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001094 }
1095
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001096 if (texture->isImmutable())
1097 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001098 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001099 }
1100
daniel@transgaming.com01868132010-08-24 19:21:17 +00001101 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
1102 }
1103 else
1104 {
1105 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1106
1107 if (!texture)
1108 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001109 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001110 }
1111
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001112 if (texture->isImmutable())
1113 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001114 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001115 }
1116
daniel@transgaming.com01868132010-08-24 19:21:17 +00001117 switch (target)
1118 {
1119 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1120 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1121 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1122 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1123 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1124 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1125 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
1126 break;
1127 default: UNREACHABLE();
1128 }
1129 }
1130 }
1131
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001132 }
1133 catch(std::bad_alloc&)
1134 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001135 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001136 }
1137}
1138
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001139void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1140 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001141{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001142 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001143 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001144 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001145 target, level, xoffset, yoffset, width, height, format, imageSize, data);
1146
1147 try
1148 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001149 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +00001150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001151 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001152 }
1153
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001154 if (xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001155 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001156 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001157 }
1158
daniel@transgaming.com01868132010-08-24 19:21:17 +00001159 switch (format)
daniel@transgaming.com41430492010-03-11 20:36:18 +00001160 {
daniel@transgaming.com01868132010-08-24 19:21:17 +00001161 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1162 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001163 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1164 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00001165 break;
1166 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001167 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com41430492010-03-11 20:36:18 +00001168 }
1169
daniel@transgaming.com01868132010-08-24 19:21:17 +00001170 if (width == 0 || height == 0 || data == NULL)
1171 {
1172 return;
1173 }
1174
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001175 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001176
1177 if (context)
1178 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001179 if (level > context->getMaximumTextureLevel())
1180 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001181 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001182 }
1183
gman@chromium.org50c526d2011-08-10 05:19:44 +00001184 switch (format) {
1185 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1186 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1187 if (!context->supportsDXT1Textures())
1188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001189 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 +00001190 }
1191 break;
1192 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1193 if (!context->supportsDXT3Textures())
1194 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001195 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 +00001196 }
1197 break;
1198 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1199 if (!context->supportsDXT5Textures())
1200 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001201 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 +00001202 }
1203 break;
1204 default: UNREACHABLE();
daniel@transgaming.com01868132010-08-24 19:21:17 +00001205 }
1206
1207 if (imageSize != gl::ComputeCompressedSize(width, height, format))
1208 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001209 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001210 }
1211
1212 if (xoffset % 4 != 0 || yoffset % 4 != 0)
1213 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001214 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 +00001215 // does not exist unless DXT textures are supported.
daniel@transgaming.com01868132010-08-24 19:21:17 +00001216 }
1217
1218 if (target == GL_TEXTURE_2D)
1219 {
1220 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001221 if (validateSubImageParams2D(true, width, height, xoffset, yoffset, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001222 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001223 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001224 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001225 }
1226 else if (gl::IsCubemapTextureTarget(target))
1227 {
1228 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001229 if (validateSubImageParamsCube(true, width, height, xoffset, yoffset, target, level, format, GL_NONE, texture))
daniel@transgaming.com01868132010-08-24 19:21:17 +00001230 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00001231 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
daniel@transgaming.com01868132010-08-24 19:21:17 +00001232 }
daniel@transgaming.com01868132010-08-24 19:21:17 +00001233 }
1234 else
1235 {
1236 UNREACHABLE();
1237 }
1238 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001239 }
1240 catch(std::bad_alloc&)
1241 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001242 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001243 }
1244}
1245
1246void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
1247{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001248 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001249 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001250 target, level, internalformat, x, y, width, height, border);
1251
1252 try
1253 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00001254 if (!validImageSize(level, width, height))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001256 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001257 }
1258
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001259 if (border != 0)
1260 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001261 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001262 }
1263
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001264 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001265
1266 if (context)
1267 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001268 if (level > context->getMaximumTextureLevel())
1269 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001270 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00001271 }
1272
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001273 switch (target)
1274 {
1275 case GL_TEXTURE_2D:
1276 if (width > (context->getMaximumTextureDimension() >> level) ||
1277 height > (context->getMaximumTextureDimension() >> level))
1278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001279 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001280 }
1281 break;
1282 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1283 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1284 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1285 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1286 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1287 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1288 if (width != height)
1289 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001290 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001291 }
1292
1293 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1294 height > (context->getMaximumCubeTextureDimension() >> level))
1295 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001296 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001297 }
1298 break;
1299 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001300 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001301 }
1302
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001303 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001304
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001305 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001307 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001308 }
1309
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001310 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001312 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001313 }
1314
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001315 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001316 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001317
1318 // [OpenGL ES 2.0.24] table 3.9
1319 switch (internalformat)
1320 {
1321 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001322 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001323 colorbufferFormat != GL_RGBA4 &&
1324 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001325 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001326 colorbufferFormat != GL_RGBA8_OES)
1327 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001328 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001329 }
1330 break;
1331 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001332 case GL_RGB:
1333 if (colorbufferFormat != GL_RGB565 &&
1334 colorbufferFormat != GL_RGB8_OES &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001335 colorbufferFormat != GL_RGBA4 &&
1336 colorbufferFormat != GL_RGB5_A1 &&
shannon.woods@transgaming.com28e7ba02013-02-28 23:09:28 +00001337 colorbufferFormat != GL_BGRA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001338 colorbufferFormat != GL_RGBA8_OES)
1339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001340 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001341 }
1342 break;
1343 case GL_LUMINANCE_ALPHA:
1344 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001345 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001346 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_COMPRESSED_RGB_S3TC_DXT1_EXT:
1354 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001355 if (context->supportsDXT1Textures())
1356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001357 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001358 }
1359 else
1360 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001361 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00001362 }
1363 break;
1364 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1365 if (context->supportsDXT3Textures())
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_DXT5_ANGLE:
1375 if (context->supportsDXT5Textures())
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001376 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001377 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001378 }
1379 else
1380 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001381 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001382 }
1383 break;
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001384 case GL_DEPTH_COMPONENT:
1385 case GL_DEPTH_COMPONENT16:
1386 case GL_DEPTH_COMPONENT32_OES:
1387 case GL_DEPTH_STENCIL_OES:
1388 case GL_DEPTH24_STENCIL8_OES:
1389 if (context->supportsDepthTextures())
1390 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001391 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001392 }
1393 else
1394 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001395 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001396 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001397 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001398 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001399 }
1400
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001401 if (target == GL_TEXTURE_2D)
1402 {
1403 gl::Texture2D *texture = context->getTexture2D();
1404
1405 if (!texture)
1406 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001407 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001408 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00001409
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001410 if (texture->isImmutable())
1411 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001412 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001413 }
1414
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001415 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001416 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001417 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001418 {
1419 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1420
1421 if (!texture)
1422 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001423 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001424 }
1425
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001426 if (texture->isImmutable())
1427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001428 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00001429 }
1430
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001431 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001432 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001433 else UNREACHABLE();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001434 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001435 }
1436 catch(std::bad_alloc&)
1437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001438 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001439 }
1440}
1441
1442void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1443{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001444 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001445 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001446 target, level, xoffset, yoffset, x, y, width, height);
1447
1448 try
1449 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00001450 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001452 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001453 }
1454
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001455 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001457 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001458 }
1459
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001460 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1461 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001462 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001463 }
1464
1465 if (width == 0 || height == 0)
1466 {
1467 return;
1468 }
1469
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001470 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001471
1472 if (context)
1473 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001474 if (level > context->getMaximumTextureLevel())
1475 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001476 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00001477 }
1478
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00001479 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001480
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001481 if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1482 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001483 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
daniel@transgaming.combbc57792010-07-28 19:21:05 +00001484 }
1485
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001486 if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
1487 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001488 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00001489 }
1490
daniel@transgaming.comd14558a2011-11-09 17:46:18 +00001491 gl::Renderbuffer *source = framebuffer->getColorbuffer();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00001492 GLenum colorbufferFormat = source->getInternalFormat();
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001493 gl::Texture *texture = NULL;
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001494 GLenum textureFormat = GL_RGBA;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001495
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001496 if (target == GL_TEXTURE_2D)
1497 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001498 gl::Texture2D *tex2d = context->getTexture2D();
1499
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001500 if (!validateSubImageParams2D(false, width, height, xoffset, yoffset, level, GL_NONE, GL_NONE, tex2d))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001501 {
1502 return; // error already registered by validateSubImageParams
1503 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001504 textureFormat = gl::ExtractFormat(tex2d->getInternalFormat(level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001505 texture = tex2d;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001506 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00001507 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001508 {
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001509 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
1510
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001511 if (!validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, GL_NONE, GL_NONE, texcube))
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001512 {
1513 return; // error already registered by validateSubImageParams
1514 }
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001515 textureFormat = gl::ExtractFormat(texcube->getInternalFormat(target, level));
daniel@transgaming.com2ccbbef2012-05-09 15:49:00 +00001516 texture = texcube;
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001517 }
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001518 else UNREACHABLE();
1519
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001520 // [OpenGL ES 2.0.24] table 3.9
1521 switch (textureFormat)
1522 {
1523 case GL_ALPHA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001524 if (colorbufferFormat != GL_ALPHA8_EXT &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001525 colorbufferFormat != GL_RGBA4 &&
1526 colorbufferFormat != GL_RGB5_A1 &&
1527 colorbufferFormat != GL_RGBA8_OES)
1528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001529 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001530 }
1531 break;
1532 case GL_LUMINANCE:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001533 case GL_RGB:
1534 if (colorbufferFormat != GL_RGB565 &&
1535 colorbufferFormat != GL_RGB8_OES &&
1536 colorbufferFormat != GL_RGBA4 &&
1537 colorbufferFormat != GL_RGB5_A1 &&
1538 colorbufferFormat != GL_RGBA8_OES)
1539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001540 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001541 }
1542 break;
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001543 case GL_LUMINANCE_ALPHA:
1544 case GL_RGBA:
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00001545 if (colorbufferFormat != GL_RGBA4 &&
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001546 colorbufferFormat != GL_RGB5_A1 &&
1547 colorbufferFormat != GL_RGBA8_OES)
1548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001550 }
1551 break;
1552 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1553 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00001554 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1555 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001556 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00001557 case GL_DEPTH_COMPONENT:
1558 case GL_DEPTH_STENCIL_OES:
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 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001561 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com3f85fbb2010-10-15 17:58:05 +00001562 }
1563
apatrick@chromium.orgb31f5322011-01-19 19:02:52 +00001564 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, framebuffer);
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001565 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +00001567
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001568 catch(std::bad_alloc&)
1569 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001570 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001571 }
1572}
1573
1574GLuint __stdcall glCreateProgram(void)
1575{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001576 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001577
1578 try
1579 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001580 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001581
1582 if (context)
1583 {
1584 return context->createProgram();
1585 }
1586 }
1587 catch(std::bad_alloc&)
1588 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001589 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001590 }
1591
1592 return 0;
1593}
1594
1595GLuint __stdcall glCreateShader(GLenum type)
1596{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001597 EVENT("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001598
1599 try
1600 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001601 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001602
1603 if (context)
1604 {
1605 switch (type)
1606 {
1607 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001608 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001609 return context->createShader(type);
1610 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001611 return gl::error(GL_INVALID_ENUM, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001612 }
1613 }
1614 }
1615 catch(std::bad_alloc&)
1616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001617 return gl::error(GL_OUT_OF_MEMORY, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001618 }
1619
1620 return 0;
1621}
1622
1623void __stdcall glCullFace(GLenum mode)
1624{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001625 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001626
1627 try
1628 {
1629 switch (mode)
1630 {
1631 case GL_FRONT:
1632 case GL_BACK:
1633 case GL_FRONT_AND_BACK:
1634 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001635 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001636
1637 if (context)
1638 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001639 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001640 }
1641 }
1642 break;
1643 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001644 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001645 }
1646 }
1647 catch(std::bad_alloc&)
1648 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001649 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001650 }
1651}
1652
1653void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1654{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001655 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001656
1657 try
1658 {
1659 if (n < 0)
1660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001661 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001662 }
1663
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001664 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001665
1666 if (context)
1667 {
1668 for (int i = 0; i < n; i++)
1669 {
1670 context->deleteBuffer(buffers[i]);
1671 }
1672 }
1673 }
1674 catch(std::bad_alloc&)
1675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001676 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001677 }
1678}
1679
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001680void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1681{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001682 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001683
1684 try
1685 {
1686 if (n < 0)
1687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001688 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001689 }
1690
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001691 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001692
1693 if (context)
1694 {
1695 for (int i = 0; i < n; i++)
1696 {
1697 context->deleteFence(fences[i]);
1698 }
1699 }
1700 }
1701 catch(std::bad_alloc&)
1702 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001703 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00001704 }
1705}
1706
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001707void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1708{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001709 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710
1711 try
1712 {
1713 if (n < 0)
1714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001715 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001716 }
1717
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001718 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001719
1720 if (context)
1721 {
1722 for (int i = 0; i < n; i++)
1723 {
1724 if (framebuffers[i] != 0)
1725 {
1726 context->deleteFramebuffer(framebuffers[i]);
1727 }
1728 }
1729 }
1730 }
1731 catch(std::bad_alloc&)
1732 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001733 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001734 }
1735}
1736
1737void __stdcall glDeleteProgram(GLuint program)
1738{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001739 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001740
1741 try
1742 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001743 if (program == 0)
1744 {
1745 return;
1746 }
1747
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001748 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001749
1750 if (context)
1751 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001752 if (!context->getProgram(program))
1753 {
1754 if(context->getShader(program))
1755 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001756 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001757 }
1758 else
1759 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001760 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001761 }
1762 }
1763
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001764 context->deleteProgram(program);
1765 }
1766 }
1767 catch(std::bad_alloc&)
1768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001769 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001770 }
1771}
1772
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001773void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1774{
1775 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1776
1777 try
1778 {
1779 if (n < 0)
1780 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001781 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001782 }
1783
1784 gl::Context *context = gl::getNonLostContext();
1785
1786 if (context)
1787 {
1788 for (int i = 0; i < n; i++)
1789 {
1790 context->deleteQuery(ids[i]);
1791 }
1792 }
1793 }
1794 catch(std::bad_alloc&)
1795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001796 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00001797 }
1798}
1799
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001800void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1801{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001802 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001803
1804 try
1805 {
1806 if (n < 0)
1807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001808 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001809 }
1810
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812
1813 if (context)
1814 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001815 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001816 {
1817 context->deleteRenderbuffer(renderbuffers[i]);
1818 }
1819 }
1820 }
1821 catch(std::bad_alloc&)
1822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001824 }
1825}
1826
1827void __stdcall glDeleteShader(GLuint shader)
1828{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001829 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001830
1831 try
1832 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001833 if (shader == 0)
1834 {
1835 return;
1836 }
1837
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001838 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001839
1840 if (context)
1841 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001842 if (!context->getShader(shader))
1843 {
1844 if(context->getProgram(shader))
1845 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001846 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001847 }
1848 else
1849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001850 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001851 }
1852 }
1853
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001854 context->deleteShader(shader);
1855 }
1856 }
1857 catch(std::bad_alloc&)
1858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001860 }
1861}
1862
1863void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001865 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001866
1867 try
1868 {
1869 if (n < 0)
1870 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001871 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001872 }
1873
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001874 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001875
1876 if (context)
1877 {
1878 for (int i = 0; i < n; i++)
1879 {
1880 if (textures[i] != 0)
1881 {
1882 context->deleteTexture(textures[i]);
1883 }
1884 }
1885 }
1886 }
1887 catch(std::bad_alloc&)
1888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001889 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001890 }
1891}
1892
1893void __stdcall glDepthFunc(GLenum func)
1894{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001895 EVENT("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001896
1897 try
1898 {
1899 switch (func)
1900 {
1901 case GL_NEVER:
1902 case GL_ALWAYS:
1903 case GL_LESS:
1904 case GL_LEQUAL:
1905 case GL_EQUAL:
1906 case GL_GREATER:
1907 case GL_GEQUAL:
1908 case GL_NOTEQUAL:
1909 break;
1910 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001911 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001912 }
1913
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001914 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001915
1916 if (context)
1917 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001918 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001919 }
1920 }
1921 catch(std::bad_alloc&)
1922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001924 }
1925}
1926
1927void __stdcall glDepthMask(GLboolean flag)
1928{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001929 EVENT("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001930
1931 try
1932 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001933 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001934
1935 if (context)
1936 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001937 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001938 }
1939 }
1940 catch(std::bad_alloc&)
1941 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001942 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943 }
1944}
1945
1946void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1947{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001948 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949
1950 try
1951 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001952 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953
1954 if (context)
1955 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001956 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001957 }
1958 }
1959 catch(std::bad_alloc&)
1960 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001961 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962 }
1963}
1964
1965void __stdcall glDetachShader(GLuint program, GLuint shader)
1966{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00001967 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968
1969 try
1970 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00001971 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001972
1973 if (context)
1974 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001975
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001976 gl::Program *programObject = context->getProgram(program);
1977 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001978
1979 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001981 gl::Shader *shaderByProgramHandle;
1982 shaderByProgramHandle = context->getShader(program);
1983 if (!shaderByProgramHandle)
1984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001985 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001986 }
1987 else
1988 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001989 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001990 }
1991 }
1992
1993 if (!shaderObject)
1994 {
1995 gl::Program *programByShaderHandle = context->getProgram(shader);
1996 if (!programByShaderHandle)
1997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00001998 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001999 }
2000 else
2001 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002002 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00002003 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002004 }
2005
2006 if (!programObject->detachShader(shaderObject))
2007 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002008 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002009 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002010 }
2011 }
2012 catch(std::bad_alloc&)
2013 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002014 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002015 }
2016}
2017
2018void __stdcall glDisable(GLenum cap)
2019{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002020 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021
2022 try
2023 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002024 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002025
2026 if (context)
2027 {
2028 switch (cap)
2029 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002030 case GL_CULL_FACE: context->setCullFace(false); break;
2031 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
2032 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
2033 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
2034 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
2035 case GL_STENCIL_TEST: context->setStencilTest(false); break;
2036 case GL_DEPTH_TEST: context->setDepthTest(false); break;
2037 case GL_BLEND: context->setBlend(false); break;
2038 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002039 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002040 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041 }
2042 }
2043 }
2044 catch(std::bad_alloc&)
2045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002046 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002047 }
2048}
2049
2050void __stdcall glDisableVertexAttribArray(GLuint index)
2051{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002052 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002053
2054 try
2055 {
2056 if (index >= gl::MAX_VERTEX_ATTRIBS)
2057 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002058 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002059 }
2060
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002061 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002062
2063 if (context)
2064 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002065 context->setEnableVertexAttribArray(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002066 }
2067 }
2068 catch(std::bad_alloc&)
2069 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002070 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002071 }
2072}
2073
2074void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
2075{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002076 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002077
2078 try
2079 {
2080 if (count < 0 || first < 0)
2081 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002082 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002083 }
2084
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002085 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002086
2087 if (context)
2088 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002089 context->drawArrays(mode, first, count, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002090 }
2091 }
2092 catch(std::bad_alloc&)
2093 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002094 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002095 }
2096}
2097
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002098void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
2099{
2100 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
2101
2102 try
2103 {
2104 if (count < 0 || first < 0 || primcount < 0)
2105 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002106 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002107 }
2108
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002109 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002110 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002111 gl::Context *context = gl::getNonLostContext();
2112
2113 if (context)
2114 {
2115 context->drawArrays(mode, first, count, primcount);
2116 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002117 }
2118 }
2119 catch(std::bad_alloc&)
2120 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002121 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002122 }
2123}
2124
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002125void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002126{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002127 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 +00002128 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002129
2130 try
2131 {
2132 if (count < 0)
2133 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002134 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135 }
2136
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002137 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002138
2139 if (context)
2140 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002141 switch (type)
2142 {
2143 case GL_UNSIGNED_BYTE:
2144 case GL_UNSIGNED_SHORT:
2145 break;
2146 case GL_UNSIGNED_INT:
2147 if (!context->supports32bitIndices())
2148 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002149 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002150 }
2151 break;
2152 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002153 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com83921382011-01-08 05:46:00 +00002154 }
2155
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002156 context->drawElements(mode, count, type, indices, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002157 }
2158 }
2159 catch(std::bad_alloc&)
2160 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002161 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002162 }
2163}
2164
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002165void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
2166{
2167 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
2168 mode, count, type, indices, primcount);
2169
2170 try
2171 {
2172 if (count < 0 || primcount < 0)
2173 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002174 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002175 }
2176
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002177 if (primcount > 0)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002178 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002179 gl::Context *context = gl::getNonLostContext();
2180
2181 if (context)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002182 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002183 switch (type)
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002184 {
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002185 case GL_UNSIGNED_BYTE:
2186 case GL_UNSIGNED_SHORT:
2187 break;
2188 case GL_UNSIGNED_INT:
2189 if (!context->supports32bitIndices())
2190 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002191 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002192 }
2193 break;
2194 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002195 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002196 }
daniel@transgaming.com8ca9c6e2012-01-27 15:38:54 +00002197
2198 context->drawElements(mode, count, type, indices, primcount);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002199 }
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002200 }
2201 }
2202 catch(std::bad_alloc&)
2203 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002204 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00002205 }
2206}
2207
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002208void __stdcall glEnable(GLenum cap)
2209{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002210 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002211
2212 try
2213 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002214 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002215
2216 if (context)
2217 {
2218 switch (cap)
2219 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002220 case GL_CULL_FACE: context->setCullFace(true); break;
2221 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
2222 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
2223 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
2224 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
2225 case GL_STENCIL_TEST: context->setStencilTest(true); break;
2226 case GL_DEPTH_TEST: context->setDepthTest(true); break;
2227 case GL_BLEND: context->setBlend(true); break;
2228 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002230 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002231 }
2232 }
2233 }
2234 catch(std::bad_alloc&)
2235 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002236 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002237 }
2238}
2239
2240void __stdcall glEnableVertexAttribArray(GLuint index)
2241{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002242 EVENT("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002243
2244 try
2245 {
2246 if (index >= gl::MAX_VERTEX_ATTRIBS)
2247 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002248 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002249 }
2250
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002251 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002252
2253 if (context)
2254 {
daniel@transgaming.com83921382011-01-08 05:46:00 +00002255 context->setEnableVertexAttribArray(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002256 }
2257 }
2258 catch(std::bad_alloc&)
2259 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002260 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002261 }
2262}
2263
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002264void __stdcall glEndQueryEXT(GLenum target)
2265{
2266 EVENT("GLenum target = 0x%X)", target);
2267
2268 try
2269 {
2270 switch (target)
2271 {
2272 case GL_ANY_SAMPLES_PASSED_EXT:
2273 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
2274 break;
2275 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002276 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002277 }
2278
2279 gl::Context *context = gl::getNonLostContext();
2280
2281 if (context)
2282 {
2283 context->endQuery(target);
2284 }
2285 }
2286 catch(std::bad_alloc&)
2287 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002288 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002289 }
2290}
2291
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002292void __stdcall glFinishFenceNV(GLuint fence)
2293{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002294 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002295
2296 try
2297 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002298 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002299
2300 if (context)
2301 {
2302 gl::Fence* fenceObject = context->getFence(fence);
2303
2304 if (fenceObject == NULL)
2305 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002306 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002307 }
2308
2309 fenceObject->finishFence();
2310 }
2311 }
2312 catch(std::bad_alloc&)
2313 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002314 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002315 }
2316}
2317
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002318void __stdcall glFinish(void)
2319{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002320 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002321
2322 try
2323 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002324 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002325
2326 if (context)
2327 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002328 context->sync(true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002329 }
2330 }
2331 catch(std::bad_alloc&)
2332 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002333 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002334 }
2335}
2336
2337void __stdcall glFlush(void)
2338{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002339 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002340
2341 try
2342 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002343 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002344
2345 if (context)
2346 {
daniel@transgaming.com0d86aa72011-10-26 02:35:10 +00002347 context->sync(false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348 }
2349 }
2350 catch(std::bad_alloc&)
2351 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002352 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
2354}
2355
2356void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
2357{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002358 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002359 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002360
2361 try
2362 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002363 if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002364 || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002365 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002366 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002367 }
2368
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002369 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370
2371 if (context)
2372 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002373 gl::Framebuffer *framebuffer = NULL;
2374 GLuint framebufferHandle = 0;
2375 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2376 {
2377 framebuffer = context->getReadFramebuffer();
2378 framebufferHandle = context->getReadFramebufferHandle();
2379 }
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002380 else
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002381 {
2382 framebuffer = context->getDrawFramebuffer();
2383 framebufferHandle = context->getDrawFramebufferHandle();
2384 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002385
daniel@transgaming.com2fa45512011-10-04 18:43:18 +00002386 if (!framebuffer || (framebufferHandle == 0 && renderbuffer != 0))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002387 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002388 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389 }
2390
2391 switch (attachment)
2392 {
2393 case GL_COLOR_ATTACHMENT0:
2394 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
2395 break;
2396 case GL_DEPTH_ATTACHMENT:
2397 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2398 break;
2399 case GL_STENCIL_ATTACHMENT:
2400 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2401 break;
2402 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002403 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002404 }
2405 }
2406 }
2407 catch(std::bad_alloc&)
2408 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002409 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002410 }
2411}
2412
2413void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2414{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002415 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002416 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417
2418 try
2419 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002420 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002422 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423 }
2424
2425 switch (attachment)
2426 {
2427 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002428 case GL_DEPTH_ATTACHMENT:
2429 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 break;
2431 default:
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
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002435 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002436
2437 if (context)
2438 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002439 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002440 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002441 textarget = GL_NONE;
2442 }
2443 else
2444 {
2445 gl::Texture *tex = context->getTexture(texture);
2446
2447 if (tex == NULL)
2448 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002449 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002450 }
2451
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002452 switch (textarget)
2453 {
2454 case GL_TEXTURE_2D:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002455 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002456 if (tex->getTarget() != GL_TEXTURE_2D)
2457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002458 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002459 }
2460 gl::Texture2D *tex2d = static_cast<gl::Texture2D *>(tex);
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002461 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002462 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002463 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002464 }
2465 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002467
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002468 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002470 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002471 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002473 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002474 {
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002475 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2476 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002477 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002478 }
2479 gl::TextureCubeMap *texcube = static_cast<gl::TextureCubeMap *>(tex);
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002480 if (texcube->isCompressed(textarget, level))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002481 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002482 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002483 }
2484 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002485 }
daniel@transgaming.com93a81472010-04-20 18:52:58 +00002486
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002487 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002488 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002489 }
2490
2491 if (level != 0)
2492 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002493 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002494 }
2495 }
2496
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002497 gl::Framebuffer *framebuffer = NULL;
2498 GLuint framebufferHandle = 0;
2499 if (target == GL_READ_FRAMEBUFFER_ANGLE)
2500 {
2501 framebuffer = context->getReadFramebuffer();
2502 framebufferHandle = context->getReadFramebufferHandle();
2503 }
2504 else
2505 {
2506 framebuffer = context->getDrawFramebuffer();
2507 framebufferHandle = context->getDrawFramebufferHandle();
2508 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002509
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00002510 if (framebufferHandle == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002511 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002512 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002513 }
2514
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002515 switch (attachment)
2516 {
2517 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
2518 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
2519 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2520 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002521 }
2522 }
2523 catch(std::bad_alloc&)
2524 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002525 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002526 }
2527}
2528
2529void __stdcall glFrontFace(GLenum mode)
2530{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002531 EVENT("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002532
2533 try
2534 {
2535 switch (mode)
2536 {
2537 case GL_CW:
2538 case GL_CCW:
2539 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002540 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002541
2542 if (context)
2543 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002544 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002545 }
2546 }
2547 break;
2548 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002549 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550 }
2551 }
2552 catch(std::bad_alloc&)
2553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002554 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555 }
2556}
2557
2558void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2559{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002560 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002561
2562 try
2563 {
2564 if (n < 0)
2565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002566 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002567 }
2568
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002569 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002570
2571 if (context)
2572 {
2573 for (int i = 0; i < n; i++)
2574 {
2575 buffers[i] = context->createBuffer();
2576 }
2577 }
2578 }
2579 catch(std::bad_alloc&)
2580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002581 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002582 }
2583}
2584
2585void __stdcall glGenerateMipmap(GLenum target)
2586{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002587 EVENT("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588
2589 try
2590 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002591 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002592
2593 if (context)
2594 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002595 switch (target)
2596 {
2597 case GL_TEXTURE_2D:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002598 {
2599 gl::Texture2D *tex2d = context->getTexture2D();
2600
daniel@transgaming.com92f49922012-05-09 15:49:19 +00002601 if (tex2d->isCompressed(0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002602 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002603 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002604 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002605 if (tex2d->isDepth(0))
2606 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002607 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00002608 }
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002609
2610 tex2d->generateMipmaps();
2611 break;
2612 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002613
2614 case GL_TEXTURE_CUBE_MAP:
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002615 {
2616 gl::TextureCubeMap *texcube = context->getTextureCubeMap();
2617
daniel@transgaming.com4df88e82012-05-09 15:49:24 +00002618 if (texcube->isCompressed(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0))
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002619 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002620 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comeb3c01a2012-05-09 15:49:12 +00002621 }
2622
2623 texcube->generateMipmaps();
2624 break;
2625 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002626
2627 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002628 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002629 }
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00002630 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002631 }
2632 catch(std::bad_alloc&)
2633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002634 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635 }
2636}
2637
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002638void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2639{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002640 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002641
2642 try
2643 {
2644 if (n < 0)
2645 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002646 return gl::error(GL_INVALID_VALUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002647 }
2648
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002649 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002650
2651 if (context)
2652 {
2653 for (int i = 0; i < n; i++)
2654 {
2655 fences[i] = context->createFence();
2656 }
2657 }
2658 }
2659 catch(std::bad_alloc&)
2660 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002661 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00002662 }
2663}
2664
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002665void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2666{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002667 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002668
2669 try
2670 {
2671 if (n < 0)
2672 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002673 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002674 }
2675
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002676 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002677
2678 if (context)
2679 {
2680 for (int i = 0; i < n; i++)
2681 {
2682 framebuffers[i] = context->createFramebuffer();
2683 }
2684 }
2685 }
2686 catch(std::bad_alloc&)
2687 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002688 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002689 }
2690}
2691
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002692void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2693{
2694 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2695
2696 try
2697 {
2698 if (n < 0)
2699 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002700 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002701 }
2702
2703 gl::Context *context = gl::getNonLostContext();
2704
2705 if (context)
2706 {
2707 for (int i = 0; i < n; i++)
2708 {
2709 ids[i] = context->createQuery();
2710 }
2711 }
2712 }
2713 catch(std::bad_alloc&)
2714 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002715 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00002716 }
2717}
2718
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002719void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2720{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002721 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002722
2723 try
2724 {
2725 if (n < 0)
2726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002728 }
2729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002731
2732 if (context)
2733 {
2734 for (int i = 0; i < n; i++)
2735 {
2736 renderbuffers[i] = context->createRenderbuffer();
2737 }
2738 }
2739 }
2740 catch(std::bad_alloc&)
2741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002742 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743 }
2744}
2745
2746void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2747{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002748 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002749
2750 try
2751 {
2752 if (n < 0)
2753 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002754 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002755 }
2756
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002757 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002758
2759 if (context)
2760 {
2761 for (int i = 0; i < n; i++)
2762 {
2763 textures[i] = context->createTexture();
2764 }
2765 }
2766 }
2767 catch(std::bad_alloc&)
2768 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002769 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002770 }
2771}
2772
daniel@transgaming.com85423182010-04-22 13:35:27 +00002773void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002774{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002775 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
daniel@transgaming.com85423182010-04-22 13:35:27 +00002776 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002777 program, index, bufsize, length, size, type, name);
2778
2779 try
2780 {
2781 if (bufsize < 0)
2782 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002783 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002784 }
2785
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002786 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com85423182010-04-22 13:35:27 +00002787
2788 if (context)
2789 {
2790 gl::Program *programObject = context->getProgram(program);
2791
2792 if (!programObject)
2793 {
2794 if (context->getShader(program))
2795 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002796 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002797 }
2798 else
2799 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002800 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002801 }
2802 }
2803
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002804 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00002805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002806 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com85423182010-04-22 13:35:27 +00002807 }
2808
2809 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2810 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002811 }
2812 catch(std::bad_alloc&)
2813 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002814 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002815 }
2816}
2817
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002818void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002819{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002820 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002821 "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 +00002822 program, index, bufsize, length, size, type, name);
2823
2824 try
2825 {
2826 if (bufsize < 0)
2827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002828 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002829 }
2830
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002831 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002832
2833 if (context)
2834 {
2835 gl::Program *programObject = context->getProgram(program);
2836
2837 if (!programObject)
2838 {
2839 if (context->getShader(program))
2840 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002841 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002842 }
2843 else
2844 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002845 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002846 }
2847 }
2848
2849 if (index >= (GLuint)programObject->getActiveUniformCount())
2850 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002851 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002852 }
2853
2854 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2855 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002856 }
2857 catch(std::bad_alloc&)
2858 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002859 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002860 }
2861}
2862
2863void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2864{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002865 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 +00002866 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002867
2868 try
2869 {
2870 if (maxcount < 0)
2871 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002872 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002873 }
2874
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002875 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002876
2877 if (context)
2878 {
2879 gl::Program *programObject = context->getProgram(program);
2880
2881 if (!programObject)
2882 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002883 if (context->getShader(program))
2884 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002885 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002886 }
2887 else
2888 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002889 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com23953e32010-04-13 19:53:31 +00002890 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002891 }
2892
2893 return programObject->getAttachedShaders(maxcount, count, shaders);
2894 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002895 }
2896 catch(std::bad_alloc&)
2897 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002898 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002899 }
2900}
2901
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002902int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002903{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002904 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002905
2906 try
2907 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002908 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002909
2910 if (context)
2911 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002912
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002913 gl::Program *programObject = context->getProgram(program);
2914
2915 if (!programObject)
2916 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002917 if (context->getShader(program))
2918 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002919 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002920 }
2921 else
2922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002923 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002924 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002925 }
2926
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002927 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00002928 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002929 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002930 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002931 }
2932
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00002933 return programBinary->getAttributeLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934 }
2935 }
2936 catch(std::bad_alloc&)
2937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002938 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939 }
2940
2941 return -1;
2942}
2943
2944void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2945{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00002946 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002947
2948 try
2949 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00002950 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002951
2952 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002953 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002954 if (!(context->getBooleanv(pname, params)))
2955 {
2956 GLenum nativeType;
2957 unsigned int numParams = 0;
2958 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00002959 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002960
2961 if (numParams == 0)
2962 return; // it is known that the pname is valid, but there are no parameters to return
2963
2964 if (nativeType == GL_FLOAT)
2965 {
2966 GLfloat *floatParams = NULL;
2967 floatParams = new GLfloat[numParams];
2968
2969 context->getFloatv(pname, floatParams);
2970
2971 for (unsigned int i = 0; i < numParams; ++i)
2972 {
2973 if (floatParams[i] == 0.0f)
2974 params[i] = GL_FALSE;
2975 else
2976 params[i] = GL_TRUE;
2977 }
2978
2979 delete [] floatParams;
2980 }
2981 else if (nativeType == GL_INT)
2982 {
2983 GLint *intParams = NULL;
2984 intParams = new GLint[numParams];
2985
2986 context->getIntegerv(pname, intParams);
2987
2988 for (unsigned int i = 0; i < numParams; ++i)
2989 {
2990 if (intParams[i] == 0)
2991 params[i] = GL_FALSE;
2992 else
2993 params[i] = GL_TRUE;
2994 }
2995
2996 delete [] intParams;
2997 }
2998 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002999 }
3000 }
3001 catch(std::bad_alloc&)
3002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003003 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003004 }
3005}
3006
3007void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
3008{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003009 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 +00003010
3011 try
3012 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003013 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003014
3015 if (context)
3016 {
3017 gl::Buffer *buffer;
3018
3019 switch (target)
3020 {
3021 case GL_ARRAY_BUFFER:
3022 buffer = context->getArrayBuffer();
3023 break;
3024 case GL_ELEMENT_ARRAY_BUFFER:
3025 buffer = context->getElementArrayBuffer();
3026 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003027 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003028 }
3029
3030 if (!buffer)
3031 {
3032 // A null buffer means that "0" is bound to the requested buffer target
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003033 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003034 }
3035
3036 switch (pname)
3037 {
3038 case GL_BUFFER_USAGE:
3039 *params = buffer->usage();
3040 break;
3041 case GL_BUFFER_SIZE:
3042 *params = buffer->size();
3043 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003044 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00003045 }
3046 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003047 }
3048 catch(std::bad_alloc&)
3049 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003050 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003051 }
3052}
3053
3054GLenum __stdcall glGetError(void)
3055{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003056 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003057
3058 gl::Context *context = gl::getContext();
3059
3060 if (context)
3061 {
daniel@transgaming.com82b28912011-12-12 21:01:35 +00003062 return context->getError();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063 }
3064
3065 return GL_NO_ERROR;
3066}
3067
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003068void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
3069{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003070 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003071
3072 try
3073 {
3074
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003075 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003076
3077 if (context)
3078 {
3079 gl::Fence *fenceObject = context->getFence(fence);
3080
3081 if (fenceObject == NULL)
3082 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003083 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003084 }
3085
3086 fenceObject->getFenceiv(pname, params);
3087 }
3088 }
3089 catch(std::bad_alloc&)
3090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003091 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00003092 }
3093}
3094
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003095void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
3096{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003097 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003098
3099 try
3100 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003101 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003102
3103 if (context)
3104 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003105 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003106 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003107 GLenum nativeType;
3108 unsigned int numParams = 0;
3109 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003110 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003111
3112 if (numParams == 0)
3113 return; // it is known that the pname is valid, but that there are no parameters to return.
3114
3115 if (nativeType == GL_BOOL)
3116 {
3117 GLboolean *boolParams = NULL;
3118 boolParams = new GLboolean[numParams];
3119
3120 context->getBooleanv(pname, boolParams);
3121
3122 for (unsigned int i = 0; i < numParams; ++i)
3123 {
3124 if (boolParams[i] == GL_FALSE)
3125 params[i] = 0.0f;
3126 else
3127 params[i] = 1.0f;
3128 }
3129
3130 delete [] boolParams;
3131 }
3132 else if (nativeType == GL_INT)
3133 {
3134 GLint *intParams = NULL;
3135 intParams = new GLint[numParams];
3136
3137 context->getIntegerv(pname, intParams);
3138
3139 for (unsigned int i = 0; i < numParams; ++i)
3140 {
3141 params[i] = (GLfloat)intParams[i];
3142 }
3143
3144 delete [] intParams;
3145 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003146 }
3147 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003148 }
3149 catch(std::bad_alloc&)
3150 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003151 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003152 }
3153}
3154
3155void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
3156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003157 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 +00003158 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003159
3160 try
3161 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003162 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003163
3164 if (context)
3165 {
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003166 if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003167 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003168 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003169 }
3170
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003171 gl::Framebuffer *framebuffer = NULL;
3172 if (target == GL_READ_FRAMEBUFFER_ANGLE)
3173 {
3174 if(context->getReadFramebufferHandle() == 0)
3175 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003176 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003177 }
3178
3179 framebuffer = context->getReadFramebuffer();
3180 }
3181 else
3182 {
3183 if (context->getDrawFramebufferHandle() == 0)
3184 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003185 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003186 }
3187
3188 framebuffer = context->getDrawFramebuffer();
3189 }
3190
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003191 GLenum attachmentType;
3192 GLuint attachmentHandle;
3193 switch (attachment)
3194 {
3195 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003196 attachmentType = framebuffer->getColorbufferType();
3197 attachmentHandle = framebuffer->getColorbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003198 break;
3199 case GL_DEPTH_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003200 attachmentType = framebuffer->getDepthbufferType();
3201 attachmentHandle = framebuffer->getDepthbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003202 break;
3203 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +00003204 attachmentType = framebuffer->getStencilbufferType();
3205 attachmentHandle = framebuffer->getStencilbufferHandle();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003206 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003207 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003208 }
3209
3210 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00003211 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003212 {
3213 attachmentObjectType = attachmentType;
3214 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +00003215 else if (gl::IsInternalTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003216 {
3217 attachmentObjectType = GL_TEXTURE;
3218 }
apatrick@chromium.orga1d80592012-01-25 21:52:10 +00003219 else
3220 {
3221 UNREACHABLE();
3222 return;
3223 }
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003224
3225 switch (pname)
3226 {
3227 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3228 *params = attachmentObjectType;
3229 break;
3230 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3231 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
3232 {
3233 *params = attachmentHandle;
3234 }
3235 else
3236 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003238 }
3239 break;
3240 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
3241 if (attachmentObjectType == GL_TEXTURE)
3242 {
3243 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
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_CUBE_MAP_FACE:
3251 if (attachmentObjectType == GL_TEXTURE)
3252 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00003253 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003254 {
3255 *params = attachmentType;
3256 }
3257 else
3258 {
3259 *params = 0;
3260 }
3261 }
3262 else
3263 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003264 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003265 }
3266 break;
3267 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003268 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00003269 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003270 }
3271 }
3272 catch(std::bad_alloc&)
3273 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003274 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003275 }
3276}
3277
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00003278GLenum __stdcall glGetGraphicsResetStatusEXT(void)
3279{
3280 EVENT("()");
3281
3282 try
3283 {
3284 gl::Context *context = gl::getContext();
3285
3286 if (context)
3287 {
3288 return context->getResetStatus();
3289 }
3290
3291 return GL_NO_ERROR;
3292 }
3293 catch(std::bad_alloc&)
3294 {
3295 return GL_OUT_OF_MEMORY;
3296 }
3297}
3298
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003299void __stdcall glGetIntegerv(GLenum pname, GLint* params)
3300{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003301 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003302
3303 try
3304 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003305 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003306
3307 if (context)
3308 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003309 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003310 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003311 GLenum nativeType;
3312 unsigned int numParams = 0;
3313 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003314 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003315
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003316 if (numParams == 0)
3317 return; // it is known that pname is valid, but there are no parameters to return
3318
3319 if (nativeType == GL_BOOL)
3320 {
3321 GLboolean *boolParams = NULL;
3322 boolParams = new GLboolean[numParams];
3323
3324 context->getBooleanv(pname, boolParams);
3325
3326 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003327 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003328 if (boolParams[i] == GL_FALSE)
3329 params[i] = 0;
3330 else
3331 params[i] = 1;
3332 }
3333
3334 delete [] boolParams;
3335 }
3336 else if (nativeType == GL_FLOAT)
3337 {
3338 GLfloat *floatParams = NULL;
3339 floatParams = new GLfloat[numParams];
3340
3341 context->getFloatv(pname, floatParams);
3342
3343 for (unsigned int i = 0; i < numParams; ++i)
3344 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00003345 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 +00003346 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003347 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003348 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003349 else
3350 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 +00003351 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003352
daniel@transgaming.com777f2672010-04-07 03:25:16 +00003353 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003355 }
3356 }
3357 }
3358 catch(std::bad_alloc&)
3359 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003360 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003361 }
3362}
3363
3364void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
3365{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003366 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367
3368 try
3369 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003370 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003371
3372 if (context)
3373 {
3374 gl::Program *programObject = context->getProgram(program);
3375
3376 if (!programObject)
3377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003378 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003379 }
3380
3381 switch (pname)
3382 {
3383 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003384 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003385 return;
3386 case GL_LINK_STATUS:
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003387 *params = programObject->isLinked();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003388 return;
3389 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00003390 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003391 return;
3392 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003393 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003394 return;
3395 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003396 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003397 return;
3398 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003399 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400 return;
3401 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00003402 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 return;
3404 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003405 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 return;
3407 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00003408 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003409 return;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003410 case GL_PROGRAM_BINARY_LENGTH_OES:
apatrick@chromium.org90080e32012-07-09 22:15:33 +00003411 *params = programObject->getProgramBinaryLength();
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00003412 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003413 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003414 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003415 }
3416 }
3417 }
3418 catch(std::bad_alloc&)
3419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003420 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003421 }
3422}
3423
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003424void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003425{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003426 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 +00003427 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003428
3429 try
3430 {
3431 if (bufsize < 0)
3432 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003433 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003434 }
3435
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003436 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003437
3438 if (context)
3439 {
3440 gl::Program *programObject = context->getProgram(program);
3441
3442 if (!programObject)
3443 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003444 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003445 }
3446
3447 programObject->getInfoLog(bufsize, length, infolog);
3448 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003449 }
3450 catch(std::bad_alloc&)
3451 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003452 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453 }
3454}
3455
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003456void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3457{
3458 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3459
3460 try
3461 {
3462 switch (pname)
3463 {
3464 case GL_CURRENT_QUERY_EXT:
3465 break;
3466 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003467 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003468 }
3469
3470 gl::Context *context = gl::getNonLostContext();
3471
3472 if (context)
3473 {
3474 params[0] = context->getActiveQuery(target);
3475 }
3476 }
3477 catch(std::bad_alloc&)
3478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003479 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003480 }
3481}
3482
3483void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3484{
3485 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3486
3487 try
3488 {
3489 switch (pname)
3490 {
3491 case GL_QUERY_RESULT_EXT:
3492 case GL_QUERY_RESULT_AVAILABLE_EXT:
3493 break;
3494 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003495 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003496 }
3497 gl::Context *context = gl::getNonLostContext();
3498
3499 if (context)
3500 {
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003501 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3502
3503 if (!queryObject)
3504 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003505 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003506 }
3507
3508 if (context->getActiveQuery(queryObject->getType()) == id)
3509 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003510 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003511 }
3512
3513 switch(pname)
3514 {
3515 case GL_QUERY_RESULT_EXT:
3516 params[0] = queryObject->getResult();
3517 break;
3518 case GL_QUERY_RESULT_AVAILABLE_EXT:
3519 params[0] = queryObject->isResultAvailable();
3520 break;
3521 default:
3522 ASSERT(false);
3523 }
3524 }
3525 }
3526 catch(std::bad_alloc&)
3527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003528 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00003529 }
3530}
3531
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003532void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3533{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003534 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 +00003535
3536 try
3537 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003538 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003539
3540 if (context)
3541 {
3542 if (target != GL_RENDERBUFFER)
3543 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003544 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003545 }
3546
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003547 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003548 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003549 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003550 }
3551
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003552 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003553
3554 switch (pname)
3555 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003556 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3557 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3558 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
3559 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3560 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3561 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3562 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3563 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3564 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003565 case GL_RENDERBUFFER_SAMPLES_ANGLE:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003566 if (context->getMaxSupportedSamples() != 0)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003567 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +00003568 *params = renderbuffer->getSamples();
3569 }
3570 else
3571 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003572 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00003573 }
3574 break;
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003575 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003576 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00003577 }
3578 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003579 }
3580 catch(std::bad_alloc&)
3581 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003582 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003583 }
3584}
3585
3586void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3587{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003588 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003589
3590 try
3591 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003592 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003593
3594 if (context)
3595 {
3596 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003597
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003598 if (!shaderObject)
3599 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003600 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003601 }
3602
3603 switch (pname)
3604 {
3605 case GL_SHADER_TYPE:
3606 *params = shaderObject->getType();
3607 return;
3608 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003609 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003610 return;
3611 case GL_COMPILE_STATUS:
3612 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3613 return;
3614 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003615 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003616 return;
3617 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003618 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003619 return;
zmo@google.coma574f782011-10-03 21:45:23 +00003620 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3621 *params = shaderObject->getTranslatedSourceLength();
3622 return;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003623 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003624 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625 }
3626 }
3627 }
3628 catch(std::bad_alloc&)
3629 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003630 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003631 }
3632}
3633
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003634void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003635{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003636 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 +00003637 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003638
3639 try
3640 {
3641 if (bufsize < 0)
3642 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003643 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644 }
3645
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003646 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003647
3648 if (context)
3649 {
3650 gl::Shader *shaderObject = context->getShader(shader);
3651
3652 if (!shaderObject)
3653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003654 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003655 }
3656
3657 shaderObject->getInfoLog(bufsize, length, infolog);
3658 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003659 }
3660 catch(std::bad_alloc&)
3661 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003662 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663 }
3664}
3665
3666void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3667{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003668 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 +00003669 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003670
3671 try
3672 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003673 switch (shadertype)
3674 {
3675 case GL_VERTEX_SHADER:
3676 case GL_FRAGMENT_SHADER:
3677 break;
3678 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003679 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003680 }
3681
3682 switch (precisiontype)
3683 {
3684 case GL_LOW_FLOAT:
3685 case GL_MEDIUM_FLOAT:
3686 case GL_HIGH_FLOAT:
3687 // Assume IEEE 754 precision
3688 range[0] = 127;
3689 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003690 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003691 break;
3692 case GL_LOW_INT:
3693 case GL_MEDIUM_INT:
3694 case GL_HIGH_INT:
3695 // Some (most) hardware only supports single-precision floating-point numbers,
3696 // which can accurately represent integers up to +/-16777216
3697 range[0] = 24;
3698 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00003699 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003700 break;
3701 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003702 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6c785212010-03-30 03:36:17 +00003703 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003704 }
3705 catch(std::bad_alloc&)
3706 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003707 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003708 }
3709}
3710
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003711void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003712{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003713 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 +00003714 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003715
3716 try
3717 {
3718 if (bufsize < 0)
3719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003720 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003721 }
3722
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003723 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003724
3725 if (context)
3726 {
3727 gl::Shader *shaderObject = context->getShader(shader);
3728
3729 if (!shaderObject)
3730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003731 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00003732 }
3733
3734 shaderObject->getSource(bufsize, length, source);
3735 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003736 }
3737 catch(std::bad_alloc&)
3738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003740 }
3741}
3742
zmo@google.coma574f782011-10-03 21:45:23 +00003743void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3744{
3745 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3746 shader, bufsize, length, source);
3747
3748 try
3749 {
3750 if (bufsize < 0)
3751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003752 return gl::error(GL_INVALID_VALUE);
zmo@google.coma574f782011-10-03 21:45:23 +00003753 }
3754
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003755 gl::Context *context = gl::getNonLostContext();
zmo@google.coma574f782011-10-03 21:45:23 +00003756
3757 if (context)
3758 {
3759 gl::Shader *shaderObject = context->getShader(shader);
3760
3761 if (!shaderObject)
3762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003763 return gl::error(GL_INVALID_OPERATION);
zmo@google.coma574f782011-10-03 21:45:23 +00003764 }
3765
3766 shaderObject->getTranslatedSource(bufsize, length, source);
3767 }
3768 }
3769 catch(std::bad_alloc&)
3770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003771 return gl::error(GL_OUT_OF_MEMORY);
zmo@google.coma574f782011-10-03 21:45:23 +00003772 }
3773}
3774
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003775const GLubyte* __stdcall glGetString(GLenum name)
3776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003777 EVENT("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003778
3779 try
3780 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003781 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003782
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003783 switch (name)
3784 {
3785 case GL_VENDOR:
daniel@transgaming.coma0ce7e62011-01-25 14:47:16 +00003786 return (GLubyte*)"Google Inc.";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003787 case GL_RENDERER:
daniel@transgaming.comc23ff642011-08-16 20:28:45 +00003788 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003789 case GL_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003790 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003791 case GL_SHADING_LANGUAGE_VERSION:
daniel@transgaming.com1825d8e2012-08-27 16:25:29 +00003792 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " VERSION_STRING ")";
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793 case GL_EXTENSIONS:
daniel@transgaming.com3e4c6002010-05-05 18:50:13 +00003794 return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003795 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003796 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003797 }
3798 }
3799 catch(std::bad_alloc&)
3800 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003801 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803}
3804
3805void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3806{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003807 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 +00003808
3809 try
3810 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003811 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003812
3813 if (context)
3814 {
3815 gl::Texture *texture;
3816
3817 switch (target)
3818 {
3819 case GL_TEXTURE_2D:
3820 texture = context->getTexture2D();
3821 break;
3822 case GL_TEXTURE_CUBE_MAP:
3823 texture = context->getTextureCubeMap();
3824 break;
3825 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003826 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003827 }
3828
3829 switch (pname)
3830 {
3831 case GL_TEXTURE_MAG_FILTER:
3832 *params = (GLfloat)texture->getMagFilter();
3833 break;
3834 case GL_TEXTURE_MIN_FILTER:
3835 *params = (GLfloat)texture->getMinFilter();
3836 break;
3837 case GL_TEXTURE_WRAP_S:
3838 *params = (GLfloat)texture->getWrapS();
3839 break;
3840 case GL_TEXTURE_WRAP_T:
3841 *params = (GLfloat)texture->getWrapT();
3842 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003843 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3844 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3845 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003846 case GL_TEXTURE_USAGE_ANGLE:
3847 *params = (GLfloat)texture->getUsage();
3848 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003849 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3850 if (!context->supportsTextureFilterAnisotropy())
3851 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003852 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003853 }
3854 *params = (GLfloat)texture->getMaxAnisotropy();
3855 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003856 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003857 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003858 }
3859 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003860 }
3861 catch(std::bad_alloc&)
3862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003863 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003864 }
3865}
3866
3867void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3868{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003869 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 +00003870
3871 try
3872 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003873 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003874
3875 if (context)
3876 {
3877 gl::Texture *texture;
3878
3879 switch (target)
3880 {
3881 case GL_TEXTURE_2D:
3882 texture = context->getTexture2D();
3883 break;
3884 case GL_TEXTURE_CUBE_MAP:
3885 texture = context->getTextureCubeMap();
3886 break;
3887 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003888 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003889 }
3890
3891 switch (pname)
3892 {
3893 case GL_TEXTURE_MAG_FILTER:
3894 *params = texture->getMagFilter();
3895 break;
3896 case GL_TEXTURE_MIN_FILTER:
3897 *params = texture->getMinFilter();
3898 break;
3899 case GL_TEXTURE_WRAP_S:
3900 *params = texture->getWrapS();
3901 break;
3902 case GL_TEXTURE_WRAP_T:
3903 *params = texture->getWrapT();
3904 break;
daniel@transgaming.comd30bd0a2011-11-11 04:10:34 +00003905 case GL_TEXTURE_IMMUTABLE_FORMAT_EXT:
3906 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3907 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00003908 case GL_TEXTURE_USAGE_ANGLE:
3909 *params = texture->getUsage();
3910 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003911 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3912 if (!context->supportsTextureFilterAnisotropy())
3913 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003914 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00003915 }
3916 *params = (GLint)texture->getMaxAnisotropy();
3917 break;
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003918 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003919 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00003920 }
3921 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922 }
3923 catch(std::bad_alloc&)
3924 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003925 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003926 }
3927}
3928
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003929void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3930{
3931 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3932 program, location, bufSize, params);
3933
3934 try
3935 {
3936 if (bufSize < 0)
3937 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003938 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003939 }
3940
3941 gl::Context *context = gl::getNonLostContext();
3942
3943 if (context)
3944 {
3945 if (program == 0)
3946 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003947 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003948 }
3949
3950 gl::Program *programObject = context->getProgram(program);
3951
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003952 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003953 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003954 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003955 }
3956
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003957 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3958 if (!programBinary)
3959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003960 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003961 }
3962
3963 if (!programBinary->getUniformfv(location, &bufSize, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003964 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003965 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003966 }
3967 }
3968 }
3969 catch(std::bad_alloc&)
3970 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003971 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00003972 }
3973}
3974
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003975void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00003977 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003978
3979 try
3980 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00003981 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003982
3983 if (context)
3984 {
3985 if (program == 0)
3986 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003987 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003988 }
3989
3990 gl::Program *programObject = context->getProgram(program);
3991
daniel@transgaming.com716056c2012-07-24 18:38:59 +00003992 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003993 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00003994 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00003995 }
3996
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00003997 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3998 if (!programBinary)
3999 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004000 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004001 }
4002
4003 if (!programBinary->getUniformfv(location, NULL, params))
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004004 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004005 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004006 }
4007 }
4008 }
4009 catch(std::bad_alloc&)
4010 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004011 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004012 }
4013}
4014
4015void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
4016{
4017 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
4018 program, location, bufSize, params);
4019
4020 try
4021 {
4022 if (bufSize < 0)
4023 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004024 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004025 }
4026
4027 gl::Context *context = gl::getNonLostContext();
4028
4029 if (context)
4030 {
4031 if (program == 0)
4032 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004033 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004034 }
4035
4036 gl::Program *programObject = context->getProgram(program);
4037
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004038 if (!programObject || !programObject->isLinked())
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004039 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004040 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a849122011-11-12 03:18:00 +00004041 }
4042
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004043 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4044 if (!programBinary)
4045 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004046 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004047 }
4048
4049 if (!programBinary->getUniformiv(location, &bufSize, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004050 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004051 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004052 }
4053 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004054 }
4055 catch(std::bad_alloc&)
4056 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004057 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004058 }
4059}
4060
4061void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
4062{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004063 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004064
4065 try
4066 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004068
4069 if (context)
4070 {
4071 if (program == 0)
4072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004073 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004074 }
4075
4076 gl::Program *programObject = context->getProgram(program);
4077
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004078 if (!programObject || !programObject->isLinked())
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004079 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004080 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004081 }
4082
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004083 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
4084 if (!programBinary)
4085 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004086 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004087 }
4088
4089 if (!programBinary->getUniformiv(location, NULL, params))
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004090 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004091 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00004092 }
4093 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004094 }
4095 catch(std::bad_alloc&)
4096 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004097 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004098 }
4099}
4100
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004101int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004102{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004103 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004104
4105 try
4106 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004107 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004108
4109 if (strstr(name, "gl_") == name)
4110 {
4111 return -1;
4112 }
4113
4114 if (context)
4115 {
4116 gl::Program *programObject = context->getProgram(program);
4117
4118 if (!programObject)
4119 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004120 if (context->getShader(program))
4121 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004122 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004123 }
4124 else
4125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004126 return gl::error(GL_INVALID_VALUE, -1);
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00004127 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004128 }
4129
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004130 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
daniel@transgaming.com716056c2012-07-24 18:38:59 +00004131 if (!programObject->isLinked() || !programBinary)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004133 return gl::error(GL_INVALID_OPERATION, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004134 }
4135
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00004136 return programBinary->getUniformLocation(name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004137 }
4138 }
4139 catch(std::bad_alloc&)
4140 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004141 return gl::error(GL_OUT_OF_MEMORY, -1);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004142 }
4143
4144 return -1;
4145}
4146
4147void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4148{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004149 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004150
4151 try
4152 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004153 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004154
daniel@transgaming.come0078962010-04-15 20:45:08 +00004155 if (context)
4156 {
4157 if (index >= gl::MAX_VERTEX_ATTRIBS)
4158 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004159 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004160 }
4161
daniel@transgaming.com83921382011-01-08 05:46:00 +00004162 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004163
daniel@transgaming.come0078962010-04-15 20:45:08 +00004164 switch (pname)
4165 {
4166 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004167 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004168 break;
4169 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004170 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004171 break;
4172 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004173 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004174 break;
4175 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004176 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004177 break;
4178 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004179 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004180 break;
4181 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004182 *params = (GLfloat)attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004183 break;
4184 case GL_CURRENT_VERTEX_ATTRIB:
4185 for (int i = 0; i < 4; ++i)
4186 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004187 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004188 }
4189 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004190 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4191 *params = (GLfloat)attribState.mDivisor;
4192 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004193 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004194 }
4195 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004196 }
4197 catch(std::bad_alloc&)
4198 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004199 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004200 }
4201}
4202
4203void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4204{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004205 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004206
4207 try
4208 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004209 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004210
daniel@transgaming.come0078962010-04-15 20:45:08 +00004211 if (context)
4212 {
4213 if (index >= gl::MAX_VERTEX_ATTRIBS)
4214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004216 }
4217
daniel@transgaming.com83921382011-01-08 05:46:00 +00004218 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004219
daniel@transgaming.come0078962010-04-15 20:45:08 +00004220 switch (pname)
4221 {
4222 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com83921382011-01-08 05:46:00 +00004223 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004224 break;
4225 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004226 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004227 break;
4228 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004229 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004230 break;
4231 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004232 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00004233 break;
4234 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004235 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004236 break;
4237 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004238 *params = attribState.mBoundBuffer.id();
daniel@transgaming.come0078962010-04-15 20:45:08 +00004239 break;
4240 case GL_CURRENT_VERTEX_ATTRIB:
4241 for (int i = 0; i < 4; ++i)
4242 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004243 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00004244 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4245 }
4246 break;
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00004247 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE:
4248 *params = (GLint)attribState.mDivisor;
4249 break;
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004250 default: return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004251 }
4252 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004253 }
4254 catch(std::bad_alloc&)
4255 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004256 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004257 }
4258}
4259
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004260void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004261{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004262 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004263
4264 try
4265 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004266 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004267
daniel@transgaming.come0078962010-04-15 20:45:08 +00004268 if (context)
4269 {
4270 if (index >= gl::MAX_VERTEX_ATTRIBS)
4271 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004272 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004273 }
4274
4275 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4276 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004277 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come0078962010-04-15 20:45:08 +00004278 }
4279
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004280 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00004281 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004282 }
4283 catch(std::bad_alloc&)
4284 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004285 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004286 }
4287}
4288
4289void __stdcall glHint(GLenum target, GLenum mode)
4290{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004291 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004292
4293 try
4294 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004295 switch (mode)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004296 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004297 case GL_FASTEST:
4298 case GL_NICEST:
4299 case GL_DONT_CARE:
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004300 break;
4301 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004302 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004303 }
4304
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004305 gl::Context *context = gl::getNonLostContext();
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004306 switch (target)
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004307 {
alokp@chromium.orgd303ef92010-09-09 17:30:15 +00004308 case GL_GENERATE_MIPMAP_HINT:
4309 if (context) context->setGenerateMipmapHint(mode);
4310 break;
4311 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4312 if (context) context->setFragmentShaderDerivativeHint(mode);
4313 break;
4314 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004315 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00004316 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004317 }
4318 catch(std::bad_alloc&)
4319 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004320 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004321 }
4322}
4323
4324GLboolean __stdcall glIsBuffer(GLuint buffer)
4325{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004326 EVENT("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004327
4328 try
4329 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004330 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004331
4332 if (context && buffer)
4333 {
4334 gl::Buffer *bufferObject = context->getBuffer(buffer);
4335
4336 if (bufferObject)
4337 {
4338 return GL_TRUE;
4339 }
4340 }
4341 }
4342 catch(std::bad_alloc&)
4343 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004344 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004345 }
4346
4347 return GL_FALSE;
4348}
4349
4350GLboolean __stdcall glIsEnabled(GLenum cap)
4351{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004352 EVENT("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004353
4354 try
4355 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004356 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004357
4358 if (context)
4359 {
4360 switch (cap)
4361 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004362 case GL_CULL_FACE: return context->isCullFaceEnabled();
4363 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4364 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4365 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4366 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4367 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4368 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4369 case GL_BLEND: return context->isBlendEnabled();
4370 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004371 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004372 return gl::error(GL_INVALID_ENUM, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004373 }
4374 }
4375 }
4376 catch(std::bad_alloc&)
4377 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004378 return gl::error(GL_OUT_OF_MEMORY, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004379 }
4380
4381 return false;
4382}
4383
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004384GLboolean __stdcall glIsFenceNV(GLuint fence)
4385{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004386 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004387
4388 try
4389 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004390 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004391
4392 if (context)
4393 {
4394 gl::Fence *fenceObject = context->getFence(fence);
4395
4396 if (fenceObject == NULL)
4397 {
4398 return GL_FALSE;
4399 }
4400
4401 return fenceObject->isFence();
4402 }
4403 }
4404 catch(std::bad_alloc&)
4405 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004406 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004407 }
4408
4409 return GL_FALSE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004410}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004411
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004412GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4413{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004414 EVENT("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004415
4416 try
4417 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004418 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004419
4420 if (context && framebuffer)
4421 {
4422 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4423
4424 if (framebufferObject)
4425 {
4426 return GL_TRUE;
4427 }
4428 }
4429 }
4430 catch(std::bad_alloc&)
4431 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004432 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004433 }
4434
4435 return GL_FALSE;
4436}
4437
4438GLboolean __stdcall glIsProgram(GLuint program)
4439{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004440 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004441
4442 try
4443 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004444 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004445
4446 if (context && program)
4447 {
4448 gl::Program *programObject = context->getProgram(program);
4449
4450 if (programObject)
4451 {
4452 return GL_TRUE;
4453 }
4454 }
4455 }
4456 catch(std::bad_alloc&)
4457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004458 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004459 }
4460
4461 return GL_FALSE;
4462}
4463
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004464GLboolean __stdcall glIsQueryEXT(GLuint id)
4465{
4466 EVENT("(GLuint id = %d)", id);
4467
4468 try
4469 {
4470 if (id == 0)
4471 {
4472 return GL_FALSE;
4473 }
4474
4475 gl::Context *context = gl::getNonLostContext();
4476
4477 if (context)
4478 {
4479 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
4480
4481 if (queryObject)
4482 {
4483 return GL_TRUE;
4484 }
4485 }
4486 }
4487 catch(std::bad_alloc&)
4488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004489 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00004490 }
4491
4492 return GL_FALSE;
4493}
4494
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004495GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4496{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004497 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004498
4499 try
4500 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004501 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004502
4503 if (context && renderbuffer)
4504 {
4505 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4506
4507 if (renderbufferObject)
4508 {
4509 return GL_TRUE;
4510 }
4511 }
4512 }
4513 catch(std::bad_alloc&)
4514 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004515 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004516 }
4517
4518 return GL_FALSE;
4519}
4520
4521GLboolean __stdcall glIsShader(GLuint shader)
4522{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004523 EVENT("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004524
4525 try
4526 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004527 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528
4529 if (context && shader)
4530 {
4531 gl::Shader *shaderObject = context->getShader(shader);
4532
4533 if (shaderObject)
4534 {
4535 return GL_TRUE;
4536 }
4537 }
4538 }
4539 catch(std::bad_alloc&)
4540 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004541 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542 }
4543
4544 return GL_FALSE;
4545}
4546
4547GLboolean __stdcall glIsTexture(GLuint texture)
4548{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004549 EVENT("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004550
4551 try
4552 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004553 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004554
4555 if (context && texture)
4556 {
4557 gl::Texture *textureObject = context->getTexture(texture);
4558
4559 if (textureObject)
4560 {
4561 return GL_TRUE;
4562 }
4563 }
4564 }
4565 catch(std::bad_alloc&)
4566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004567 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004568 }
4569
4570 return GL_FALSE;
4571}
4572
4573void __stdcall glLineWidth(GLfloat width)
4574{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004575 EVENT("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004576
4577 try
4578 {
4579 if (width <= 0.0f)
4580 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004581 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004582 }
4583
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004584 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00004585
4586 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004587 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004588 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004589 }
4590 }
4591 catch(std::bad_alloc&)
4592 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004593 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004594 }
4595}
4596
4597void __stdcall glLinkProgram(GLuint program)
4598{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004599 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004600
4601 try
4602 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004603 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004604
4605 if (context)
4606 {
4607 gl::Program *programObject = context->getProgram(program);
4608
4609 if (!programObject)
4610 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004611 if (context->getShader(program))
4612 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004613 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004614 }
4615 else
4616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004617 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com277b7142010-04-13 03:26:44 +00004618 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619 }
4620
daniel@transgaming.com95d29422012-07-24 18:36:10 +00004621 context->linkProgram(program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004622 }
4623 }
4624 catch(std::bad_alloc&)
4625 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004626 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004627 }
4628}
4629
4630void __stdcall glPixelStorei(GLenum pname, GLint param)
4631{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004632 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004633
4634 try
4635 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004636 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004637
4638 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004639 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004640 switch (pname)
4641 {
4642 case GL_UNPACK_ALIGNMENT:
4643 if (param != 1 && param != 2 && param != 4 && param != 8)
4644 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004645 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004646 }
4647
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004648 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004649 break;
4650
4651 case GL_PACK_ALIGNMENT:
4652 if (param != 1 && param != 2 && param != 4 && param != 8)
4653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004654 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004655 }
4656
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004657 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004658 break;
4659
bsalomon@google.com56d46ab2011-11-23 14:53:10 +00004660 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4661 context->setPackReverseRowOrder(param != 0);
4662 break;
4663
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004664 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004665 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00004666 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004667 }
4668 }
4669 catch(std::bad_alloc&)
4670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004671 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004672 }
4673}
4674
4675void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4676{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004677 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004678
4679 try
4680 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004681 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.comaede6302010-04-29 03:35:48 +00004682
4683 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004684 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004685 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004686 }
4687 }
4688 catch(std::bad_alloc&)
4689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004690 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004691 }
4692}
4693
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004694void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4695 GLenum format, GLenum type, GLsizei bufSize,
4696 GLvoid *data)
4697{
4698 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4699 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4700 x, y, width, height, format, type, bufSize, data);
4701
4702 try
4703 {
4704 if (width < 0 || height < 0 || bufSize < 0)
4705 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004706 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004707 }
4708
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004709 gl::Context *context = gl::getNonLostContext();
4710
4711 if (context)
4712 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004713 GLenum currentFormat, currentType;
4714
4715 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4716 // and attempting to read back if that's the case is an error. The error will be registered
4717 // by getCurrentReadFormat.
4718 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4719 return;
4720
4721 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4722 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004723 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004724 }
4725
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004726 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4727 }
4728 }
4729 catch(std::bad_alloc&)
4730 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004731 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004732 }
4733}
4734
4735void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4736 GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004737{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004738 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004739 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004740 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004741
4742 try
4743 {
4744 if (width < 0 || height < 0)
4745 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004746 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004747 }
4748
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004749 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004750
4751 if (context)
4752 {
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004753 GLenum currentFormat, currentType;
4754
4755 // Failure in getCurrentReadFormatType indicates that no color attachment is currently bound,
4756 // and attempting to read back if that's the case is an error. The error will be registered
4757 // by getCurrentReadFormat.
4758 if (!context->getCurrentReadFormatType(&currentFormat, &currentType))
4759 return;
4760
4761 if (!(currentFormat == format && currentType == type) && !validReadFormatType(format, type))
4762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004763 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com42944b02012-09-27 17:45:57 +00004764 }
4765
daniel@transgaming.comb7915a52011-11-12 03:14:20 +00004766 context->readPixels(x, y, width, height, format, type, NULL, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004767 }
4768 }
4769 catch(std::bad_alloc&)
4770 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004771 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004772 }
4773}
4774
4775void __stdcall glReleaseShaderCompiler(void)
4776{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004777 EVENT("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004778
4779 try
4780 {
4781 gl::Shader::releaseCompiler();
4782 }
4783 catch(std::bad_alloc&)
4784 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004785 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004786 }
4787}
4788
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004789void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004790{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004791 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 +00004792 target, samples, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004793
4794 try
4795 {
4796 switch (target)
4797 {
4798 case GL_RENDERBUFFER:
4799 break;
4800 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004801 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004802 }
4803
daniel@transgaming.comedc19182010-10-15 17:57:55 +00004804 if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004805 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004806 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004807 }
4808
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004809 if (width < 0 || height < 0 || samples < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004811 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004812 }
4813
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004814 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004815
4816 if (context)
4817 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00004818 if (width > context->getMaximumRenderbufferDimension() ||
4819 height > context->getMaximumRenderbufferDimension() ||
4820 samples > context->getMaxSupportedSamples())
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004821 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004822 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004823 }
4824
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00004825 GLuint handle = context->getRenderbufferHandle();
4826 if (handle == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004827 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004828 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004829 }
4830
4831 switch (internalformat)
4832 {
4833 case GL_DEPTH_COMPONENT16:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004834 case GL_RGBA4:
4835 case GL_RGB5_A1:
4836 case GL_RGB565:
daniel@transgaming.com63977542010-08-24 19:21:02 +00004837 case GL_RGB8_OES:
4838 case GL_RGBA8_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004839 case GL_STENCIL_INDEX8:
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004840 case GL_DEPTH24_STENCIL8_OES:
daniel@transgaming.com70062c92012-11-28 19:32:30 +00004841 context->setRenderbufferStorage(width, height, internalformat, samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +00004842 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004843 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004844 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004845 }
4846 }
4847 }
4848 catch(std::bad_alloc&)
4849 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004850 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004851 }
4852}
4853
daniel@transgaming.com1f135d82010-08-24 19:20:36 +00004854void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4855{
4856 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4857}
4858
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004859void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4860{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004861 EVENT("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004862
4863 try
4864 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004865 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004866
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004867 if (context)
4868 {
daniel@transgaming.coma36f98e2010-05-18 18:51:09 +00004869 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004870 }
4871 }
4872 catch(std::bad_alloc&)
4873 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004874 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004875 }
4876}
4877
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004878void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4879{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004880 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004881
4882 try
4883 {
4884 if (condition != GL_ALL_COMPLETED_NV)
4885 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004886 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004887 }
4888
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004889 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004890
4891 if (context)
4892 {
4893 gl::Fence *fenceObject = context->getFence(fence);
4894
4895 if (fenceObject == NULL)
4896 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004897 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004898 }
4899
4900 fenceObject->setFence(condition);
4901 }
4902 }
4903 catch(std::bad_alloc&)
4904 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004905 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004906 }
daniel@transgaming.comfe208882010-09-01 15:47:57 +00004907}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00004908
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004909void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4910{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004911 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 +00004912
4913 try
4914 {
4915 if (width < 0 || height < 0)
4916 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004917 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918 }
4919
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004920 gl::Context* context = gl::getNonLostContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004921
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004922 if (context)
4923 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004924 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004925 }
4926 }
4927 catch(std::bad_alloc&)
4928 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004929 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004930 }
4931}
4932
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004933void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004934{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004935 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004936 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004937 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004938
4939 try
4940 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00004941 // No binary shader formats are supported.
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004942 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004943 }
4944 catch(std::bad_alloc&)
4945 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004946 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004947 }
4948}
4949
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004950void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004951{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004952 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 +00004953 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004954
4955 try
4956 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004957 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004958 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004959 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004960 }
4961
daniel@transgaming.com9d788502011-11-09 17:46:55 +00004962 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004963
4964 if (context)
4965 {
4966 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004967
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004968 if (!shaderObject)
4969 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004970 if (context->getProgram(shader))
4971 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004972 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004973 }
4974 else
4975 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004976 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00004977 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004978 }
4979
4980 shaderObject->setSource(count, string, length);
4981 }
4982 }
4983 catch(std::bad_alloc&)
4984 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00004985 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004986 }
4987}
4988
4989void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4990{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00004991 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004992}
4993
4994void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4995{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00004996 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 +00004997
4998 try
4999 {
5000 switch (face)
5001 {
5002 case GL_FRONT:
5003 case GL_BACK:
5004 case GL_FRONT_AND_BACK:
5005 break;
5006 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005007 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005008 }
5009
5010 switch (func)
5011 {
5012 case GL_NEVER:
5013 case GL_ALWAYS:
5014 case GL_LESS:
5015 case GL_LEQUAL:
5016 case GL_EQUAL:
5017 case GL_GEQUAL:
5018 case GL_GREATER:
5019 case GL_NOTEQUAL:
5020 break;
5021 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005022 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005023 }
5024
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005025 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005026
5027 if (context)
5028 {
5029 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5030 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005031 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005032 }
5033
5034 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5035 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005036 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005037 }
5038 }
5039 }
5040 catch(std::bad_alloc&)
5041 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005042 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005043 }
5044}
5045
5046void __stdcall glStencilMask(GLuint mask)
5047{
5048 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
5049}
5050
5051void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
5052{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005053 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005054
5055 try
5056 {
5057 switch (face)
5058 {
5059 case GL_FRONT:
5060 case GL_BACK:
5061 case GL_FRONT_AND_BACK:
5062 break;
5063 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005064 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005065 }
5066
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005067 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005068
5069 if (context)
5070 {
5071 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5072 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005073 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005074 }
5075
5076 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5077 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005078 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005079 }
5080 }
5081 }
5082 catch(std::bad_alloc&)
5083 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005084 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005085 }
5086}
5087
5088void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
5089{
5090 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
5091}
5092
5093void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
5094{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005095 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 +00005096 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005097
5098 try
5099 {
5100 switch (face)
5101 {
5102 case GL_FRONT:
5103 case GL_BACK:
5104 case GL_FRONT_AND_BACK:
5105 break;
5106 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005107 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005108 }
5109
5110 switch (fail)
5111 {
5112 case GL_ZERO:
5113 case GL_KEEP:
5114 case GL_REPLACE:
5115 case GL_INCR:
5116 case GL_DECR:
5117 case GL_INVERT:
5118 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005119 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005120 break;
5121 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005122 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005123 }
5124
5125 switch (zfail)
5126 {
5127 case GL_ZERO:
5128 case GL_KEEP:
5129 case GL_REPLACE:
5130 case GL_INCR:
5131 case GL_DECR:
5132 case GL_INVERT:
5133 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005134 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005135 break;
5136 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005137 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005138 }
5139
5140 switch (zpass)
5141 {
5142 case GL_ZERO:
5143 case GL_KEEP:
5144 case GL_REPLACE:
5145 case GL_INCR:
5146 case GL_DECR:
5147 case GL_INVERT:
5148 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005149 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005150 break;
5151 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005152 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005153 }
5154
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005155 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005156
5157 if (context)
5158 {
5159 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
5160 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005161 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005162 }
5163
5164 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
5165 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00005166 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005167 }
5168 }
5169 }
5170 catch(std::bad_alloc&)
5171 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005172 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005173 }
5174}
5175
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005176GLboolean __stdcall glTestFenceNV(GLuint fence)
5177{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005178 EVENT("(GLuint fence = %d)", fence);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005179
5180 try
5181 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005182 gl::Context *context = gl::getNonLostContext();
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005183
5184 if (context)
5185 {
5186 gl::Fence *fenceObject = context->getFence(fence);
5187
5188 if (fenceObject == NULL)
5189 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005190 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005191 }
5192
5193 return fenceObject->testFence();
5194 }
5195 }
5196 catch(std::bad_alloc&)
5197 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005198 gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005199 }
5200
5201 return GL_TRUE;
daniel@transgaming.comfe208882010-09-01 15:47:57 +00005202}
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00005203
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005204void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5205 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005206{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005207 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 +00005208 "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 +00005209 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005210
5211 try
5212 {
daniel@transgaming.com4f9ef0d2011-05-30 23:51:19 +00005213 if (!validImageSize(level, width, height))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005214 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005215 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005216 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00005217
apatrick@chromium.orge057c5d2012-01-26 19:18:24 +00005218 if (internalformat != GLint(format))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005219 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005220 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005221 }
5222
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005223 // validate <type> by itself (used as secondary key below)
5224 switch (type)
5225 {
5226 case GL_UNSIGNED_BYTE:
5227 case GL_UNSIGNED_SHORT_5_6_5:
5228 case GL_UNSIGNED_SHORT_4_4_4_4:
5229 case GL_UNSIGNED_SHORT_5_5_5_1:
5230 case GL_UNSIGNED_SHORT:
5231 case GL_UNSIGNED_INT:
5232 case GL_UNSIGNED_INT_24_8_OES:
5233 case GL_HALF_FLOAT_OES:
5234 case GL_FLOAT:
5235 break;
5236 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005237 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com6377e362012-06-05 19:49:55 +00005238 }
5239
5240 // validate <format> + <type> combinations
5241 // - invalid <format> -> sets INVALID_ENUM
5242 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005243 switch (format)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005244 {
5245 case GL_ALPHA:
5246 case GL_LUMINANCE:
5247 case GL_LUMINANCE_ALPHA:
5248 switch (type)
5249 {
5250 case GL_UNSIGNED_BYTE:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005251 case GL_FLOAT:
5252 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005253 break;
5254 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005255 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005256 }
5257 break;
5258 case GL_RGB:
5259 switch (type)
5260 {
5261 case GL_UNSIGNED_BYTE:
5262 case GL_UNSIGNED_SHORT_5_6_5:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005263 case GL_FLOAT:
5264 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005265 break;
5266 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005267 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005268 }
5269 break;
5270 case GL_RGBA:
5271 switch (type)
5272 {
5273 case GL_UNSIGNED_BYTE:
5274 case GL_UNSIGNED_SHORT_4_4_4_4:
5275 case GL_UNSIGNED_SHORT_5_5_5_1:
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005276 case GL_FLOAT:
5277 case GL_HALF_FLOAT_OES:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005278 break;
5279 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005280 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005281 }
5282 break;
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005283 case GL_BGRA_EXT:
5284 switch (type)
5285 {
5286 case GL_UNSIGNED_BYTE:
5287 break;
5288 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005289 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.coma9198d92010-08-08 04:49:56 +00005290 }
5291 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005292 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are handled below
5293 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
gman@chromium.org50c526d2011-08-10 05:19:44 +00005294 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5295 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
daniel@transgaming.com01868132010-08-24 19:21:17 +00005296 break;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005297 case GL_DEPTH_COMPONENT:
5298 switch (type)
5299 {
5300 case GL_UNSIGNED_SHORT:
5301 case GL_UNSIGNED_INT:
5302 break;
5303 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005304 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005305 }
5306 break;
5307 case GL_DEPTH_STENCIL_OES:
5308 switch (type)
5309 {
5310 case GL_UNSIGNED_INT_24_8_OES:
5311 break;
5312 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005313 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005314 }
5315 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005316 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005317 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005318 }
5319
5320 if (border != 0)
5321 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005322 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005323 }
5324
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005325 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005326
5327 if (context)
5328 {
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005329 if (level > context->getMaximumTextureLevel())
5330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com32b11442011-11-19 02:42:48 +00005332 }
5333
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005334 switch (target)
5335 {
5336 case GL_TEXTURE_2D:
5337 if (width > (context->getMaximumTextureDimension() >> level) ||
5338 height > (context->getMaximumTextureDimension() >> level))
5339 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005340 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005341 }
5342 break;
5343 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5344 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5345 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5346 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5347 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5348 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5349 if (width != height)
5350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005351 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005352 }
5353
5354 if (width > (context->getMaximumCubeTextureDimension() >> level) ||
5355 height > (context->getMaximumCubeTextureDimension() >> level))
5356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005357 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005358 }
5359 break;
5360 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005361 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005362 }
5363
gman@chromium.org50c526d2011-08-10 05:19:44 +00005364 switch (format) {
5365 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5366 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5367 if (context->supportsDXT1Textures())
daniel@transgaming.com01868132010-08-24 19:21:17 +00005368 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005369 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005370 }
5371 else
5372 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005373 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com01868132010-08-24 19:21:17 +00005374 }
gman@chromium.org50c526d2011-08-10 05:19:44 +00005375 break;
5376 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5377 if (context->supportsDXT3Textures())
5378 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005379 return gl::error(GL_INVALID_OPERATION);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005380 }
5381 else
5382 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005383 return gl::error(GL_INVALID_ENUM);
gman@chromium.org50c526d2011-08-10 05:19:44 +00005384 }
5385 break;
5386 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5387 if (context->supportsDXT5Textures())
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;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005396 case GL_DEPTH_COMPONENT:
5397 case GL_DEPTH_STENCIL_OES:
5398 if (!context->supportsDepthTextures())
5399 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005400 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005401 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005402 if (target != GL_TEXTURE_2D)
5403 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005404 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005405 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005406 // OES_depth_texture supports loading depth data and multiple levels,
5407 // but ANGLE_depth_texture does not
5408 if (pixels != NULL || level != 0)
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005409 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005410 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005411 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005412 break;
gman@chromium.org50c526d2011-08-10 05:19:44 +00005413 default:
5414 break;
daniel@transgaming.com01868132010-08-24 19:21:17 +00005415 }
5416
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005417 if (type == GL_FLOAT)
5418 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005419 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005420 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005421 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005422 }
5423 }
5424 else if (type == GL_HALF_FLOAT_OES)
5425 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005426 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005427 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005428 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005429 }
5430 }
5431
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005432 if (target == GL_TEXTURE_2D)
5433 {
5434 gl::Texture2D *texture = context->getTexture2D();
5435
5436 if (!texture)
5437 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005438 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005439 }
5440
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005441 if (texture->isImmutable())
5442 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005443 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005444 }
5445
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005446 texture->setImage(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005447 }
5448 else
5449 {
5450 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5451
5452 if (!texture)
5453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005454 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005455 }
5456
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005457 if (texture->isImmutable())
5458 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005459 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005460 }
5461
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005462 switch (target)
5463 {
5464 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005465 texture->setImagePosX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005466 break;
5467 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005468 texture->setImageNegX(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005469 break;
5470 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005471 texture->setImagePosY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005472 break;
5473 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005474 texture->setImageNegY(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005475 break;
5476 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005477 texture->setImagePosZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005478 break;
5479 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com8a0a2db2011-03-21 16:38:20 +00005480 texture->setImageNegZ(level, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005481 break;
5482 default: UNREACHABLE();
5483 }
5484 }
5485 }
5486 }
5487 catch(std::bad_alloc&)
5488 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005489 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005490 }
5491}
5492
5493void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
5494{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005495 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
5496
5497 try
5498 {
5499 gl::Context *context = gl::getNonLostContext();
5500
5501 if (context)
5502 {
5503 gl::Texture *texture;
5504
5505 switch (target)
5506 {
5507 case GL_TEXTURE_2D:
5508 texture = context->getTexture2D();
5509 break;
5510 case GL_TEXTURE_CUBE_MAP:
5511 texture = context->getTextureCubeMap();
5512 break;
5513 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005514 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005515 }
5516
5517 switch (pname)
5518 {
5519 case GL_TEXTURE_WRAP_S:
5520 if (!texture->setWrapS((GLenum)param))
5521 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005522 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005523 }
5524 break;
5525 case GL_TEXTURE_WRAP_T:
5526 if (!texture->setWrapT((GLenum)param))
5527 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005528 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005529 }
5530 break;
5531 case GL_TEXTURE_MIN_FILTER:
5532 if (!texture->setMinFilter((GLenum)param))
5533 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005534 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005535 }
5536 break;
5537 case GL_TEXTURE_MAG_FILTER:
5538 if (!texture->setMagFilter((GLenum)param))
5539 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005540 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005541 }
5542 break;
5543 case GL_TEXTURE_USAGE_ANGLE:
5544 if (!texture->setUsage((GLenum)param))
5545 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005546 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005547 }
5548 break;
5549 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5550 if (!context->supportsTextureFilterAnisotropy())
5551 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005552 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005553 }
5554 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5555 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005556 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005557 }
5558 break;
5559 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005560 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005561 }
5562 }
5563 }
5564 catch(std::bad_alloc&)
5565 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005566 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005567 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005568}
5569
5570void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5571{
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005572 glTexParameterf(target, pname, (GLfloat)*params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005573}
5574
5575void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5576{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005577 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005578
5579 try
5580 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005581 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005582
5583 if (context)
5584 {
5585 gl::Texture *texture;
5586
5587 switch (target)
5588 {
5589 case GL_TEXTURE_2D:
5590 texture = context->getTexture2D();
5591 break;
5592 case GL_TEXTURE_CUBE_MAP:
5593 texture = context->getTextureCubeMap();
5594 break;
5595 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005596 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005597 }
5598
5599 switch (pname)
5600 {
5601 case GL_TEXTURE_WRAP_S:
5602 if (!texture->setWrapS((GLenum)param))
5603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005604 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005605 }
5606 break;
5607 case GL_TEXTURE_WRAP_T:
5608 if (!texture->setWrapT((GLenum)param))
5609 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005610 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005611 }
5612 break;
5613 case GL_TEXTURE_MIN_FILTER:
5614 if (!texture->setMinFilter((GLenum)param))
5615 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005616 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005617 }
5618 break;
5619 case GL_TEXTURE_MAG_FILTER:
5620 if (!texture->setMagFilter((GLenum)param))
5621 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005622 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005623 }
5624 break;
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005625 case GL_TEXTURE_USAGE_ANGLE:
5626 if (!texture->setUsage((GLenum)param))
5627 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005628 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com7d18c172011-11-11 04:18:21 +00005629 }
5630 break;
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005631 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5632 if (!context->supportsTextureFilterAnisotropy())
5633 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005634 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005635 }
5636 if (!texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()))
5637 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005638 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com07ab8412012-07-12 15:17:09 +00005639 }
5640 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005641 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005642 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005643 }
5644 }
5645 }
5646 catch(std::bad_alloc&)
5647 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005648 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005649 }
5650}
5651
5652void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5653{
5654 glTexParameteri(target, pname, *params);
5655}
5656
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005657void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5658{
5659 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5660 target, levels, internalformat, width, height);
5661
5662 try
5663 {
5664 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_CUBE_MAP)
5665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005666 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005667 }
5668
5669 if (width < 1 || height < 1 || levels < 1)
5670 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005671 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005672 }
5673
5674 if (target == GL_TEXTURE_CUBE_MAP && width != height)
5675 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005676 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005677 }
5678
daniel@transgaming.com45b888a2011-11-16 03:56:39 +00005679 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005680 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005681 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005682 }
5683
5684 GLenum format = gl::ExtractFormat(internalformat);
5685 GLenum type = gl::ExtractType(internalformat);
5686
5687 if (format == GL_NONE || type == GL_NONE)
5688 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005689 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005690 }
5691
5692 gl::Context *context = gl::getNonLostContext();
5693
5694 if (context)
5695 {
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005696 switch (target)
5697 {
5698 case GL_TEXTURE_2D:
5699 if (width > context->getMaximumTextureDimension() ||
5700 height > context->getMaximumTextureDimension())
5701 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005702 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005703 }
5704 break;
5705 case GL_TEXTURE_CUBE_MAP:
5706 if (width > context->getMaximumCubeTextureDimension() ||
5707 height > context->getMaximumCubeTextureDimension())
5708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005709 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005710 }
5711 break;
5712 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005713 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com21f05d72011-11-29 19:42:28 +00005714 }
5715
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005716 if (levels != 1 && !context->supportsNonPower2Texture())
5717 {
5718 if (!gl::isPow2(width) || !gl::isPow2(height))
5719 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005720 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005721 }
5722 }
5723
daniel@transgaming.come1077362011-11-11 04:16:50 +00005724 switch (internalformat)
5725 {
5726 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
5727 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
5728 if (!context->supportsDXT1Textures())
5729 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005730 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005731 }
5732 break;
5733 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
5734 if (!context->supportsDXT3Textures())
5735 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005736 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005737 }
5738 break;
5739 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
5740 if (!context->supportsDXT5Textures())
5741 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005742 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.come1077362011-11-11 04:16:50 +00005743 }
5744 break;
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005745 case GL_RGBA32F_EXT:
5746 case GL_RGB32F_EXT:
5747 case GL_ALPHA32F_EXT:
5748 case GL_LUMINANCE32F_EXT:
5749 case GL_LUMINANCE_ALPHA32F_EXT:
5750 if (!context->supportsFloat32Textures())
5751 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005752 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.comff941aa2011-11-11 04:17:09 +00005753 }
5754 break;
5755 case GL_RGBA16F_EXT:
5756 case GL_RGB16F_EXT:
5757 case GL_ALPHA16F_EXT:
5758 case GL_LUMINANCE16F_EXT:
5759 case GL_LUMINANCE_ALPHA16F_EXT:
5760 if (!context->supportsFloat16Textures())
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;
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005765 case GL_DEPTH_COMPONENT16:
5766 case GL_DEPTH_COMPONENT32_OES:
5767 case GL_DEPTH24_STENCIL8_OES:
5768 if (!context->supportsDepthTextures())
5769 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005770 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005771 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005772 if (target != GL_TEXTURE_2D)
5773 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005774 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005775 }
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005776 // ANGLE_depth_texture only supports 1-level textures
5777 if (levels != 1)
5778 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005779 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com797924b2012-06-05 19:50:01 +00005780 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005781 break;
5782 default:
5783 break;
daniel@transgaming.come1077362011-11-11 04:16:50 +00005784 }
5785
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005786 if (target == GL_TEXTURE_2D)
5787 {
5788 gl::Texture2D *texture = context->getTexture2D();
5789
5790 if (!texture || texture->id() == 0)
5791 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005792 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005793 }
5794
5795 if (texture->isImmutable())
5796 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005797 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005798 }
5799
5800 texture->storage(levels, internalformat, width, height);
5801 }
5802 else if (target == GL_TEXTURE_CUBE_MAP)
5803 {
5804 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5805
5806 if (!texture || texture->id() == 0)
5807 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005808 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005809 }
5810
5811 if (texture->isImmutable())
5812 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005813 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005814 }
5815
5816 texture->storage(levels, internalformat, width);
5817 }
5818 else UNREACHABLE();
5819 }
5820 }
5821 catch(std::bad_alloc&)
5822 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005823 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00005824 }
5825}
5826
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005827void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5828 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005829{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005830 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005831 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005832 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005833 target, level, xoffset, yoffset, width, height, format, type, pixels);
5834
5835 try
5836 {
apatrick@chromium.org551022e2012-01-23 19:56:54 +00005837 if (!gl::IsInternalTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005838 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005839 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005840 }
5841
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005842 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005843 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005844 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005845 }
5846
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005847 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005849 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005850 }
5851
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005852 if (!checkTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005853 {
daniel@transgaming.com8833dd22012-06-05 19:49:58 +00005854 return; // error is set by helper function
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005855 }
5856
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005857 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005858
5859 if (context)
5860 {
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005861 if (level > context->getMaximumTextureLevel())
5862 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005863 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com5d752f22010-10-07 13:37:20 +00005864 }
5865
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005866 if (format == GL_FLOAT)
5867 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005868 if (!context->supportsFloat32Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005869 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005870 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005871 }
5872 }
5873 else if (format == GL_HALF_FLOAT_OES)
5874 {
daniel@transgaming.combbeffbb2011-11-09 17:46:11 +00005875 if (!context->supportsFloat16Textures())
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005876 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005877 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005878 }
5879 }
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005880 else if (gl::IsDepthTexture(format))
5881 {
5882 if (!context->supportsDepthTextures())
5883 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005884 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005885 }
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005886 if (target != GL_TEXTURE_2D)
5887 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005888 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com0c854682012-05-31 01:14:11 +00005889 }
5890 // OES_depth_texture supports loading depth data, but ANGLE_depth_texture does not
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005891 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com835a95a2012-05-31 01:14:07 +00005892 }
daniel@transgaming.com0a337e92010-08-28 17:38:27 +00005893
daniel@transgaming.com1d2d3c42012-05-31 01:14:15 +00005894 if (width == 0 || height == 0 || pixels == NULL)
5895 {
5896 return;
5897 }
5898
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005899 if (target == GL_TEXTURE_2D)
5900 {
5901 gl::Texture2D *texture = context->getTexture2D();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005902 if (validateSubImageParams2D(false, width, height, xoffset, yoffset, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005903 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005904 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005905 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005906 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00005907 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005908 {
5909 gl::TextureCubeMap *texture = context->getTextureCubeMap();
daniel@transgaming.com6452adf2012-10-17 18:22:35 +00005910 if (validateSubImageParamsCube(false, width, height, xoffset, yoffset, target, level, format, type, texture))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005911 {
daniel@transgaming.com343373a2011-11-29 19:42:32 +00005912 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005913 }
daniel@transgaming.com00c75962010-03-11 20:36:15 +00005914 }
5915 else
5916 {
5917 UNREACHABLE();
5918 }
5919 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005920 }
5921 catch(std::bad_alloc&)
5922 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005923 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005924 }
5925}
5926
5927void __stdcall glUniform1f(GLint location, GLfloat x)
5928{
5929 glUniform1fv(location, 1, &x);
5930}
5931
5932void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5933{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005934 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005935
5936 try
5937 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005938 if (count < 0)
5939 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005940 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005941 }
5942
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005943 if (location == -1)
5944 {
5945 return;
5946 }
5947
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005948 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005949
5950 if (context)
5951 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005952 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005953 if (!programBinary)
5954 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005955 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005956 }
5957
5958 if (!programBinary->setUniform1fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005959 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005960 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005961 }
5962 }
5963 }
5964 catch(std::bad_alloc&)
5965 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005966 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005967 }
5968}
5969
5970void __stdcall glUniform1i(GLint location, GLint x)
5971{
5972 glUniform1iv(location, 1, &x);
5973}
5974
5975void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5976{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00005977 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005978
5979 try
5980 {
5981 if (count < 0)
5982 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005983 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005984 }
5985
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00005986 if (location == -1)
5987 {
5988 return;
5989 }
5990
daniel@transgaming.com9d788502011-11-09 17:46:55 +00005991 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005992
5993 if (context)
5994 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00005995 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005996 if (!programBinary)
5997 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00005998 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00005999 }
6000
6001 if (!programBinary->setUniform1iv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006002 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006003 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006004 }
6005 }
6006 }
6007 catch(std::bad_alloc&)
6008 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006009 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006010 }
6011}
6012
6013void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
6014{
6015 GLfloat xy[2] = {x, y};
6016
6017 glUniform2fv(location, 1, (GLfloat*)&xy);
6018}
6019
6020void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
6021{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006022 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006023
6024 try
6025 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006026 if (count < 0)
6027 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006028 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006029 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006030
6031 if (location == -1)
6032 {
6033 return;
6034 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006035
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006036 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006037
6038 if (context)
6039 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006040 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006041 if (!programBinary)
6042 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006043 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006044 }
6045
6046 if (!programBinary->setUniform2fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006047 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006048 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006049 }
6050 }
6051 }
6052 catch(std::bad_alloc&)
6053 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006054 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006055 }
6056}
6057
6058void __stdcall glUniform2i(GLint location, GLint x, GLint y)
6059{
6060 GLint xy[4] = {x, y};
6061
6062 glUniform2iv(location, 1, (GLint*)&xy);
6063}
6064
6065void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
6066{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006067 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006068
6069 try
6070 {
6071 if (count < 0)
6072 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006073 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006074 }
6075
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006076 if (location == -1)
6077 {
6078 return;
6079 }
6080
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006081 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006082
6083 if (context)
6084 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006085 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006086 if (!programBinary)
6087 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006088 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006089 }
6090
6091 if (!programBinary->setUniform2iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006092 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006093 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006094 }
6095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006096 }
6097 catch(std::bad_alloc&)
6098 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006099 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006100 }
6101}
6102
6103void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6104{
6105 GLfloat xyz[3] = {x, y, z};
6106
6107 glUniform3fv(location, 1, (GLfloat*)&xyz);
6108}
6109
6110void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
6111{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006112 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006113
6114 try
6115 {
6116 if (count < 0)
6117 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006118 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006119 }
6120
6121 if (location == -1)
6122 {
6123 return;
6124 }
6125
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006126 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006127
6128 if (context)
6129 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006130 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006131 if (!programBinary)
6132 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006133 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006134 }
6135
6136 if (!programBinary->setUniform3fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006137 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006138 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006139 }
6140 }
6141 }
6142 catch(std::bad_alloc&)
6143 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006144 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006145 }
6146}
6147
6148void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
6149{
6150 GLint xyz[3] = {x, y, z};
6151
6152 glUniform3iv(location, 1, (GLint*)&xyz);
6153}
6154
6155void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
6156{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006157 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006158
6159 try
6160 {
6161 if (count < 0)
6162 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006163 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006164 }
6165
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006166 if (location == -1)
6167 {
6168 return;
6169 }
6170
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006171 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006172
6173 if (context)
6174 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006175 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006176 if (!programBinary)
6177 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006178 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006179 }
6180
6181 if (!programBinary->setUniform3iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006182 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006183 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006184 }
6185 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006186 }
6187 catch(std::bad_alloc&)
6188 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006189 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006190 }
6191}
6192
6193void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6194{
6195 GLfloat xyzw[4] = {x, y, z, w};
6196
6197 glUniform4fv(location, 1, (GLfloat*)&xyzw);
6198}
6199
6200void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
6201{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006202 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006203
6204 try
6205 {
6206 if (count < 0)
6207 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006208 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006209 }
6210
6211 if (location == -1)
6212 {
6213 return;
6214 }
6215
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006216 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006217
6218 if (context)
6219 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006220 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006221 if (!programBinary)
6222 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006223 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006224 }
6225
6226 if (!programBinary->setUniform4fv(location, count, v))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006227 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006228 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006229 }
6230 }
6231 }
6232 catch(std::bad_alloc&)
6233 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006234 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006235 }
6236}
6237
6238void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6239{
6240 GLint xyzw[4] = {x, y, z, w};
6241
6242 glUniform4iv(location, 1, (GLint*)&xyzw);
6243}
6244
6245void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
6246{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006247 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006248
6249 try
6250 {
6251 if (count < 0)
6252 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006253 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006254 }
6255
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006256 if (location == -1)
6257 {
6258 return;
6259 }
6260
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006261 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006262
6263 if (context)
6264 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006265 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006266 if (!programBinary)
6267 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006268 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006269 }
6270
6271 if (!programBinary->setUniform4iv(location, count, v))
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006272 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006273 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00006274 }
6275 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006276 }
6277 catch(std::bad_alloc&)
6278 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006279 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006280 }
6281}
6282
6283void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6284{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006285 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006286 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006287
6288 try
6289 {
6290 if (count < 0 || transpose != GL_FALSE)
6291 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006292 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006293 }
6294
6295 if (location == -1)
6296 {
6297 return;
6298 }
6299
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006300 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006301
6302 if (context)
6303 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006304 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006305 if (!programBinary)
6306 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006307 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006308 }
6309
6310 if (!programBinary->setUniformMatrix2fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006311 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006312 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006313 }
6314 }
6315 }
6316 catch(std::bad_alloc&)
6317 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006318 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006319 }
6320}
6321
6322void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6323{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006324 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006325 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006326
6327 try
6328 {
6329 if (count < 0 || transpose != GL_FALSE)
6330 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006331 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006332 }
6333
6334 if (location == -1)
6335 {
6336 return;
6337 }
6338
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006339 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006340
6341 if (context)
6342 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006343 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006344 if (!programBinary)
6345 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006346 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006347 }
6348
6349 if (!programBinary->setUniformMatrix3fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006350 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006351 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006352 }
6353 }
6354 }
6355 catch(std::bad_alloc&)
6356 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006357 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006358 }
6359}
6360
6361void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6362{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006363 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006364 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006365
6366 try
6367 {
6368 if (count < 0 || transpose != GL_FALSE)
6369 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006370 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006371 }
6372
6373 if (location == -1)
6374 {
6375 return;
6376 }
6377
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006378 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006379
6380 if (context)
6381 {
daniel@transgaming.com62a28462012-07-24 18:33:59 +00006382 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006383 if (!programBinary)
6384 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006385 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.orge2a59bb2012-06-07 21:09:53 +00006386 }
6387
6388 if (!programBinary->setUniformMatrix4fv(location, count, value))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006389 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006390 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006391 }
6392 }
6393 }
6394 catch(std::bad_alloc&)
6395 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006396 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006397 }
6398}
6399
6400void __stdcall glUseProgram(GLuint program)
6401{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006402 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006403
6404 try
6405 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006406 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006407
6408 if (context)
6409 {
6410 gl::Program *programObject = context->getProgram(program);
6411
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006412 if (!programObject && program != 0)
6413 {
6414 if (context->getShader(program))
6415 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006416 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006417 }
6418 else
6419 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006420 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comc8478202010-04-13 19:53:35 +00006421 }
6422 }
6423
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006424 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006425 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006426 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006427 }
6428
6429 context->useProgram(program);
6430 }
6431 }
6432 catch(std::bad_alloc&)
6433 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006434 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006435 }
6436}
6437
6438void __stdcall glValidateProgram(GLuint program)
6439{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006440 EVENT("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006441
6442 try
6443 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006444 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006445
6446 if (context)
6447 {
6448 gl::Program *programObject = context->getProgram(program);
6449
6450 if (!programObject)
6451 {
6452 if (context->getShader(program))
6453 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006454 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006455 }
6456 else
6457 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006458 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006459 }
6460 }
6461
apatrick@chromium.org253b8d22012-06-22 19:27:21 +00006462 programObject->validate();
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00006463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006464 }
6465 catch(std::bad_alloc&)
6466 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006467 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006468 }
6469}
6470
6471void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
6472{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006473 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006474
6475 try
6476 {
6477 if (index >= gl::MAX_VERTEX_ATTRIBS)
6478 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006479 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006480 }
6481
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006482 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006483
6484 if (context)
6485 {
6486 GLfloat vals[4] = { x, 0, 0, 1 };
6487 context->setVertexAttrib(index, vals);
6488 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006489 }
6490 catch(std::bad_alloc&)
6491 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006492 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006493 }
6494}
6495
6496void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
6497{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006498 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006499
6500 try
6501 {
6502 if (index >= gl::MAX_VERTEX_ATTRIBS)
6503 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006504 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006505 }
6506
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006507 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006508
6509 if (context)
6510 {
6511 GLfloat vals[4] = { values[0], 0, 0, 1 };
6512 context->setVertexAttrib(index, vals);
6513 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006514 }
6515 catch(std::bad_alloc&)
6516 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006517 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006518 }
6519}
6520
6521void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6522{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006523 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006524
6525 try
6526 {
6527 if (index >= gl::MAX_VERTEX_ATTRIBS)
6528 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006529 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006530 }
6531
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006532 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006533
6534 if (context)
6535 {
6536 GLfloat vals[4] = { x, y, 0, 1 };
6537 context->setVertexAttrib(index, vals);
6538 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006539 }
6540 catch(std::bad_alloc&)
6541 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006542 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006543 }
6544}
6545
6546void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
6547{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006548 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006549
6550 try
6551 {
6552 if (index >= gl::MAX_VERTEX_ATTRIBS)
6553 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006554 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006555 }
6556
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006557 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006558
6559 if (context)
6560 {
6561 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6562 context->setVertexAttrib(index, vals);
6563 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006564 }
6565 catch(std::bad_alloc&)
6566 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006567 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006568 }
6569}
6570
6571void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6572{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006573 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 +00006574
6575 try
6576 {
6577 if (index >= gl::MAX_VERTEX_ATTRIBS)
6578 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006579 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006580 }
6581
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006582 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006583
6584 if (context)
6585 {
6586 GLfloat vals[4] = { x, y, z, 1 };
6587 context->setVertexAttrib(index, vals);
6588 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006589 }
6590 catch(std::bad_alloc&)
6591 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006592 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006593 }
6594}
6595
6596void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
6597{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006598 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006599
6600 try
6601 {
6602 if (index >= gl::MAX_VERTEX_ATTRIBS)
6603 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006604 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006605 }
6606
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006607 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006608
6609 if (context)
6610 {
6611 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6612 context->setVertexAttrib(index, vals);
6613 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006614 }
6615 catch(std::bad_alloc&)
6616 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006617 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006618 }
6619}
6620
6621void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6622{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006623 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 +00006624
6625 try
6626 {
6627 if (index >= gl::MAX_VERTEX_ATTRIBS)
6628 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006629 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006630 }
6631
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006632 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006633
6634 if (context)
6635 {
6636 GLfloat vals[4] = { x, y, z, w };
6637 context->setVertexAttrib(index, vals);
6638 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006639 }
6640 catch(std::bad_alloc&)
6641 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006642 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006643 }
6644}
6645
6646void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
6647{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006648 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006649
6650 try
6651 {
6652 if (index >= gl::MAX_VERTEX_ATTRIBS)
6653 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006654 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006655 }
6656
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006657 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00006658
6659 if (context)
6660 {
6661 context->setVertexAttrib(index, values);
6662 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006663 }
6664 catch(std::bad_alloc&)
6665 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006666 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006667 }
6668}
6669
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006670void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
6671{
6672 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
6673
6674 try
6675 {
6676 if (index >= gl::MAX_VERTEX_ATTRIBS)
6677 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006678 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006679 }
6680
6681 gl::Context *context = gl::getNonLostContext();
6682
6683 if (context)
6684 {
6685 context->setVertexAttribDivisor(index, divisor);
6686 }
6687 }
6688 catch(std::bad_alloc&)
6689 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006690 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.comd2820bf2012-01-27 15:38:48 +00006691 }
6692}
6693
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006694void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006695{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006696 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006697 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006698 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006699
6700 try
6701 {
6702 if (index >= gl::MAX_VERTEX_ATTRIBS)
6703 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006704 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006705 }
6706
6707 if (size < 1 || size > 4)
6708 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006709 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006710 }
6711
6712 switch (type)
6713 {
6714 case GL_BYTE:
6715 case GL_UNSIGNED_BYTE:
6716 case GL_SHORT:
6717 case GL_UNSIGNED_SHORT:
6718 case GL_FIXED:
6719 case GL_FLOAT:
6720 break;
6721 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006722 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006723 }
6724
6725 if (stride < 0)
6726 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006727 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006728 }
6729
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006730 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006731
6732 if (context)
6733 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00006734 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006735 }
6736 }
6737 catch(std::bad_alloc&)
6738 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006739 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006740 }
6741}
6742
6743void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
6744{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006745 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 +00006746
6747 try
6748 {
6749 if (width < 0 || height < 0)
6750 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006751 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006752 }
6753
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006754 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006755
6756 if (context)
6757 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00006758 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006759 }
6760 }
6761 catch(std::bad_alloc&)
6762 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006763 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006764 }
6765}
6766
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006767void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6768 GLbitfield mask, GLenum filter)
6769{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006770 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006771 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6772 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6773 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6774
6775 try
6776 {
6777 switch (filter)
6778 {
6779 case GL_NEAREST:
6780 break;
6781 default:
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006782 return gl::error(GL_INVALID_ENUM);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006783 }
6784
6785 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6786 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006787 return gl::error(GL_INVALID_VALUE);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006788 }
6789
6790 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6791 {
6792 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006793 return gl::error(GL_INVALID_OPERATION);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006794 }
6795
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006796 gl::Context *context = gl::getNonLostContext();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006797
6798 if (context)
6799 {
6800 if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
6801 {
6802 ERR("Blits with the same source and destination framebuffer are 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
6806 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
6807 }
6808 }
6809 catch(std::bad_alloc&)
6810 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006811 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +00006812 }
6813}
6814
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006815void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6816 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006817{
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +00006818 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00006819 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00006820 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006821 target, level, internalformat, width, height, depth, border, format, type, pixels);
6822
6823 try
6824 {
6825 UNIMPLEMENTED(); // FIXME
6826 }
6827 catch(std::bad_alloc&)
6828 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006829 return gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006830 }
6831}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006832
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006833void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
6834 GLenum *binaryFormat, void *binary)
6835{
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006836 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 +00006837 program, bufSize, length, binaryFormat, binary);
6838
6839 try
6840 {
6841 gl::Context *context = gl::getNonLostContext();
6842
6843 if (context)
6844 {
6845 gl::Program *programObject = context->getProgram(program);
6846
daniel@transgaming.com716056c2012-07-24 18:38:59 +00006847 if (!programObject || !programObject->isLinked())
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006848 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006849 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006850 }
6851
6852 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
6853
6854 if (!programBinary)
6855 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006856 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006857 }
6858
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006859 if (!programBinary->save(binary, bufSize, length))
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006860 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006861 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006862 }
apatrick@chromium.org90080e32012-07-09 22:15:33 +00006863
6864 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006865 }
6866 }
6867 catch(std::bad_alloc&)
6868 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006869 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006870 }
6871}
6872
6873void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
6874 const void *binary, GLint length)
6875{
6876 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
6877 program, binaryFormat, binary, length);
6878
6879 try
6880 {
6881 gl::Context *context = gl::getNonLostContext();
6882
6883 if (context)
6884 {
6885 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
6886 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006887 return gl::error(GL_INVALID_ENUM);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006888 }
6889
6890 gl::Program *programObject = context->getProgram(program);
6891
6892 if (!programObject)
6893 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006894 return gl::error(GL_INVALID_OPERATION);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006895 }
6896
daniel@transgaming.com95d29422012-07-24 18:36:10 +00006897 context->setProgramBinary(program, binary, length);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006898 }
6899 }
6900 catch(std::bad_alloc&)
6901 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006902 return gl::error(GL_OUT_OF_MEMORY);
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006903 }
6904}
6905
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006906__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
6907{
6908 struct Extension
6909 {
6910 const char *name;
6911 __eglMustCastToProperFunctionPointerType address;
6912 };
6913
6914 static const Extension glExtensions[] =
6915 {
6916 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
daniel@transgaming.com01868132010-08-24 19:21:17 +00006917 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
daniel@transgaming.com1fe96c92011-01-14 15:08:44 +00006918 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
apatrick@chromium.orgd3bd0ad2010-08-30 18:55:36 +00006919 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
6920 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
6921 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
6922 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
6923 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
6924 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
6925 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
zmo@google.coma574f782011-10-03 21:45:23 +00006926 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
daniel@transgaming.com0bd1f2f2011-11-11 04:19:03 +00006927 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
daniel@transgaming.com709ed112011-11-12 03:18:10 +00006928 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
6929 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
6930 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
6931 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
daniel@transgaming.com86bdb822012-01-20 18:24:39 +00006932 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
6933 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
6934 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
6935 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
6936 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
6937 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
6938 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
daniel@transgaming.comdce02fd2012-01-27 15:39:51 +00006939 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
6940 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
6941 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
apatrick@chromium.org3ce8dbc2012-06-08 17:52:30 +00006942 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
6943 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES}, };
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006944
shannon.woods@transgaming.comd438fd42013-02-28 23:17:45 +00006945 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00006946 {
6947 if (strcmp(procname, glExtensions[ext].name) == 0)
6948 {
6949 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
6950 }
6951 }
6952
6953 return NULL;
6954}
6955
daniel@transgaming.com17f548c2011-11-09 17:47:02 +00006956// Non-public functions used by EGL
6957
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006958bool __stdcall glBindTexImage(egl::Surface *surface)
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006959{
6960 EVENT("(egl::Surface* surface = 0x%0.8p)",
6961 surface);
6962
6963 try
6964 {
daniel@transgaming.com9d788502011-11-09 17:46:55 +00006965 gl::Context *context = gl::getNonLostContext();
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006966
6967 if (context)
6968 {
6969 gl::Texture2D *textureObject = context->getTexture2D();
6970
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006971 if (textureObject->isImmutable())
6972 {
6973 return false;
6974 }
6975
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006976 if (textureObject)
6977 {
6978 textureObject->bindTexImage(surface);
6979 }
6980 }
6981 }
6982 catch(std::bad_alloc&)
6983 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +00006984 return gl::error(GL_OUT_OF_MEMORY, false);
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006985 }
daniel@transgaming.com64a0fb22011-11-11 04:10:40 +00006986
6987 return true;
jbauman@chromium.orgae345802011-03-30 22:04:25 +00006988}
6989
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00006990}